Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » 別ブックのシートをオブジェクト名で取得する

別ブックのシートをオブジェクト名で取得する

対象:Excel2010, Excel2013, Windows版Excel2016

別ブックのシートをオブジェクト名で取得する

「シートのオブジェクト名を使って、別のブックのシートを、取得できないのでしょうか?」
といった主旨のご質問をいただきました。

オブジェクト名を使ってシートを操作する

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
といった書き方ではアウトです。

いくつかの方法が考えられそうですが、何の設定変更も不要な、以下のような方法が簡単そうです。

Sub オブジェクト名で別ブックのシートを取得する()
 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

 MsgBox sh_.Range("A1").Value
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

もっとシンプルな、カッコよく見える風なコードを期待していらしたのではないか、とは思うのですけれど。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » 別ブックのシートをオブジェクト名で取得する

「Sheets・Worksheet」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.