ITで業務自動化を実現する(1) 業務の自動化による効率化を実現するためのExcelVBAの基礎
この連載ではエクセルのマクロ機能やRPAを活用して、業務効率化をどう実現するかを考えていきます。第一回は、身近にありながらあまり活用できていない方も多いExcelVBAの基礎について説明します。
ExcelVBAという言葉を聞いたことがある方は多いと思います。
マクロ機能に関係あるということくらいは知っていても、実際にどういうものかはわからないという方もいると思います。
そこで今回は、ExcelVBAの概要と具体的な使い方について見ていきたいと思います。
目次
マクロとはなにか
VBAの説明の前に、エクセルのマクロ機能について簡単にご説明させていただきます。
簡単に言うと「エクセル上の操作を記録して、必要なときに実行させることができる」機能です。
業務の中でエクセル上でよく行う操作を記録しておけば、次からはボタンひとつで同じ操作を自動的に実行してくれるという便利な機能です。
VBAとはなにか
VBAはVisual Basic for Applicationの略で、ExcelやWordなどOfficeアプリケーションに付属されている「マクロ言語」のことを言います。
マクロの機能を実現させるためのプログラミング言語となります。
エクセルにあるVBE(Visual Basic Editor)というVBAを編集するための機能に記述します。
用語をまとめますと
マクロ:一連の操作を記録して必要なときに実行させることができる機能
マクロの記録:エクセルで行った作業を自動で記録してくれる機能
VBA:マクロの機能を実行させるためのプログラミング言語
VBE:VBAを編集するための機能(エディター)
となります。
ExcelVBA使う前に
VBEを使うための準備
マクロを使うには、まずExcelの「開発」タブを表示させる必要があります。
ファイル→オプション→リボンのユーザー設定
で、「開発」にチェックを入れると、開発タブが表示されます。
開発タブで表示される機能から、「Visual Basic」を選択すると、VBEが立ち上がります。
そのVBE内でVBAを記述して、マクロを作成していきます。
まずは簡単なマクロを作成してみる
エクセルにはゼロからVBAを記述しなくても、「マクロの記録」という機能があります。
例えば
セルA1に「こんにちは」、セルA2に「ありがとう」、セルA3に「さようなら」と記述したあと、その3つのセルをC1~C3にコピーペーストをする
という一連の作業があるとします。
これをマクロに記録するためには
「開発」タブにある「マクロの記録」ボタンを押して、マクロ名を決めて、OKを押したあと、上記の操作を実施し、「記録終了」を押せば、マクロが完成します。
「マクロ」ボタンを押し、編集を選ぶと、その操作のVBAを確認することができます。
画面の説明
改めて、VBEの画面を説明します。
この図を見ながら、それぞれの文を説明します。
モジュール
VBAを記録しておく場所です。ここにプログラムを記述します。
プロシージャ
プログラムのグループ単位のことです。
ここで書かれているのはSubプロシージャと呼ばれるもので、
SubからEnd Subまでのことを指します。
この中に様々なコードを書いていくのですが、この図に書かれている内容を説明しますと
Range(“A1”).Select
Range(“セルの番地”) は、セルの範囲を表します。(Rangeオブジェクトと呼ばれる)
Select は指定したセルを選択します。(Selectメソッドと呼ばれる)
つまりこのコードでセルA1を選択することを意味します。
Activecell.FormulaR1C1
Activecell は、現在選択しているセルを指します。(Activecellプロパティと呼ばれる)
Formula は、その右側の「=」のあとに書かれた文字を入力します(Formulaプロパティ)
R1C1というのは入力形式のことです。
これらを組み合わせて
Range(“A1”).Select
Activecell.FormulaR1C1=”こんにちは”
これで、セルA1に「こんにちは」という文字が書き込まれます。
ExcelVBAで使われる基本的な用語の説明と動作
オブジェクトとは
セル、ワークブック、ワークシート、グラフを総称してオブジェクトと呼びます。
先ほどありましたRange(“A1”)はRangeオブジェクトと呼ばれますが、これはあくまで場所を示しているだけであり、これだけでそのセルに書かれている値を指すことにはなりません。
プロパティとは
プロパティとは書式やセルの幅、セルの値などを指します。
オブジェクト名.プロパティ名
という記述になります。
例えば、セルA1の値は
Range(“A1”).value
という記述になります。
セルA1の値を取得してメッセージボックスで表示したい場合は
MsgBox Range(“A1”).value
と記述すると、下図のようにA1に書かれている「こんにちは」という値がメッセージボックスで表示されます。
また、マクロを実行することで空欄のセルにプロパティを設定することもできます。
その場合は
オブジェクト名.プロパティ名=設定値
という記述になります。
例えば
Range(“A1:D4”).Value=100
と記述であれば、A1からD4までのすべてのセルに「100」が設定されます。
メソッドとは
オブジェクトに対し削除やコピーなどの動作を行う場合、その動作をメソッドと呼びます。
オブジェクト名.メソッド名
と記述して、オブジェクトをどうするかを表します。
わかりやすい例でいういと、セルA1に書かれている値を削除する場合
Range(“A1”).ClearContents
と記述すれば値が消えます。
Range(“A1:D4”).ClearContents
というように範囲指定して削除することも可能です。
ワークブックの操作について
マクロ機能を使って、新しいワークブックを開いたり、複数開いている場合に操作するブックを指定したり、ファイル名を指定して保存することなどの操作が可能です。
Workbooks.Add
で新しいワークブックを開きます。
複数のワークブックが開いている状態で、操作したいワークブックを指定するときは、Activateメソッドを使います。
Workbooks(“Book1”).Activate
と記述すると、Book1という名前のワークブックがアクティブになります。
ワークブックを保存するときは、Saveメソッドを使います。
Workbooks(“Book1”).Save
これでBook1が保存されます。
ファイル名を変更して保存する場合は
Workbooks(“Book1”).SaveAs Filename:”変更後”
と記述すると、変更後というファイル名で保存されます。
既に作成して保存してあるワークブックを開く場合は
Workbooks.open Filename=(ファイルの保存してあるアドレス)
と記述します。
ワークシートの操作について
ワークシートの操作も同様にVBAで記述することで操作可能です。
WorkSheets.Add
で新しいワークシートを作成します。
複数のワークシートがある場合は
Worksheets(“Sheet1”).Activate
で操作したいシートをアクティブにします。
シートを削除する場合は
WorkSheets(“sheet1”).Delete
と記述します。これはDeleteメソッドになります。
シートの名前を変更するには
WorkSheets(“sheet1”).Name=変更後
と記述します。これはNameプロパティになります。
Book1のSheet1を新しいBook2を作成してその中のシートにコピーする方法は
Workbooks(“Book1”).Sheets(“Sheet1”).Copy
と記述します。すると、新しくBook2が作成され、そこにSheet1がコピーされています。
セルの操作について
セルを指定したり、移動したりするための記述を見ていきます。
現在アクティブになっているセルから下に5、右に3の位置にあるセルをアクティブにするには
ActiveCell.Offset(5,3).Activate
と記述します。
下方向への移動は行方向の移動(行番号1、2、3・・・)、右方向への移動は列方向の移動(列番号A、B、C・・・)と呼びます。
特定のセルから移動させる場合はRangeプロパティを使って
Range(“A1”).offset(5,3).Activate
と記述します。
ここまで、基本的なVBAの書き方、ワークブックやワークシートの操作について説明してきました。
ここから条件分岐とループ処理の記述について見てみます。
条件分岐(If~Then)
条件が1つで、その条件を満たすとき
条件分岐とは、例えばセルA1に値が存在しない場合はセルを下方向に移動する、などのように、このような場合はこうするというように条件によって操作を変えることができる方法です。
If 条件式 Then
条件式を満たした場合に実行される処理
End If
という記述になります。
ここで、変数について少し見ていきたいと思います。
変数aがあるとします。
a=0
という記述がある場合、VBAにおいては、
「aが0である」という意味ではなく、「変数aに0を代入する」という意味になります。
a=5
a=a+a
a=a+1
という記述がある場合、最終的にaは11となります。
こうした変数を使うためには、変数の宣言を行う必要があります。
よく使う変数の宣言として
Dim 変数名 As データ型
という記述があります。
これは、変数aをデータ型で宣言する、ということになります。
具体例を見てみましょう。
Sub 変数テスト()
Dim a As Integer ‘変数aを整数型で宣言
a=100 ‘変数aに100を代入
MsgBox a ‘「100」をメッセージボックスで表示させる
End Sub
(「’」で書かれた部分は下図のように緑で表示され、VBAに構文には影響せず、備考的な使われ方をします。
ここでは「100」を表示させるために整数型「Interger」を使いましたが、「おはようございます」などのような文字列を表示させるためには、変数aを文字列で宣言する必要があります。その場合には文字列型「String」を使います。文字列は「””」でくくります。
Dim a As String
a=”おはようございます”
MsgBox a
整数型と文字列型を同時に宣言する場合は
Dim a As Integer , b As string
a=100
b=”おはようございます”
MsgBox a & b
この変数とIf文を組み合わせて、
変数aに5を、変数bに”をセルA2に入力しました”を代入して、
aが10より小さいときセルA2にaの値を入力して
メッセージボックスで「(aの値)をセルA2に入力しました」
と表示するVBAを作成します。
Dim a As Integer, b As String
a = 5
b = “をセルA2に入力しました”
If a < 10 Then
Range(“A2”).Value = a
MsgBox a & b
End If
ここではa<10のように、aが10より小さいときという「比較演算子」を使っています。
ほかにも「a=b」(aとbは等しい)、「a<=b」(aはb以下)、「a<>b」(aとbは等しくない)などがあります。
また、And、Or、Not、のような「論理演算子」もあり、
「a>0 And a<=5」(aは0より大きく、かつ、5以下)、「a=10 Or a=20」(aは10、または、20)、「Not a = 100」(aは100ではない)と記述します。
条件が1つでその条件を満たす場合と満たさない場合があるとき
条件分岐では必ずしも条件どおりに進むわけではありません。例えば上の例でいうと、aが10より大きい場合、その処理方法について記載されていません。
その条件が正しくないときにどう処理するのかを示す方法を見てみます。
If 条件式 Then
条件式が真(True)の場合に実行される処理
Else
条件式が偽(False)の場合に実行される処理
End If
と記述します。
Dim a As Integer, b As String
a = 20
b = “をセルA2に入力しました”
If a < 10 Then
Range(“A2”).Value = a
MsgBox a & b
Else
Range(“B2”).Value = a
MsgBox a & ”は10以上のためセルB2に入力しました”
End If
条件が2つ以上の場合
更に条件式が増える場合は「ElseIf文」を使います。
If 条件式その1 Then
条件式その1が真(True)の場合に実行される処理
ElseIf 条件式その2 Then
条件式その2が真(True)の場合に実行される処理
Else
条件式その1と条件式その2が偽(False)の場合に実行される処理
End If
という記述になります。
ループ処理(For~Next)
ループ処理とは、同じ処理を繰り返すことです。何回も同じ処理を繰り返す必要があるときにその数だけプログラムを書くのではなく、ループ処理の構文を使うことで、指定した回数だけ同じ処理を繰り返すことができます。
書き方は
For カウンタ変数 = 初期値 To 最終値
繰り返す処理
Next カウンタ変数
となります。
カウンタ変数とは、処理が繰り返されるごとに1ずつ足されていく値のことをいいます。
実際にVBAを記述してみます。
Sub 繰り返しテスト()
For i = 1 To 3
MsgBox i & “回目”
Next i
End Sub
初期値1で最終値3なので、1回目から3回目までメッセージボックスが表示されます。
この構文を使って、エクセルのセルに値を書き込む処理を書いてみます。
For i =1 To 10
Cells(i,1).Value = i
Next i
ここに出てくる「Cells」というのは、セルの位置を示すプロパティで、
Cells(行番号,列番号)と記載します。
Cells(1,1)はセルA1、Cells(10,1)はセルA10となります。
この構文の意味は、
セルA1からA10までに1から10の数字を入れる
ということになります。
基点としたいセルがある場合は
Range(“B3”).Cells(i,1).Value = i
とRangeオブジェクトを使うと、B3からB12までに1から10の数字が入ります。
また、カウンタ変数の値を1ずつではなく、複数ずつ進めたいときは
For i = 1 To 101 Step 10
と記述すると、
1→11→21→・・・→101
となります。
関数
送付状などをマクロを活用して作成する場合、日付も自動で入力されるほうが便利です。
ここでは、日付や時刻の関数を見てみます。
セルA1に日付を入力するには
Range(“A1”).Value = Date
と記述します。
セルB1に年を、B2に月を、B3に日を分けて入力するには
Range(“B1”).Value = Year(Date)
Range(“B2”).Value = Month(Date)
Range(“B3”).Value = Day(Date)
と分けて記述します。
現在時刻を入力するには
Range(“C1”).Value = Time
日付と時刻を入力するには
Range(“D1”).Value = Now
時間と分と秒を分ける場合は
Range(“E1”).Value = Hour(Now)
Range(“E2”).Value = Minute(Now)
Range(“E3”).Value = Second(Now)
と記述します。
まとめ
エクセルを使って業務を行っていて、複数のブックやシートをまたいでコピー・アンド・ペーストなどの単純作業を数多くこなすケースや、経営資料作成のために複雑な操作を毎回苦労しながら行っているケースはあると思います。
そのような場合は、マクロ機能を使うことで作業時間を短縮でき、かつミスを減らすことができるでしょう。
ExcelVBAを知ることは、マクロ機能を上手に活用して業務効率化を進めるために必要なことと言えるでしょう。
今回はExcelVBAとはどういうものなのか、簡単な構文の作り方などについての説明をしてきましたが、次回はマクロを実際にどのような業務で使うのがよいのかを考えます。
※記載の社名・製品名は各社の商標または登録商標です。
筆者プロフィール
- 家電量販店でウィンドウショッピングするのが好きです。
最新記事一覧
業務の自動化を実現する「WinActor」
製品サイトではWinActorのシナリオを実行した動画などを数多くご紹介しています。ぜひご覧ください。