Excel VBOで「Get Worksheet As Collection」と名がつくアクションは3つほどあります。
どう違うのか検証しました。
検証1. Get Worksheet As Collection
一番オーソドックスなやつです。ワークブック名とシート名を指定すれば、シート中の表を拾ってコレクション化してくれます。
ここで疑問なのは、どうやって表の範囲を判定しているか、です。
ソースを読んでみましょう。
GetWorksheetUsedRangeAsDataTableというメソッドがありますね。さらに深く見ていきましょう。
このメソッドはExcel VBOの初期化ページからプロパティを開き、グローバルコードの中を検索するとヒットします。
見たことのないメソッドが出てきたときは、だいたいこの「グローバルコード」の中に書かれていることが多いです。
詳細は割愛しますが、UsedRangeを使っているのがポイントです。
UsedRangeプロパティを使うことで、シート中の表の範囲を取得できます。
参考:https://tonari-it.com/excel-vba-usedrange-currentregion/
例えば、以下のような表があったとします。
A1セルから表が書かれているわけではありませんが、UsedRangeプロパティによってB4~G19までが表と判定されます。
Get Worksheet As Collectionでは上記範囲をコレクションデータに格納したものが返却されるというわけです。
注意したいのは、以下のような場合です。
この場合、表の範囲はB4~N21となります。
途中に空白セルがあったとしても、何かしら値が記載されているセルの範囲(左上から右下)を取得するためです。
なので、Get Worksheet As Collectionで返却されるコレクションデータは以下のようになります。
1シート1テーブル(表)である前提で使わないと、想定外の結果が返ってくるので注意が必要です。
検証2. Get Worksheet As Collection (Fast)
Get Worksheet As Collectionとの違いは入力パラメータが一切ないことです。
どうやって対象のExcelを特定しているのでしょうか?
試しに2つのExcelファイルを開いている場合にどういう挙動を示すか試してみます。
結果は以下のとおり、エラーになってしまいました。
Excelファイル1つだけ開いている状態であれば、難なく処理してくれます。
Get Worksheet As Collection(Fast)には何も入力値を与えていませんが、内部的にはhandleを0、Workbook NameとWorksheet Nameを空白にして、Get Worksheet As Collectionに渡しています。
つまり、handle:0、Workbook Name, Worksheet Name:””のGet Worksheet As Collection = Get Worksheet As Collection(Fast)
です。
またまた詳細は省きますが、アクティブなワークブックに対して処理を進めているようです。
検証3. Get Worksheet As Collection Offset
Get Worksheet As Collectionとの違いは、表の範囲指定を手動設定できる点、表のヘッダー有無を設定できる点です。
試しに、以下のExcelファイルを例に
StartCellを”A4″, Use HeaderをTrueにして実行してみましょう。
Use HeaderをTrueにしていたので、1行目をHeader(表の項目名)としたコレクションデータが返却されています。
結果から分かるとおり、A4セルを表の始点としています。ただし、表の終点は手動設定できないため、検証1と同じくN21となります。
A1から表が始まらない場合は注意が必要です。
検証1の例のように、B4から表が始まる場合を見てみましょう。
入力のStartCellをB4に設定しています。
結果は以下のとおりです。
① UsedRangeにより表の範囲を判定 → B4~N21
② B4をA1(=表の始点)と読み替えて、そこからStartCellで設定したセル位置(=B4)を新たな表の始点とする
というロジックですね。
表がA1から始まらない場合は、Get Worksheet As Collection Offsetは混乱を招くので使わない方が良いと思われます。
検証4. Get Worksheet Range As Collection
検証3のGet Worksheet As Collection Offsetで、表の終点セルを手動設定できるようにしたバージョンです。
表の始点終点を明示的に設定したい場合はこのアクション一択です。
きれいに表が取得できているのが分かるかと思います。
まとめ
あえてGet Worksheet As Collection(Fast)を使う必要はなさそうな気がします。
1シートに1つの表しかない前提ならばGet Worksheet As Collection
複数の表が混在する場合はGet Worksheet Range As Collection
が相性良さそうです。
ただ、表の外にメモっぽくセル値が記載されているケースも多いので、
確実にGet Worksheet Range As Collectionで表の始点終点を決めてデータ取得したほうが良いかもしれません。