ご存知のように、Excelファイルには、シートがあり、シートは一つのExcelファイルに複数持たせることができます。
何か作業をする時は、必ず一つシートを選択して作業します。
今回はExcel VBAを使って、シートを選択する処理について、記事を書きたいと思います。
選択シートで処理をする
現在、選択しているシートで処理をする場合には、WorkbookオブジェクトのActiveSheetプロパティを使います。
活動中のシート、つまりアクティブになっているシートのことだから、「ActiveSheet」プロパティ。
意味をしっかり理解していれば、覚えられるプロパティですね。
また、Workbookオブジェクトは省略することができます。
省略して書かなければ、今、開いているブック(Workbookオブジェクト)の「ActiveSheet」プロパティということになります。
ActiveSheet.Range("A1").value = "サンプル"
上のコードでは、選択しているシートのセル「A1」に「サンプル」という文字列を入力しています。
このマクロを実行すると、特定のシートに限定して処理するのではなく、選択しているシートに対して、処理を実行します。
次項では、特定のシートに対し、処理を実行する方法を解説していきます。
指定したシートで処理をする
ここでは、選択しているシートではなく、指定した特定のシートに対し処理をする方法を解説します。
選択しているシートについては、「ActiveSheet」プロパティを使うことは先ほど説明しました。
特定のシートを指定したい場合は、「Worksheets」プロパティを使います。
「Worksheets」プロパティでは、「シート番号」か、「シート名」を引数にすることで、特定のシートを指定することができます。
例えば、左から3番目のシートのセル「A1」に「サンプル」という文字列を入力する場合は下のようになります。
Worksheets(3).Range("A1").value="サンプル"
また、「サンプル」という名前のシートのセル「A1」に「マクロ」という文字列を入力する場合は下のようになります。
Worksheets("サンプル").Range("A1").value="マクロ"
Worksheetsプロパティの引数にシート名を指定する場合は、文字列扱いをしなければなりませんので、ダブルクオーテーションを忘れずに。
このように「Worksheets」プロパティは直感的に使用することができますので、覚えやすいし、とても簡単だと思います。
それでは、現在、選択しているシートのデータを別の「サンプル」シートにデータを転記したい場合は、どのようなコードになるでしょうか。
Activesheet.Range("A1").value = "マクロ"
Worksheet("サンプル").Range("A1").value = Activesheet.Range("A1").value
上のコードでは、1行目で選択しているシートのセル「A1」に「マクロ」という文字列を入力しています。
2行目では、転記元セル「A1」のデータを「サンプル」シートの「A1」に転記しています。
別シートへの転記処理でした。
Worksheetsプロパティをオブジェクトに
ちょっと工夫することで、わかりやすいコードを書くことができます。
その工夫とは、Worksheetsプロパティをオブジェクトにしてしまうことです。
Worksheetsプロパティを宣言したオブジェクト変数に置き換えてしまうと言った方が簡単かもしれません。
下のコードをご覧ください。
Dim ws1 as Worksheet
Dim ws2 as Worksheet
Set ws1 = Worksheets("サンプル1")
Set ws2 = Worksheets("サンプル2")
ws1.Range("A1").value="マクロ"
ws2.Range("A1").value = ws1.Range("A1").value
例えば、「サンプル1」と「サンプル2」という名前のシートがあったとします。
最初に、これらシートに置き換えるためのオブジェクト変数「ws1」と「ws2」を用意しましょう。
1行目と2行目で、「Dim」を使って「Worksheet」オブジェクトとしての変数を宣言しています。
次に、4行目と5行目で、「Set」を使って、オブジェクト変数に、実際のオブジェクト(シート)を置き換えます。
普通の変数に値を入れる方法と少し違いますので注意が必要ですね。
これで、「サンプル1」というシートをオブジェクト「w1」に、「サンプル2」というシートをオブジェクト「w2」に置き換えることができました。
7行目でシート「サンプル1」のセルA1に「マクロ」という文字列を入力しています。
ワークシートオブジェクト「ws1」を使っていることに注目しましょう。
また、8行目ではシート「サンプル1」のセルA1のデータを「サンプル2」のセルA1に転記しています。
ここでも、ワークシートオブジェクトである「ws1」と「ws2」を使っていることに注目しましょう。
要は一度、オブジェクト変数を宣言して、オブジェクトに置き換えてしまえば、オブジェクト変数を使用できますので、格段に見やすいコードにすることができます。
また、宣言したオブジェクト変数はスコープの範囲内で有効になりますので、シート名を変更した場合でも「Set ~」の一箇所を変更するだけですみます。
メンテナンスにもとても有効なのです。
処理結果が正しければよいという方もいらっしゃいますが、プログラムの可読性、メンテナンスのしやすさというのはとても大事です。
自分で書いたはずのコードが、時間を置いて見直してみると何を書いているのか、わからなかったりすることはよくあることです。
また、思い通りに動かない不具合が発生した場合、修正する箇所が多ければ多いほど、新たな不具合の原因になったりするものです。
プログラミングするからには、誰もが読みやすい、スマートなコードを心がけたいものですね。