マクロで処理をするとき,1つのワークシート上で処理をするだけでなく,様々なワークシートをまたいで処理をすることがあります。
ワークシートの名前を付ける時,アルファベット・数字・片仮名を使う時は,全角と半角を区別して使わなければいけません。
マクロ上では,全角と半角はまったく別の扱いなので,これが合ってないとシートを選択するプロシージャで,エラーになってしまいます。
それを防ぐためには,「いつも半角で扱う」と自分でルールを決めるといいと思います。
また,他のユーザーが入力することがある場合には,さらにStrConv関数で半角に変換する処理を組み込むなどの工夫が必要です。
さて,今回は,以下のようなワークシートがあったとき,特定のワークシートを指定するマクロを組んだ場合の動作を見てみましょう。
ワークシート名が半角の数字で付けてあるので,それを受けて(?),扱う変数も整数型にしてみました。
すると,下のような感じになります。
Sub ワークシートの選択1() Dim n As Integer n = InputBox("ワークシート名は?") Worksheets(n).Select End Sub |
マクロとして,エラーはでませんが,こちらが期待する結果は返ってきませんでした。 試しに,4という数字を入力すると,7というワークシートを選択してしまいます。 これは,ワークシート名で数値を使った場合,「前から何番目」という扱いになるからです。 |
それでは・・・,ということで,今度は文字列型で宣言した変数にしてみました。
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 |
このマクロでは, 入力された文字を半角に変換してから,使うようにしています。 これなら,半角だろうが全角だろうが,正常に処理できます。 |
今度は,計算結果の名前のワークシートを指定しようと思います。
つまり何らかの計算をしたら4になったので,4のワークシートを指定する,ということです。
ワークシート名が文字列なので,普通に考えると,Select Case文を使うことになるのでしょうが,それだとすごく長くなってしまいます。
もっと,短くする方法はないだろうか。
ということで,以下のようにしてみました。
Sub ワークシートの選択4() Dim n As Integer n = InputBox("ワークシート名は?") Worksheets(CStr(n)).Select End Sub |
基本構造は,1で使ったものと同じです。 計算した結果をワークシート名にするので,変数は整数型で宣言してあります。 ポイントは,CStr関数を使って,文字列に変換して,使っている点です。 |
○入力時に,全角で入力したら,どうなるのでしょうか? ・やってみるとわかりますが,整数型で変数を宣言してあるので,数値に変換されて格納されるようです。 つまり,全角でも正常に動作します。 |
ということで,ワークシートの指定方法について,いろいろと試してみました。
大切なことは,「ワークシート名は文字列である」ということです。
これさえ覚えておけば,間違いはないと思います。