ワークブック名を明示する
ワークブックを操作するときは、ブック名を明示して処理を記述しましょう。
1 2 |
'OK例 Workbooks("生徒一覧").Save |
次のプログラムのように、インデックス(番号)でワークブックを指定することもできます。でも、ユーザがファイルを開いた順番によって、対象となるファイルが変わってしまいます。
そのため、インデックスでのワークブックの指定は、できる限りしないようにしましょう。
1 2 |
'NG例 Workbooks(1).Save |
アクティブブックは変数にセット
ユーザ操作などによって、アクティブブックは変化する可能性があります。
そのため、アクティブブックを操作する時は、アクティブブックを変数に格納し、変数に対して処理を行いましょう。
そうすることで、仮にアクティブブックが変化しても、変数の値は変化しないので、プログラムの処理は影響を受けません。
1 2 3 4 5 6 7 |
Dim wbTargetBook As Workbook '対象ブック Set wbTargetBook = ActiveWorkbook '←変数にActiveWorkbookを格納 With wbTargetBook '←ActiveWorkbookではなく、変数に対して処理を記述 '処理 End With |
ワークシート名を明示する
ワークシートを操作するときは、シート名を明示して処理を記述しましょう。
1 2 |
'OK例 Workbooks("生徒一覧").Worksheets("1年1組").Range("A1").Value = "あいうえお" |
次のプログラムのように、インデックス(番号)でワークシートを指定することもできますが、ユーザの操作でシートの順番は変わるので、対象シートも変わってしまいます。そのため、インデックスでのワークシートの指定は、できる限りしないようにしましょう。
1 2 |
'NG例 Workbooks("生徒一覧").Worksheets(1).Range("A1").Value = "あいうえお" |
アクティブシートは変数にセット
ユーザ操作などによって、アクティブシートは変化する可能性があります。
そのため、アクティブシートを操作する時は、アクティブシートを変数に格納し、変数に対して処理を行いましょう。
そうすることで、仮にアクティブシートが変化しても、変数の値は変化しないので、プログラムの処理は影響を受けません。
1 2 3 4 5 6 7 |
Dim wsTargetSheet As Worksheet '対象シート Set wsTargetSheet = ActiveSheet '←変数にActiveSheetを格納 With wsTargetSheet '←ActiveSheetではなく、変数に対して処理を記述 '処理 End With |
シート操作する時はブックから指定する
次のようにブックから指定しましょう。
1 2 |
'OK例 Workbooks("生徒一覧").Worksheets("1年1組") |
次のように、シート名でいきなり指定すると、VBAがシートを探す対象ファイルはアクティブなブックとなります。ユーザ操作によってアクティブなブックは変化するので、対象シートが存在しないなどエラーが発生する可能性があります。
1 2 |
'NG例 Worksheets("1年1組") |
セル操作する時はブックとシートを指定する
セルを操作する時も、上で紹介した「シート操作」の考えと同じです。ブックとシートを指定しましょう。
1 2 |
'OK例 Workbooks("生徒一覧").Worksheets("1年1組").Range("A1").Value = "あいうえお" |
次のように、いきなりRangeやCellsを使うと、アクティブなシートのセルが対象となるので、ユーザ操作によって書き込まれるシートが変化してしまう可能性があります。
1 2 |
'NG例 Range("A1").Value = "あいうえお" |
今回のように、rangeの前に毎回ブック名、シート名を記述するとプログラムが見にくくなってしまいます。
そのため、ブック名とシート名の部分はwith句に記述して、見やすいプログラムにしましょう。