読者です 読者をやめる 読者になる 読者になる

ぼくLog

子持ち、車持ち、マンション持ちの僕の日常を綴ります。車と、ラクをしたい一心で覚えたエクセルVBAを中心になりそうです。

ワークシートってどうやって選択すればいいの?Worksheets("Sheet1")?Worksheets(1)?Sheet1?|エクセルVAB

f:id:yt4u:20170318221759j:plain

ワークシートの特定にはCodeName(コードネーム)を使った方がいいというエントリーを書きました。

yt4u.hatenablog.com


CodeNameを使え!なんてエラそうなこと言ってますが、実はぼくはずっとCodeNameの存在を知りませんでした。
ホントにずぅーーーーっと知りませんでした。

そしてCodeNameの存在を知ったときは、あまりの感動に暫く絶句した記憶がございます。はい。


その感動の大部分は「これでワークシート名の変更に左右されずシートを扱える」というもの。

そしてもう一つが、ぼくにとって長年の謎であったことが解決したからです。


ワークシートを特定する3つの方法

とあるブックに3つのワークシートがあったとして、その一番左端のワークシート名が「Sheet1」だったとします。

このとき、「Shee1」シートを選択する方法として、次の2つの方法をよく見かけます。

  1. Worksheets(“Sheet1”).Select
  2. Worksheets(1).Select

(ワークシートをSelectすることなんてほとんどないと思いますが、分かりやすいメソッドなので以下Selectを前提に書いています。)


1は単純に「Sheet1」というワークシート名を拠り所に指定する方法です。

2はワークシートの集合体であるワークーシートコレクションの中から、各ワークシートに振られたインデックス番号を使って呼び出す方法です。
これは、ワークシートの複数枚ある場合、自動的に左端のワークシートを1として順にインデックスが割り振られていく、という特性を利用したものです。

ちなみに、2がワークシートコレクションというCollectionオブジェクトなんだという観点に立つと、実は1もCollectionオブジェクトらしい挙動だということが分かってきます。
つまり、Collectionの中から1つ取り出すときにインデックスを使って取り出すほか、Keyを使って取り出す方法があるわけですが、1の方法はまさしく後者に他ならないのです。

このときのKeyは何かというと、ワークシート名(=Sheet1)そのものですよね。


なお、Collectionについてはコチラのエントリーを参考にしてみてください。

yt4u.hatenablog.com


話が少し逸れてしまいましたが、長年の謎は上の2つではありません。

もうひとつワークシートを指定する方法で、なぜそれで指定できるのか長きに亘って謎だったのはこれです。

  Sheet1.Select


これで前述の例で状態だと「Sheet1」という名前のワークシートが選択できてしまうんですよね。

これで軽く混乱することになります。

「Sheet1」で選択できるなら、「Worksheets(1)」とかする必要ないんじゃないの?
だってその方が打ち込む文字数が少なくて済むし。、、、と。

そう思って「Sheet1」を使い始めると、さらに混乱が襲ってきます。

それは例えば、先に挙げた「Sheet1」という名前のワークシートをひとつ右に移動した場合、「Worksheets(1).Select」では「Sheet1」シートは指定できなくなります。
「Sheet1」シートを選択するためには「Worksheets(2).Select」とする必要があるんですよね。
でも相変わらず「Sheet1.Select」で「Sheet1」(という名前の)ワークシートを選択することができます。

「Sheet1」はOKだけど「Worksheets(1)」はダメで、でもそのシートが左端ならOKで、、、って何が何だか状態必至。
似たようなコードなのに挙動は全く変わってくるので混乱せずにはいられないですよね。


まさにぼくは長年に亘り「Worksheets(1)」と「Sheet1」の立ち位置の違いを理解できず混乱し続けていました。

それがCodeNameの存在を知って、一気に解決することになったのです。


そうです。「Sheet1」はCodeNameそのものだったのです。


VBEで「Sheet1」シートのプロパティを見れは一目瞭然。

f:id:yt4u:20160617234920j:plain

「ぼく」シートのCodeName(=オブジェクト名)は「Sheet1」になっていますよね。

  Sheet1.Select

はCodeNameを使ってワークシートを選択することに他ならないのですね。


試しに「Sheet1」を違う文字に書き換えてみください。

その状態で

  Sheet1.Select

とやると、そんなできるかぼけぇ、ってエクセルに怒られますよね。