VBA シート指定攻防戦
こんにちは。
派犬事務員のコロ子です。
シートの指定方法
シートの指定方法って悩む。
①シート名で指定
Worksheets("シート名").Range("A1").Value
②位置で指定
Worksheets(1).Range("A1").Value
③オブジェクト指定
Sheet1.Range("A1").Value
簡単だからなんとなくいつもオブジェクト指定にしてるけど、シートをコピーして、元のシートを削除されると困る。直すのにはVBEエディタを開かなくちゃいけないから、ユーザーの自力修正はハードルが高い。
やっぱりシート名指定が安全なのか、と思っていたけど・・・。
Aさん:「ちょっと!!!マクロが動かないんだけど!!!」
コロ子:「どうしたんですか?」
Aさん:「昨日まではフツーに動いてたのに。今日突然動かなくなったのよ!」
見てみると、シート名が変更されたいた。
Aさん:「何が原因?またこういう事があると困るから、原因教えてくれる?」
コロ子:「シート名が変更されていたので・・・」
Aさん:「変えてないわよ!」
コロ子:「でも、変わってたから・・・」
Aさん:「変えてないわよ!」
いやいや、変えてるから。コードはシート名指定で書いてて、そのシート名と実際のシート名が違っている。
Aさん:「あっ。そう言えば、一つ心当たりがあるわ。データがいっぱいになってきたら古いデータを別のシートに移したの。コピーしたらダメなの?」
コロ子:「コピーしても大丈夫ですけど、きっとその時にシート名も変えちゃったのかもしれないですね。」
Aさん:「変えてないわよ!」
自覚症状なし。手強い。
シートをよく見てみるとこんな感じ。
どうやら、メインデータは一番左に置いて、古いデータや個別に見たいデータは右側に足していくパターンらしい。そして無意識のうちにシート名を変更することがある。
ということで
・シート名が存在するか確認し、あればシート名指定にする。
・もし存在しなければ、一番左のシートを指定する。
Dim buf As Worksheet Dim flg As Boolean '「測定データ」というシート名があるか確認する For Each buf In Worksheets If buf.Name = "測定データ" Then flg = True End If Next buf Dim ws As Worksheet If flg Then '「測定データ」シートがあればシート指定 Set ws = Worksheets("測定データ") Else 'なければ一番左のシートを指定する Set ws = Worksheets(1) End If
これでどう?
若干、心理戦的な感じが危ないかな。まーこれでしばらく様子を見よう。
コロ子:「とりあえず直しましたけど、シート名変えないでくださいね。」
Aさん:「だからっ!変えてないわよ!」
それにしてもWorksheets(1)って位置指定方法、おなじみだけど初めて使った。
こういう時の為の方法なのかな?
シートの指定方法、悩ましい。