エクセルマクロでのシート選択の方法

マクロでのシートの選択は自動記録をすれば

Sheets(“◯×△”).select

など出てくるので特に問題なく使えているかと思いますが、

「シート名がよく変わるので毎回マクロを修正しなければならない」
「他ブックを参照させる時の書き方ってどうすればいいの?」
「他ブック開いたときに対象シートがないなどのエラーが出る」

などの場面にもぶち当たったりしますね。

ここではシート選択の「基本的な記述」と「毎回マクロを変更する必要をなくすための記述」、「よくあるエラー」について記載していきます。

基本的な記述

◆基本的な記述_1

例えば、「基本」というシートがある場合は

Sheets(“基本”).activate
訳:”基本”というシートをアクティベート(活性化)してください

でシートが選択できます。
※ シート名をダブルコーテーションでくくります。

※ シートの選択にはSelectとActivateがありますが、特定のシートを選択する場合にはどちらでも構いません。
ちなみに私は基本的にActivateで統一しています。
Selectを使用する場面としてはシートを複数選択したい場合のみとなります。

◆基本的な記述_2

シートの選択はシートの位置でも選択できます。(非表示シートがない前提)

例えば、左から順番に「マクロ用」,「基本」,「データ」といった3つのシートがあった場合

Sheets(2).activate

と記載すると左から2番目のシート(基本シート)が選択されます。
この記述は使いようによっては便利なので覚えておきましょう。

例:CSVデータをエクセル形式でオープンして、シートを選択するときなどは
   sheets(1).activate と記載することにより選択可能 となります。

毎回マクロを変更する必要をなくすための記述

openメソッドの時と同様に、シート名を可変にするために、これもワークシートへ外だしします。

シート名指定
Sub シート名指定
 dim DataSN ‘SN = SheetNameの意
 DataSN = sheets(“マクロ用”).range(“B3”)
 sheets(DataSN).activate ‘←変数なのでダブルコーテーションは不要
end sub

よくあるエラー

よくあるのは、対象シートがない(シート名が違う)ことでのエラーが多いですね。
シート名のなかになぜかスペースが入ってたり、カッコが全角半角で相違しているなど、目視では見つけられずに悩むこともおおかったりします。

またシート名がいつの間にか変わってたりしてエラーが発生するなども避けたいですよね。
そのエラー回避方法について記載します。
※ エラー回避 = デバッグ画面がでないようにすること

例として、他ブックを開いた後に、対象となるシートを選択する場合のマクロを記述します。

スポンサーリンク
通常の記述
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

対象シートあるかチェック

あれば選択
なければエラーメッセージ表示してマクロ強制終了

という方法にします。

エラー回避
sub シート選択_エラー回避
 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工程増えますが、これでエラーは出なくなります。
よければ参考にしてください。


※ 他にあるエラーは対象シートが開いているブックではなく、別ブックだったりする場合もあります。これはまた別ページにて説明します。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。