• ベストアンサー

VBAでワークシートを変数にするとき

たとえばSheet1とSheet2を一度に選択する場合、 Sub Macro6() Sheets(Array("Sheet1", "Sheet2")).Select End Sub と書くと思います。 ワークシートを変数で書く場合は Sub test() Dim ws1 As Worksheet, ws2 As Worksheet Sheets(Array(ws1.Name, ws2.Name)).Select End Sub と、いちいち名前で指定しなければならないのでしょうか? それとももっと別の書き方があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

> この場合、仮にシート1つだけなら > ws(1).Move > で大丈夫ですよね?ところが複数になると > Sheets(Array(ws(1).Name, ws(2).Name)).Move と、わざわざNameで名前を指定するしかないんでしょうか? この辺はわたしも詳しくないのですが、ws(1)やws(2)はオブジェクト型変数ですから、Array関数ではまとめられないのではないでしょうか? どうしてもオブジェクト変数のまま使用したいのなら ws(1).Select ws(2).Select False ActiveWindow.SelectedSheets.Move となると思います。 ならば Sheets(Array(ws(1).Name, ws(2).Name)).Move の方がよほど簡単ですよね。

emaxemax
質問者

お礼

> ならば > Sheets(Array(ws(1).Name, ws(2).Name)).Move の方がよほど簡単ですよね。 たしかにそのとおりでしたね。 ありがとうございます。

その他の回答 (4)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.3です! コードを見させていただきました。 Sheet1・Sheet2のSheet名が同じ、またはあるきまったセルの値をSheet名にするのであれば Sheet名を指定せずにできそうな感じですが、 コードを拝見する限りにおいては Sheet1を「回答」というSheet名に! Sheet2を「詳細」というSheet名にするにあたり、規則性がないようなので はやりそれぞれのSheet名を指定するのが間違いないような気がします。 この程度しか判りませんが、Sheet名を指定せずにできる方法があればごめんなさいね。m(_ _)m

emaxemax
質問者

お礼

ありがとうございます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 的外れならごめんなさい。 Sheet1とSheet2を選択した後、何かの操作をする訳ですよね? 考え方として、両Sheetを一気に!というのではなく、Sheet1の操作が終わればSheet2の操作に!という方法にすればどうでしょうか? 仮にSheet1・Sheet2のA1セルにABCDと表示するコードは↓のような感じで大丈夫だと思います。 Sub test() Dim i As Long For i = 1 To 2 Worksheets(i).Cells(1, 1) = "ABCD" Next i End Sub ※ この場合Sheet名は一切関係なく、Sheet見出しの左側から1番目・2番目のSheetのA1セルに ABCDと表示されるはずです。 参考にならなかったら読み流してくださいね。m(_ _)m

emaxemax
質問者

お礼

ありがとうございます。 実は、だいぶ略しましたが以下のようなことをしております。 Sub ファイル作成() Dim ws(2) As Worksheet Dim myPth As String, dp As String Static myS As Long myS = myS + 1 myPth = ThisWorkbook.Path & "\" & Format(Date, "YYYYMMDD") & "(" & Format(myS, "00") & ")" MkDir myPth Sheets("Sheet1").Copy After:=Sheets(Sheets.Count) Set ws(0) = Sheets("Sheet2") Set ws(1) = Sheets(Sheets.Count) Set ws(2) = Sheets.Add(After:=Sheets(Sheets.Count)) With ws(2) '略 .Range("AF2").Value = ws(0).Range("B1").Value dp = .Range("AF2").Value End With With ws(1) '略 .Range("A1").Value = dp End With MsgBox dp & "を作成しました。" Sheets(Array(ws(1).Name, ws(2).Name)).Move Sheets(1).Name = "回答" Sheets(2).Name = "詳細" ActiveWorkbook.SaveAs Filename:=myPth & "\" & dp & ".xls" ActiveWindow.Close End Sub この場合、仮にシート1つだけなら ws(1).Move で大丈夫ですよね?ところが複数になると Sheets(Array(ws(1).Name, ws(2).Name)).Move と、わざわざNameで名前を指定するしかないんでしょうか?

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

記述方法は様々だと思いますが、他の方法では インデックス番号で指定する方法 Sheets(Array(ws1.Index, ws2.Index)).Select すべて選択したいなら、 Sheets.Select こんな方法もあります。 ws1.Select ws2.Select False >と、いちいち名前で指定しなければならないのでしょうか? すべて選択する場合以外では、いちいち名前で指定するのが普通です。

emaxemax
質問者

お礼

> すべて選択する場合以外では、いちいち名前で指定するのが普通です。 そうなんですか・・・・・・。 せっかくws1,ws2とオブジェクトで変数を指定したのに、わざわざその名前を取得しなければならないことに違和感がありました。 ありがとうございます。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

一例です。 シートのインデックス番号はどうでしょうか。 Sheets(Array(1, 2)).Select 以外ならば、For Each Sh In ThisWorkbook.Worksheets~Nextで必要なシート名を判定して配列を作成するぐらいでしょうか。

emaxemax
質問者

お礼

ありがとうございます。 今回は変数を使う場合の質問なのでシートのインデックス番号とは異なります。

関連するQ&A