VBAのWorksheetsとSheetsの違い

2月12日のVBAerのZoom会で覚えた知識なのですが、シートの集まりを指定するための手段としてWordsheetsとSheetsがあるのですが、その2つの違いが私自身も明確ではなかったので、記事化しておきます。

私はいつもVBAでブック内に存在しているシートをすべて順番に指定して行くのに次のようなFor Eachループを使っています。

Dim sh Worksheet
For Each sh In Sheets
  MsgBox sh.Name
Next

これで全てのシートのシート名が表示されるのですが、今回覚えた知識からだとどんな場合でもシートの名称が全て表示されるわけではないということがわかりました。

というのはSheetsというのは、全てのシートを対象としています。

Excelのシートはたくさんの種類があってシート見出しを右クリックすることによって挿入できるシートの種類の一覧が表示されます。

我々のワークシートと言っているのは、この中のワークシートのみです。1枚のグラフしか表示しないグラフシートや、昔のマクロ形式の4.0マクロ、昔のマクロ用のダイアログである5.0ダイアログは、ワークシートではありません。

その人に表示されているのはシートのテンプレートでこれはワークシートの扱いになります。

ワークシートではないものでも、ピボットグラフなんかは一枚のグラフにまとめておくこともありグラフシートは使うことが稀にあるでしょう。他の二つは今の時代はもう使わないと思います。

そのようなシートが入っているブックでこの VBA を実行するとエラーになります。

Sheet1、Sheet2は反応できるんです。Macroもシートのおそらく構造だから反応できるんです。でも、図形のようなものであるグラフシートとダイアログは反応できずにエラーになります。

次のようにSheetsをWorkSheetsにすると、本来のワークシートであるSheet1とSheet2しかループの対象にしませんので、エラーになりません。2回のメッセージが表示されます。

Dim sh As Worksheet
For Each sh In Worksheets
  MsgBox sh.Name
Next

では全てのシートを表示するにはどうすれば良いのでしょうか。

Sheetsにすれば全てのシートをループの対象にすることができますが、Worksheetsにするとそれをshに入る時点でエラーになってしまうのです。さて。

Dim sh As ここはなに?
For Each sh In Sheets
  MsgBox sh.Name
Next

とりあえず手っ取り早く全てのシートを表示するにはVariantにして何でもありにしてしまうのが手っ取り早いのかなと思います。

Dim sh As Variant
For Each sh In Sheets
  MsgBox sh.Name
Next

shをウォッチウィンドウに入れて確認してみたらデータの型がSheet1やらSheet3やらDialogSheetやらにコロコロ変わるので、Variantでいいのかなって思いました。

コメント

タイトルとURLをコピーしました