マクロ(Excel VBA)は、Exel 画面上での操作を自動化する機能です。
Excel 画面は多数のセルによって構成されているものです。
そのため、セルから数値を読み込んだりセルに数値を書き出したりするためには、どのセルを操作するのか「セルを指定」しなければなりません。
今日は、マクロ(Excel VBA)でセルを指定する方法について説明したいと思います。
1、Worksheet オブジェクト、Range オブジェクト
Worksheet オブジェクト、Range オブジェクト
VBA にはオブジェクトという概念が出てきます。
オブジェクトというのは、「操作対象」のことを言います。
そして、このオブジェクトには以下のようなものがあります。
・ワークブック
・ワークシート
・セル
・図形
・
・
Excel VBA ではこれらのオブジェクトを操作して目的を達成します。
オブジェクトにはたくさんの種類のものがありますが、ワークシートとセルの2つのオブジェクトを操作すれば事足りることも多いです。
Excel ファイルを作成した後、1枚1枚のワークシートの中身を作成しますが、その各々のワークシートのことを「Worksheet オブジェクト」、そしてワークシートの中にある1つ1つのセルのことを「Range オブジェクト」と呼びます。
1つの「Worksheet オブジェクト」は、多数の「Range オブジェクト」で構成されます。
ワークシート、セルの指定
特定のセルを指定
例えばファイルの中に、「テスト」という名前のワークシートを作成したとします。
「テスト」シートの中のセル「A1」を指定する場合、次のように記述します。
Worksheets(“テスト”).Cells(1, 1)
●ワークシートの指定は、Worksheets(“ワークシート名”)
●セルの指定は、Cells(行番号, 列番号)
のように記述し、Worksheets(“テスト”).Cells(1, 1) とした場合は
「テスト」という名前のワークシートの中の、「セルA1」を指定していることになります。
*ワークシート名を ” “で囲うことを忘れないようにしましょう。
なお、セルの指定方法ですが Worksheets(“テスト”).Cells(1, “A”) のように列番号を ” ” で囲ってアルファベットで書いても同じように、セル「A1」を指定していることになります。
セルを範囲で指定
いくつものセルを範囲で指定する場合について説明します。
「テスト」シートの中のセル「A1~C10」を指定する場合、次のように記述します。
Worksheets(“テスト”).Range(“A1:C10”)
●ワークシートの指定は、Worksheets(“ワークシート名”)
●セルの指定は、Range(“範囲の左上のセル : 範囲の右下のセル”)
のように、Range を使うときは範囲の左上のセルと右下のセルを示すことで範囲を指定しています。
セルに数値を出力する
さて、指定したセルに数値を出力してみましょう。
「テスト」という名前のワークシートの中の「セルA1」に55と出力したい場合には、VBE(エディタ)を開いて(Alt + F11)以下のようなコードを記述して実行すればできます。
——–
Sub Test()
Worksheets(“テスト”).Cells(1, 1) = 55
End Sub
——–
*マクロ名は「Test」としていますが何でも良いです。
また、「テスト」という名前のワークシートの中の「A1~C10」に55と出力したい場合には、VBE(エディタ)を開いて(Alt + F11)以下のようなコードを記述して実行すればできます。
——–
Sub Test()
Worksheets(“テスト”).Range(“A1:C10”) = 55
End Sub
——–
2、売上高と売上原価から原価率・利益率を計算するマクロを作る、どのワークシートがアクティブなのか見失わないようにする
さて、売上高と売上原価から原価率、利益率を計算するコードを書いてみたいと思います。
これぐらいの計算であれば、本来VBA を使う必要はありませんが敢えて使ってみます。
売上高と売上原価の入力と原価率、利益率の出力を同じワークシート内で行う場合
売上高と売上原価を入力して原価率、利益率を計算してから同じワークシート内に出力する場合を考えてみます。
次のように、「原価率、利益率計算」シートの中の「セルD4」に売上高を「セルD5」に売上原価を入力し、セル「D6」に原価率をセル「D7」に利益率を出力するコードを考えてみます。
VBE を開いて、次のようなコードを記述すれば達成できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Test() Dim Uriage '売上高' Dim Urigen '売上原価' Dim Riekiritsu '利益率' Dim Genkaritsu '原価率' Uriage = Worksheets("原価率、利益率計算").Cells(4, 4) '売上高の読込み「セルD4」' Urigen = Worksheets("原価率、利益率計算").Cells(5, 4) '売上原価の読込み「セルD5」' Genkaritsu = Round(Urigen / Uriage, 3) '原価率の計算 原価率=売上原価/売上高' Riekiritsu = 1 - Genkaritsu '利益率の計算 利益率=1-原価率' Worksheets("原価率、利益率計算").Cells(6, 4) = Genkaritsu '原価率の出力' Worksheets("原価率、利益率計算").Cells(7, 4) = Riekiritsu '利益率の出力' End Sub |
売上高、売上原価を入力してマクロを実行してみましょう。
原価率を表す変数「Genkaritsu」の計算は「Round(Urigen / Uriage, 3) 」のように記述しました。
Round は指定した桁で四捨五入する関数です。
Round(数値, 桁数) のように記述し、「数値」には四捨五入したい数値を入れ, 「桁数」には四捨五入して何桁目までを表示するかの桁数を入れます。
「Round(Urigen / Uriage, 3) 」とすれば、「Urigen / Uriage」の計算結果を四捨五入して小数点以下第3位まで表示しなさいという意味になります。
なお、この計算の場合のように入力も出力も全て1枚のワークシート内で行えるような場合には、セルを指定するときにコード内のワークシートの指定を省略することができます。
Dim を使って変数を定義した後に、「Worksheets(“原価率、利益率計算”).Activate」と記述することで「原価率、利益率計算 」シートをアクティブにして、それ以降の操作をそのシート上で行うことができます。
アクティブというのは、「操作対象となっている」ことを意味します。
こうすることで「Worksheets(“ワークシート名”).Cells(行番号, 列番号)」のように記述していた部分を、「Cells(行番号, 列番号)」とすればよくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub Test() Dim Uriage '売上高' Dim Urigen '売上原価' Dim Riekiritsu '利益率' Dim Genkaritsu '原価率' Worksheets("原価率、利益率計算").Activate '「原価率、利益率計算」シートをアクティブにする' Uriage = Cells(4, 4) '売上高の読込み「セルD4」' Urigen = Cells(5, 4) '売上原価の読込み「セルD5」' Genkaritsu = Round(Urigen / Uriage, 3) '原価率の計算 原価率=売上原価/売上高' Riekiritsu = 1 - Genkaritsu '利益率の計算 利益率=1-原価率' Cells(6, 4) = Genkaritsu '原価率の出力' Cells(7, 4) = Riekiritsu '利益率の出力' End Sub |
このように「原価率、利益率計算 」シートをアクティブにすることによって、他のシートを開きながらこのコードを実行しても、「原価率、利益率計算 」シート内での入力、計算、出力を行うことができるのです。
1つのワークシートのみでやりたいことが達成できる場合は、このようにした方がセルを指定するコードが長くならずにスッキリします。
売上高と売上原価の入力と原価率、利益率の出力を異なるシート内で行う場合
さて、売上高と売上原価を「入力値」シートに入力して、原価率と利益率を計算して「原価率、利益率計算 」シートに出力してみたいと思います。
売上高と売上原価を入力する「入力値」シート です↓
原価率と利益率を出力する「原価率、利益率計算」シートです↓
次のようなコードを記述すれば達成できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Test() Dim Uriage '売上高' Dim Urigen '売上原価' Dim Riekiritsu '利益率' Dim Genkaritsu '原価率' Uriage = Worksheets("入力値").Cells(4, 4) '売上高の読込み「セルD4」' Urigen = Worksheets("入力値").Cells(5, 4) '売上原価の読込み「セルD5」' Genkaritsu = Round(Urigen / Uriage, 3) '原価率の計算 原価率=売上原価/売上高' Riekiritsu = 1 - Genkaritsu '利益率の計算 利益率=1-原価率' Worksheets("原価率、利益率計算").Cells(4, 4) = Genkaritsu '原価率の出力' Worksheets("原価率、利益率計算").Cells(5, 4) = Riekiritsu '利益率の出力' End Sub |
「入力値」シート内で売上高、売上原価を入力してマクロを実行してみましょう。
「原価率、利益率計算」シート内に、原価率と利益率が出力されます。
さて、このケースのようにシート間をまたいで入出力をする場合は、必ず下のように↓シート名を指定してからセルを指定しなければいけません。
Worksheets(“ワークシート名”).Cells(行番号, 列番号)
セルを指定するだけだと、どのシートのセルを指定しているか分からないからです。
(マクロを実行する前に開いていたアクティブなシートのセルのことだとみなして実行されてしまいます。)
ただ、次のように Activate を使って操作したいシートをアクティブにしてからであれば、セルのみの指定でも同じことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub Test() Dim Uriage '売上高' Dim Urigen '売上原価' Dim Riekiritsu '利益率' Dim Genkaritsu '原価率' Worksheets("入力値").Activate Uriage = Cells(4, 4) '売上高の読込み「セルD4」' Urigen = Cells(5, 4) '売上原価の読込み「セルD5」' Genkaritsu = Round(Urigen / Uriage, 3) '原価率の計算 原価率=売上原価/売上高' Riekiritsu = 1 - Genkaritsu '利益率の計算 利益率=1-原価率' Worksheets("原価率、利益率計算").Activate Cells(4, 4) = Genkaritsu '原価率の出力' Cells(5, 4) = Riekiritsu '利益率の出力' End Sub |
売上高と売上原価の値を読み込む前に「Worksheets(“入力値”).Activate」によって「入力値」シートをアクティブにしています。
また、原価率と利益率の計算結果を出力する前に「Worksheets(“原価率、利益率計算”).Activate」によって「原価率、利益率計算」シートをアクティブにしています。
3、まとめ
マクロ(Excel VBA)を使ってワークシートとセルを指定する方法について説明しました。
どのワークシートのどのセルを操作しようとしているのか見失わないようにしましょう。
自分が意図している計算をするためには、これらを整理することが大切です。