Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


94 / 3841 ページ ←次へ | 前へ→

【80589】Re:ブックモジュール global オブジェク...
お礼  みも  - 19/3/15(金) 18:17 -

引用なし
パスワード
   ▼γ さん:
>> Set KM = Workbooks("A").Worksheets("K")
>のWorkbooks("A")というのはこれでいいのですか?
>
>Bookを指定しなくてもActiveWorkbookと解釈されるはずなので記載しなくてよいし、
>明示的に書くなら、
>・Thisworkbookもしくは、
>・Workbooks("A.xlsm")

はじめにエラーが出た際、ブックも指定しないと認識してもらえないかと思い
上記の形でコードを書きました。
本来は仰っておられる形で書くべきかもしれません。
初歩的なところで申し訳ありません。


>
>こちらにはVBEのコードペインからコピーペイストして
>投稿されているのでしょうか?
>いやほんとうは、これとは別のコードで実行しています、
>というのは無しでお願いしたい。

コピーペーストしております。
ただ、シート名ファイル名は実際にはアルファベット1文字ではありません。すみません。
KM,HM や、最終行に関しては本当にこれを使用しております。


>ちなみに、
>Set KM = Sheet1
>などとしてテスト実行しましたが、特にエラーは発生しませんね。

そのような書き方もできるのですね。
アドバイスありがとうごさいます。

エラーは実は解決させて頂きましたので今後教えて頂いた
書き方も活用させて頂きます。

お忙しいところ、ありがとうございました。
・ツリー全体表示

【80588】Re:ブックモジュール global オブジェク...
お礼  みも  - 19/3/15(金) 18:10 -

引用なし
パスワード
   ▼マナ さん:

>
>
>KM.Rows.Count
>
>だとどうなるでしょうか?

ご回答ありがとうごさいます。
実は、別の問題であったようで解決いたしました。

迅速にアドバイス頂きありがとうごさいました。
・ツリー全体表示

【80587】Re:ブックモジュール global オブジェク...
お礼  みも  - 19/3/15(金) 18:09 -

引用なし
パスワード
   ▼よろずや さん:
>>書く場所が悪いのか
>Workbook_WindowActivateイベントで実行させるのが吉。

ご回答ありがとうございます。
テストできる環境におらず、ご報告が遅れましてすみません。

Activateで実行したところ上手くいきました。
わかりづらい説明にもかかわらず迅速にアドバイス頂きありがとうごさいました。
・ツリー全体表示

【80586】型が一致しないがわかりません
質問  ゆうすけ  - 19/3/15(金) 17:11 -

引用なし
パスワード
   1週間前にVBAの勉強を始めました。少しずつエラーを直していったのですが、最後の部分でつまづいています。
下から8行目の
Sh2Range.Offset(newRecordOffset, 0).Value = newRecordValues
で、「型が一致しない」となってしまいます。
どなたかお助けください。

Sub saveData()
  Dim i As Long
  For i = 14 To 41
    If Worksheets("1").Cells(i, 16) = "1" Then
      Dim Sh1 As Worksheet
      Dim Sh2 As Worksheet
      Dim Sh1Range As Range
      Dim Sh2Range As Range
      Dim newRecordOffset As Variant
      Dim newRecordValues As Variant
      Dim dataRow As Long
      Set Sh1 = Worksheets("1")
      Set Sh1Range = Sh1.Range("K14:K41")
      Set Sh2 = Worksheets("2")
      Set Sh2Range = Sh2.Range("E24")
      Set newRecordOffset = Sh2.Range("E24")
      dataRow = 1
        Do While Sh1Range.Cells(dataRow, 0).Value <> ""
          newRecordValues = Array( _
            Sh1Range.Cells(dataRow, 1).Value _
            )
          Sh2Range.Offset(newRecordOffset, 0).Value _
            = newRecordValues
          dataRow = dataRow + 1
          newRecordOffset = newRecordOffset + 1
        Loop
    End If
  Next i
End Sub
・ツリー全体表示

【80585】Re:Worksheet.Delete の動き
回答  北浦  - 19/3/15(金) 8:53 -

引用なし
パスワード
   ▼マナ さん:

>>※インポート対象のコード名が SHT とすると、インポート後は、SHT1 となる。
>
>OnTime メソッドを使って、処理後に、
>SHT1をSHTに変更してしまうのはだめでしょうか。

通常、コード名は、実行時、値の取得しかできないため、変更できず、
無理矢理、VBProject.VBComponents からなら変更できるのですが、
「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」の設定を
しないといけなくなり、配布して使用する為、あまりやりたくない手法に
なってしまいます。

