「シートのオブジェクト名を使って、別のブックのシートを、取得できないのでしょうか?」
といった主旨のご質問をいただきました。
オブジェクト名を使ってシートを操作する
Excel VBAでワークシートを操作するときに、
Sheets(1).Range("A1")
Worksheets("シートA").Range("A1")
といった書き方がよく行われますが、オブジェクト名を使ってシートを操作することもできます。
「Excel VBAでIndexもシート名も使わず、シートオブジェクトをダイレクトに指定する方法」という記事で紹介されている方法です。
例えば下図のように、BookAブックで、ワークシートの名前を「シート_あ」、オブジェクト名を「SheetA」としたときに、
BookA内のプロシージャからであれば、Sheetsプロパティ(あるいはWorksheetsプロパティ)を使って、
MsgBox Sheets("シート_あ").Range("A1").Value
といった書き方をすることが一般的です。
これを、オブジェクト名を使って、
MsgBox SheetA.Range("A1").Value
といった書き方もできます。
このときに、別のブックから、例えば、
MsgBox Worksbooks("BookA.xlsm").SheetA.Range("A1").Value
のような形で、BookAブックのSheetAを簡単に操作できないのか、というのがご質問の主旨です。
別ブックのシートをオブジェクト名で取得するサンプルマクロ
残念ながら、
Worksbooks("BookA.xlsm").SheetA.Range("A1").Value
といった書き方ではアウトです。
いくつかの方法が考えられそうですが、何の設定変更も不要な、以下のような方法が簡単そうです。
Dim sh As Worksheet
Dim sh_ As Worksheet
For Each sh In Workbooks("BookA.xlsm").Sheets
If sh.CodeName = "SheetA" Then
Set sh_ = sh
Exit For
End If
Next sh
End Sub
ワークシートのオブジェクト名は、Worksheet.CodeNameプロパティで取得できるので、
対象のブックの全シートにFor Each~Nextループを回して、
For Each sh In Workbooks("BookA.xlsm").Sheets
Worksheet.CodeNameが、そのオブジェクト名だったときに、
If sh.CodeName = "SheetA" Then
オブジェクト変数に、そのワークシートを格納しています。
Set sh_ = sh
もっとシンプルな、カッコよく見える風なコードを期待していらしたのではないか、とは思うのですけれど。
- Newer:定数xlUpの値を調べる
- Older:アクティブセルに入力規則が設定されているか判定するExcelマクロ
Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » 別ブックのシートをオブジェクト名で取得する