マクロでのシートの選択は自動記録をすれば
Sheets(“◯×△”).select
など出てくるので特に問題なく使えているかと思いますが、
「シート名がよく変わるので毎回マクロを修正しなければならない」
「他ブックを参照させる時の書き方ってどうすればいいの?」
「他ブック開いたときに対象シートがないなどのエラーが出る」
などの場面にもぶち当たったりしますね。
ここではシート選択の「基本的な記述」と「毎回マクロを変更する必要をなくすための記述」、「よくあるエラー」について記載していきます。
基本的な記述
◆基本的な記述_1
例えば、「基本」というシートがある場合は
Sheets(“基本”).activate
訳:”基本”というシートをアクティベート(活性化)してください
でシートが選択できます。
※ シート名をダブルコーテーションでくくります。
※ シートの選択にはSelectとActivateがありますが、特定のシートを選択する場合にはどちらでも構いません。
ちなみに私は基本的にActivateで統一しています。
Selectを使用する場面としてはシートを複数選択したい場合のみとなります。
◆基本的な記述_2
シートの選択はシートの位置でも選択できます。(非表示シートがない前提)
例えば、左から順番に「マクロ用」,「基本」,「データ」といった3つのシートがあった場合
Sheets(2).activate
と記載すると左から2番目のシート(基本シート)が選択されます。
この記述は使いようによっては便利なので覚えておきましょう。
例:CSVデータをエクセル形式でオープンして、シートを選択するときなどは
sheets(1).activate と記載することにより選択可能 となります。
毎回マクロを変更する必要をなくすための記述
openメソッドの時と同様に、シート名を可変にするために、これもワークシートへ外だしします。
dim DataSN ‘SN = SheetNameの意
DataSN = sheets(“マクロ用”).range(“B3”)
sheets(DataSN).activate ‘←変数なのでダブルコーテーションは不要
end sub
よくあるエラー
よくあるのは、対象シートがない(シート名が違う)ことでのエラーが多いですね。
シート名のなかになぜかスペースが入ってたり、カッコが全角半角で相違しているなど、目視では見つけられずに悩むこともおおかったりします。
またシート名がいつの間にか変わってたりしてエラーが発生するなども避けたいですよね。
そのエラー回避方法について記載します。
※ エラー回避 = デバッグ画面がでないようにすること
例として、他ブックを開いた後に、対象となるシートを選択する場合のマクロを記述します。
dim DataPath
dim DataFN ‘FN = fileNameの意
dim DataSN ‘SN = sheetNameの意
DataPath = sheets(“マクロ用”).range(“B1”)
DataFN = sheets(“マクロ用”).range(“B2”)
DataSN = sheets(“マクロ用”).range(“B3”)
workbooks.open datapath & ”\” & DataFN
sheets(DataSN).Activate
end sub
※ DataPath,DataFNの変数について・・・別ブックを参照させるのも外だしにしています。(ブックオープンページ参照)
となりますね。
しかしながら、この場合、対象のシートがあること前提での記述となってしまっています。
そもそも対象シートがないというエラーを回避するためには、
ブックopen
↓
対象シートあるかチェック
↓
あれば選択
なければエラーメッセージ表示してマクロ強制終了
という方法にします。
dim DataPath
dim DataFN ‘FN = fileNameの意
dim DataSN ‘SN = sheetNameの意
dim sLoop ‘ループよう
dim SheetFLG ‘シートがあったかどうかのフラグ
DataPath = sheets(“マクロ用”).range(“B1”)
DataFN = sheets(“マクロ用”).range(“B2”)
DataSN = sheets(“マクロ用”).range(“B3”)
workbooks.open DataPath & ”\” & DataFN
’ブックを開いたら全シートを対象にDataSNと同じシート名のものがあるかをループでチェック
SheetFLG = false
for sloop = 1 to sheets.count ’ループをシートの数だけ実施
if sheets(sloop).name = DataSN then ’シートをシート位置の順で確認していく
SheetFLG = true
exit for
endif
next sloop
if SheetFLG = true then
’見つかった場合はなにもしない
else
’見つからなかった場合はエラーメッセージ、マクロ終了
msgbox DataSN & “シートがみつかりません。処理を終了します”
workbooks(DataFN).close false ‘開いたブックを閉じること忘れずに
exit sub
endif
sheets(DataSN).activate
end sub
for 〜 next の部分でシート名チェックを行っています。
変数のsLoopは私なりの変数の作り方で、ループ処理に使う変数には”Loop”の文字を使用するようにしているだけです。変数の文字はなんでもOKです。
1工程増えますが、これでエラーは出なくなります。
よければ参考にしてください。
※ 他にあるエラーは対象シートが開いているブックではなく、別ブックだったりする場合もあります。これはまた別ページにて説明します。