思い付きレベルでも構わないのでなんか考えられる方法があれば、
ご教授ください。

よろしくお願いいたします。
・ツリー全体表示

【80584】Re:Worksheet.Delete の動き
発言  マナ  - 19/3/14(木) 22:49 -

引用なし
パスワード
   ▼北浦 さん:

>※インポート対象のコード名が SHT とすると、インポート後は、SHT1 となる。

OnTime メソッドを使って、処理後に、
SHT1をSHTに変更してしまうのはだめでしょうか。
・ツリー全体表示

【80583】Re:ブックモジュール global オブジェク...
発言  γ  - 19/3/14(木) 21:21 -

引用なし
パスワード
   > Set KM = Workbooks("A").Worksheets("K")
のWorkbooks("A")というのはこれでいいのですか?

Bookを指定しなくてもActiveWorkbookと解釈されるはずなので記載しなくてよいし、
明示的に書くなら、
・Thisworkbookもしくは、
・Workbooks("A.xlsm")
とかじゃないんですか?

こちらにはVBEのコードペインからコピーペイストして
投稿されているのでしょうか?
いやほんとうは、これとは別のコードで実行しています、
というのは無しでお願いしたい。

ちなみに、
Set KM = Sheet1
などとしてテスト実行しましたが、特にエラーは発生しませんね。
・ツリー全体表示

【80582】Re:ブックモジュール global オブジェク...
発言  マナ  - 19/3/14(木) 19:59 -

引用なし
パスワード
   ▼みも さん:


KM.Rows.Count

だとどうなるでしょうか?
・ツリー全体表示

【80581】Re:ブックモジュール global オブジェク...
回答  よろずや  - 19/3/14(木) 19:54 -

引用なし
パスワード
   >書く場所が悪いのか
場所ではなく、実行するタイミングの問題です。

Workbook_Open()直後には、まだワークシートが開かれていないようです。
Workbook_WindowActivateイベントで実行させるのが吉。

Workbook_Open()直後にのみ実行させたい場合は、
Workbook_WindowActivateイベントで実行済みフラグを立てるなどの工夫が必要です。

と、思う。
うまくいったら、他の人のために結果報告してね。
・ツリー全体表示

【80580】ブックモジュール global オブジェクト ...
質問  みも  - 19/3/14(木) 18:25 -

引用なし
パスワード
   マクロVBAについて質問です。

最近マクロを始めたものです。

やりたい内容: ブックが開いた時に前回入力されているデータを自動削除したい。

最初はブックモジュールに下記コードを記載していたのですが、“Rowsメソッドは失敗しました_Global オブジェクト” となり実行で来ません。

浅はかですが書く場所が悪いのかと思い、標準モジュールを呼び出すコードをブックモジュールに記載したのですがエラーは出続けて解消できません。

標準モジュールでステップインで実行すると問題なく進みます。

また、コマンドボタンを設置して標準モジュールを実行してもうまくいきます。

This workbookに繋げて書こうとするとなぜかうまくいきません。

初心者で大変申し訳ありませんが、行き詰まっています。

どなたかご教授頂けますと幸いです。

*ブックモジュール

Private Sub Workbook_Open()

Call Module1.Module1

End Sub

*標準モジュール

Sub Module1()

'KシートをKMとする

&#160;&#160;&#160; Dim KM As Worksheet

&#160;&#160;&#160; Set KM = Workbooks("A").Worksheets("K")

' KシートA列の最終行をKMMRとする

&#160;&#160;&#160; Dim KMMR As Long

&#160;&#160;&#160; KMMR = KM.Cells(Rows.Count, 1).End(xlUp).Row   (ここでエラーになります。)

&#160;&#160;&#160; If KMMR > 1 Then

&#160;&#160;&#160; KM.Range(KM.Cells(2, 1), KM.Cells(KMMR, 39)).Delete

&#160;&#160;&#160; Else

&#160;&#160;&#160; End If

'HシートをHMとする

&#160;&#160;&#160; Dim HM As Worksheet

&#160;&#160;&#160; Set HM = Workbooks("A").Worksheets("H")

' HシートA列の最終行をKMMRとする

&#160;&#160;&#160; Dim HMMR As Long

&#160;&#160;&#160; HMMR = HM.Cells(Rows.Count, 1).End(xlUp).Row

&#160;&#160;&#160; If HMMR > 1 Then

&#160;&#160;&#160; HM.Range(HM.Cells(2, 1), HM.Cells(HMMR, 30)).Delete

&#160;&#160;&#160; Else

