派遣事務員の迷走

派遣事務員コロ子。会社の犬。顔出しNG。常に迷走している。

VBA シート指定攻防戦

こんにちは。
派犬事務員のコロ子です。

シートの指定方法

シートの指定方法って悩む。

①シート名で指定
 Worksheets("シート名").Range("A1").Value

②位置で指定
 Worksheets(1).Range("A1").Value

③オブジェクト指定
 Sheet1.Range("A1").Value

簡単だからなんとなくいつもオブジェクト指定にしてるけど、シートをコピーして、元のシートを削除されると困る。直すのにはVBEエディタを開かなくちゃいけないから、ユーザーの自力修正はハードルが高い。
やっぱりシート名指定が安全なのか、と思っていたけど・・・。


Aさん:「ちょっと!!!マクロが動かないんだけど!!!」

コロ子:「どうしたんですか?」

Aさん:「昨日まではフツーに動いてたのに。今日突然動かなくなったのよ!」

見てみると、シート名が変更されたいた。

Aさん:「何が原因?またこういう事があると困るから、原因教えてくれる?」

コロ子:「シート名が変更されていたので・・・」

Aさん:「変えてないわよ!」

コロ子:「でも、変わってたから・・・」

Aさん:「変えてないわよ!」

いやいや、変えてるから。コードはシート名指定で書いてて、そのシート名と実際のシート名が違っている。

Aさん:「あっ。そう言えば、一つ心当たりがあるわ。データがいっぱいになってきたら古いデータを別のシートに移したの。コピーしたらダメなの?」

コロ子:「コピーしても大丈夫ですけど、きっとその時にシート名も変えちゃったのかもしれないですね。」

Aさん:「変えてないわよ!」

自覚症状なし。手強い。

シートをよく見てみるとこんな感じ。

f:id:SNegishi:20200926163751p:plain

どうやら、メインデータは一番左に置いて、古いデータや個別に見たいデータは右側に足していくパターンらしい。そして無意識のうちにシート名を変更することがある。
ということで

・シート名が存在するか確認し、あればシート名指定にする。
・もし存在しなければ、一番左のシートを指定する。

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)って位置指定方法、おなじみだけど初めて使った。
こういう時の為の方法なのかな?
シートの指定方法、悩ましい。