ワークシートの指定の仕方に注意

マクロで処理をするとき,1つのワークシート上で処理をするだけでなく,様々なワークシートをまたいで処理をすることがあります。
ワークシートの名前を付ける時,アルファベット・数字・片仮名を使う時は,全角と半角を区別して使わなければいけません。
マクロ上では,全角と半角はまったく別の扱いなので,これが合ってないとシートを選択するプロシージャで,エラーになってしまいます。
それを防ぐためには,「いつも半角で扱う」と自分でルールを決めるといいと思います。
また,他のユーザーが入力することがある場合には,さらにStrConv関数で半角に変換する処理を組み込むなどの工夫が必要です。

さて,今回は,以下のようなワークシートがあったとき,特定のワークシートを指定するマクロを組んだ場合の動作を見てみましょう。


1.整数で宣言した変数を使ってみる

ワークシート名が半角の数字で付けてあるので,それを受けて(?),扱う変数も整数型にしてみました。
すると,下のような感じになります。

Sub ワークシートの選択1()

  Dim n As Integer

  n = InputBox("ワークシート名は?")
  Worksheets(n).Select

End Sub 
マクロとして,エラーはでませんが,こちらが期待する結果は返ってきませんでした。
試しに,4という数字を入力すると,7というワークシートを選択してしまいます。

これは,ワークシート名で数値を使った場合,「前から何番目」という扱いになるからです。

2.文字列で宣言した変数を使ってみる。

それでは・・・,ということで,今度は文字列型で宣言した変数にしてみました。

Sub ワークシートの選択2()

  Dim n As String

  n = InputBox("ワークシート名は?")
  Worksheets(n).Select

End Sub 
今度は,思っていた通りの処理ができました。

ただ,当たり前のことですが,全角で入力するとエラーになってしまいます。
これを回避するために,下のようにしてみました。
Sub ワークシートの選択3()

  Dim n As String

  n = InputBox("ワークシート名は?")
  n = StrConv(n, vbNarrow)
  Worksheets(n).Select

End Sub
このマクロでは, 入力された文字を半角に変換してから,使うようにしています。

これなら,半角だろうが全角だろうが,正常に処理できます。

3.計算結果のワークシートを選択したい。

今度は,計算結果の名前のワークシートを指定しようと思います。
つまり何らかの計算をしたら4になったので,4のワークシートを指定する,ということです。
ワークシート名が文字列なので,普通に考えると,Select Case文を使うことになるのでしょうが,それだとすごく長くなってしまいます。
もっと,短くする方法はないだろうか。
ということで,以下のようにしてみました。

Sub ワークシートの選択4()

  Dim n As Integer

  n = InputBox("ワークシート名は?")
  Worksheets(CStr(n)).Select

End Sub
基本構造は,1で使ったものと同じです。
計算した結果をワークシート名にするので,変数は整数型で宣言してあります。

ポイントは,CStr関数を使って,文字列に変換して,使っている点です。
○入力時に,全角で入力したら,どうなるのでしょうか?
・やってみるとわかりますが,整数型で変数を宣言してあるので,数値に変換されて格納されるようです。
 つまり,全角でも正常に動作します。 


ということで,ワークシートの指定方法について,いろいろと試してみました。
大切なことは,「ワークシート名は文字列である」ということです。
これさえ覚えておけば,間違いはないと思います。