&#160;&#160;&#160; End If

End Sub
・ツリー全体表示

【80579】Re:Worksheet.Delete の動き
発言  北浦  - 19/3/14(木) 12:48 -

引用なし
パスワード
   ▼よろずや さん:
レスありがとうございます。
やぱりそうなんですね

▼マナ さん:
レスありがとうございます。
実を言いますと、一部のシートをブックからエクスポートしたり
ブックにインポートしたりしています。

エクスポートは、ブック内のシート1つを別ブックで保存しており、
インポートは、ブック内にあるインポート対象シートを削除した後、
エクスポートしたシートを取込んでいます。

このインポートの際に問題が生じています。

インポートの処理としては
 シートの Delete コマンドで、インポート対象のシートを削除し、
 インポートするシートを Copy コマンドで取り込んでいます。

通常は、特に問題が起こらないのですが、
以下のように、
 Button1 で インポート対象シートのコード名を参照した処理を行い
 Button2 で、インポート処理を行うと、
  Delete コマンドで、シートのオブジェクトが残ってしまい
  Copy コマンドで、取り込んだシートのコード名が変わり
  処理終了後、Delete コマンドで削除したオブジェクトが消えてなくなります。
  結果、違うコード名で取り込んだような状態になります。

Sub Button1_Click()
  Debug.Print SHT.Name
End Sub

Sub Button2_Click()
  Call Import
End Sub

※インポート対象のコード名が SHT とすると、インポート後は、SHT1 となる。

この後、コード名が変わっている為、別のプログラムでコード名を
参照している箇所で、エラーが発生します。

回避方法としては、インポート対象のシートに関して、
そのコード名を使用しないようにすればよいというのは、分かっているのですが、
この方法しかないのか、それ以外の方法があるのか探りたいと考えています。

よろしくお願いいたします。
・ツリー全体表示

【80578】Re:変数の参照が不正ですを直したい
発言  よろずや  - 19/3/14(木) 10:17 -

引用なし
パスワード
   マルチポストで、あちらでも適切な回答が付かないですね。

突っ込み処満載で、どっから手を付けていいやら。

コンパイルエラーの前に、
どんな表でどんな処理をしたいのかを説明すると、
適切な回答が付くかも。
・ツリー全体表示

【80577】Re:変数の参照が不正ですを直したい
発言  マナ  - 19/3/13(水) 23:14 -

引用なし
パスワード
   ▼モリチャン さん:

まずは、インデントから
ht tp://kabu-macro.com/word/sa-so/zisage.html

次に、変数宣言
ht tp://officetanaka.net/excel/vba/beginner/11.htm

質問は、それからで。
・ツリー全体表示

【80576】変数の参照が不正ですを直したい
質問  モリチャン E-MAIL  - 19/3/13(水) 22:54 -

引用なし
パスワード
   以下の様なマクロ部分のプログラムです。他にフォーム部分がありますが動かすとコンパイルエラ:Nextで指定された変数の参照が不正ですと表示します。そして、Next iのiの部分が強調されますので、変数i関係が違うと思いますがどう直したらよいでしょうか?
Sub main()
Application.ScreenUpdating = False
Workbooks.Open Filename:=gfilename
sinn = ActiveWorkbook.Name
Sheets("規格値").Select
Range("E10").Select
ActiveCell.Offset(0, 0).Range(Cells(2, 1), Cells(15, 7)).Select
Selection.ClearContents
Workbooks.Open Filename:=dfilename
For i = 1 To 7
For k = 1 To 14
Data = ActiveWorkbook.Name
Windows(sinn).Activate
Range("E10").Select
ActiveCell.Offset(k - 1, i - 1).Select
Windows(Data).Activate
D = Val(Mid(TESTNO, (k - 1) * 2 + 1, 2))
Range(Cells(D, 1), Cells(D, 6)).Copy
Windows(sinn).Activate
Selection.PasteSpecial Paste:=xlFormula
Next i
Windows(Data).Activate
ActiveWindow.Close
If i = 7 Then Exit For
Application.ScreenUpdating = True
MsgBox ("終了しました")
End Sub
・ツリー全体表示

【80575】Re:Worksheet.Delete の動き
発言  マナ  - 19/3/13(水) 20:15 -

引用なし
パスワード
   ▼北浦 さん:

回答はできないのですが、

そもそも、それで何か不都合があるのでしょうか?
・ツリー全体表示

【80574】Re:Worksheet.Delete の動き
発言  よろずや  - 19/3/13(水) 20:08 -

