今日は、さきほどのブログでご紹介した粟屋さんからの、メールセミナーへのフィードバックから。
もともとかなり書ける方だけあって、いただくメールの内容がとても興味深いです。
オブジェクト番号とオブジェクトの対応は一般的には公開されていないもののようですが、Worksheetsについては、Microsoft が公にしているかどうかは別として、さまざまな参考書でも、左から1,2,3・・・のようです。
私もこれを信じて作成して、今までトラブルにあったことがありません。
ですので、後ろへ後ろへとワークシートを増やす場合、たいていCountプロパティを用いて、下記のように書いています。
Sub MyMacro()
Dim i As Long
Dim lngE As Long
lngE = Worksheets(“main”).Range(“B65536”).End(xlUp).Row
For i = 2 To lngE
Worksheets(“main1”).Copy after:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = Worksheets(“main”).Range(“B” & CStr(i)).Value
Next i
End Sub
ForEach構文は、仕様としては、インデックス番号順にオブジェクトを拾ってくることは保証されていません。
いちおうその点については注意が必要です。
とはいえ、実質的には、インデックスと対応しているようですね。
他の言語に慣れていると、コレクション内のオブジェクトをいつも同じ順番で返してくれるVBAのForEach構文は、かえって気色悪いです。。
以前、「.xlsのファイル内の同一テンプレートで作られたシートの内容を基にして、所定の順番で互いにリンクされた複数のHTMLファイルを作る」といった仕事を部下にさせたことがあります。
そのとき、ForEach構文を使っていたので、注意し、ForNext構文でCountプロパティを利用するよう促しました。
もっと詳しい解説もしたいのですが、またこのへんで。