セルの文字列でシートを特定するときの注意


任意のシートを特定するときは「Sheets("Sheet1")」のような書き方をします。基本です。

Sub Sample1()
    Sheets("Sheet1").Select
End Sub

では、この"Sheet1"が変数に入っていたら。

Sub Sample2()
    Dim A As String
    A = "Sheet1"
    Sheets(A).Select
End Sub

ぜんぜん問題ないです。では次。この"Sheet1"がセルに入っていたら。ここではアクティブシートのセルA1に"Sheet1"という文字列が代入されているとしましょう。

Sub Sample3()
    Sheets(Range("A1")).Select
End Sub

とうぜん、こういう発想になりますよね。でも、結果はエラーです。

もちろん「Worksheets(Range("A1"))」でもエラーです。これ、正直私にも何でエラーなのかの正確な理由はよく分かりません。てゆーか、面倒くさいので考えていません。ちなみに次のように、一度変数に入れればうまくいきます。

Sub Sample3()
    Dim A As String
    A = Range("A1")
    Worksheets(A).Select
End Sub

どうしても変数に入れたくないときは、次のようにValueプロパティをつけてやると、うまくいきます。

Sub Sample3()
    Sheets(Range("A1").Value).Select
End Sub

たぶんですけど、SheetsプロパティやWorksheetsプロパティの設計と、ただRange("A1")と書いたときの挙動によって起こるのではないかと。面倒くさいので、それ以上は考えていません。いずれにしても、セルに入力されているシート名を使うときは、一度変数に入れるか、Valueプロパティをつけると。そう覚えておきましょう。ちなみに私は、数年前これでハマった経験があります。