引用なし
パスワード
   コード名が書かれているプロジェクトで
そのコード名のオブジェクトを削除すると
プログラムエラーになってしまいます。(実行時エラー)

プログラム実行中にプログラムの状態が変わると
調子が悪いので、プログラム終了まで保持しているのでは。
・ツリー全体表示

【80573】Worksheet.Delete の動き
質問  北浦  - 19/3/13(水) 15:18 -

引用なし
パスワード
   はじめまして。
現在、作成したマクロの動きを調査していて、
シート削除の以下の2つの動きが微妙に異なることに気づきました。
 a) Worksheets(1).Delete
 b) Sheet1.Delete
a:すぐにシートが削除され、VBEのプロジェクト内からも、すぐに無くなります。
b:すぐにシートが削除され、VBEのプロジェクト内は、処理終了後に無くなります。

また、以下のようにすると、
  Debug.Print Sheet1.Name
  Worksheets(1).Delete
上記bと同じ動きになります。
どうも、コード名を利用したのち、シートを削除すると、
プロジェクト内のオブジェクトは、処理終了後にしかなくならないようです。

すべてWorksheets(1)のような記述にすれば、解決するのは分かっているのですが
どうしてコード名を利用した処理の後にシートを削除すると、
プロジェクト内のオブジェクトは、処理終了後にしか無くならないのか、
理由を知りたいと思っています。

どなたか、ご教授いただけないでしょうか
よろしくお願いいたします。

動作環境
 OS: Windows 10 64ビット メモリ4GB
 Excel: Excel 2016 32ビット
・ツリー全体表示

【80572】Re:複数選択したシートに、ページ番号の...
発言  マナ  - 19/3/12(火) 17:43 -

引用なし
パスワード
   ▼わか さん:

>With ActiveSheet.PageSetupを
>ActiveWindow.SelectedSheets.PageSetup
>に書き換えてみましたが
>エラーが表示されます。

手作業と同じで、まとめて設定はできないので

For each sht in ActiveWindow.SelectedSheets
  With sht.PageSetup

のように、1シートずつ設定してください。
・ツリー全体表示

【80571】Re:複数選択したシートに、ページ番号の...
質問  わか  - 19/3/12(火) 8:23 -

引用なし
パスワード
   ▼マナ さん:

回答ありがとうございます。
重要書類で、またシートを増やしたりすることも多いので、間違いがないようにあえてマクロで印刷までの一括を組もうとしています。

下記では、

>>With ActiveSheet.PageSetup

が問題であるとのことでしたので

With ActiveSheet.PageSetupを
ActiveWindow.SelectedSheets.PageSetup
に書き換えてみましたが
エラーが表示されます。

どう記載すれば選択しているシートに対し
ヘッダー、フッダーが作動するのか
今後の他への展開への勉強も兼ね、ご教授頂ければ幸いです。

宜しくお願い致します。

Sub ページ番号設定印刷()
'
' ページ番号設定印刷 Macro
'
With ActiveSheet.PageSetup
    .LeftHeader = ""
    .CenterHeader = ""
    .RightHeader = ""
    .LeftFooter = ""
    .CenterFooter = "&P/&N"
    .RightFooter = ""
    .LeftHeader = ""
  End With

  ActiveWindow.SelectedSheets.PrintOut Copies:=1
  
End Sub

>▼わか さん:
>
>>印刷は選択したすべてが出ます。
>
>印刷の部分は、ちゃんと選択したシートが対象になっているからです。
>
>>  ActiveWindow.SelectedSheets.PrintOut Copies:=1
>
>
>'-----
>
>>1枚にページ設定は入るのですが、全部に設定されません。
>
>それは、ActiveSheetにのみ、ページ設定しているからです。
>
>>With ActiveSheet.PageSetup
>
>でも、最初に1回だけ、全シートで設定しておけば、
>印刷の都度、設定する必要がないと思います。
・ツリー全体表示

【80570】Re:複数選択したシートに、ページ番号の...
発言  マナ  - 19/3/11(月) 20:38 -

引用なし
パスワード
   ▼わか さん:

>印刷は選択したすべてが出ます。

印刷の部分は、ちゃんと選択したシートが対象になっているからです。

>  ActiveWindow.SelectedSheets.PrintOut Copies:=1


'-----

>1枚にページ設定は入るのですが、全部に設定されません。

それは、ActiveSheetにのみ、ページ設定しているからです。

>With ActiveSheet.PageSetup

でも、最初に1回だけ、全シートで設定しておけば、
印刷の都度、設定する必要がないと思います。
・ツリー全体表示

94 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free