オブジェクト名を指定してWorksheetオブジェクトを取得するFunction(Excel)
オブジェクト名を指定してWorksheetオブジェクトを取得するFunction(Excel)
CodeNameプロパティというものがある
コチラの記事のコメント欄が炎上wしたことにより、CodeName
というプロパティの存在を知った。
CodeNameプロパティとは
Worksheet.CodeName
で、Worksheet
オブジェクトのオブジェクト名(デフォルトでVBEのプロジェクト エクスプローラーに表示される「Sheet1
(Sheet1)」の左側の「Sheet1
」。シート名を変えてもオブジェクト名は変わらない。プロジェクト エクスプローラー上で変更可能。)
オブジェクト名は、手動でシート名を変更されても変化しないので、ユーザーによる勝手なシート名の変更にも耐えられる可能性が高い、ということだ。
もちろん、わざわざVBEを開いてオブジェクト名を変更するような猛者がいれば別だがw
たとえば、テスト用ブックの各ワークシートのオブジェクト名を
こんなふうにしておいて、イミディエイト・ウインドウに
?Worksheets("アホ").CodeName
と打ち込んで[Enter]してみると、
このように、オブジェクト名「Sh01Aho
」が返っている。
つまり、そういうことだ。
オブジェクト名を指定してWorksheetオブジェクトを取得する
Excelで様式を配布して、それを回収するような場合、配布前に必要なシートのオブジェクト名を適当なものに変更しておけば、見かけ上シート名をいじくられていてもCodeName
プロパティの値をキーに必要なシートを特定することができる。
リスト1 標準モジュール
Public Function getWorksheetByCodeName( _ ByVal targetBook As Workbook, _ ByVal targetCodeName As String) As Worksheet Dim ret As Worksheet Set ret = Nothing Dim i As Long For i = 1 To targetBook.Worksheets.Count With targetBook If .Worksheets(i).CodeName = targetCodeName Then _ Set ret = .Worksheets(i): Exit For End With Next Set getWorksheetByCodeName = ret Set ret = Nothing End Function
Workbook
オブジェクトとオブジェクト名を受け取り、指定したオブジェクト名のWorksheet
オブジェクトがあればそれを返し、なければNothing
が返るしくみ。
使ってみる
ThisWorkbook
の同一フォルダ内にテスト用ブック「Test2.xlsx
」を置いて、次のコードで実験。
リスト2 標準モジュール
Public Sub test02() Dim targetBook As Workbook Set targetBook = Workbooks.Open(ThisWorkbook.Path & "\Test2.xlsx") Dim targetSh As Worksheet Set targetSh = getWorksheetByCodeName(targetBook, "Sh05Dekosuke") If Not targetSh Is Nothing Then Debug.Print targetSh.Name End Sub
Sh05Dekosuke
というオブジェクト名のWorksheet
オブジェクトを取得し、そのName
プロパティの値をイミディエイト・ウインドウに表示させようという試み。
ちゃんと、Sh05Dekosuke
オブジェクトに相当するWorksheet
オブジェクトのName
プロパティが取得できていることがわかる。
おわりに
オブジェクト名を用いたWorksheet
オブジェクトへのアクセスは、ブック(プロジェクト)内で閉じた処理には多用しているが、ブック(プロジェクト)間をまたいだ処理で使えなかった。
しかし、事前にオブジェクト名を指定せねばならんにせよ、少しは道が開けたかも知れない。
ちなみに
たとえば、今回のSh01Aho
オブジェクトの場合、親オブジェクトは何なのだろう、と思って調べてみた。
イミディエイト・ウインドウに
?Sh01Aho.pa
まで打ち込むと、
このように、Parent
プロパティが入力候補に出てくる。
期待に胸を高鳴らせつつ、
?Sh01Aho.Parent
と入力して[Enter]!
なんやねん、それ。
ちなみに、「VBAProject
」を参照設定してやると、別ブック(プロジェクト)からでもVBAProject.Sh01Aho
みたいにすれば各シートオブジェクトにアクセスすることはできる模様。しかしながら、同じプロジェクト名でもブックが変われば参照設定は切れてしまう(当り前)ので、あまり使い道はなさそう。