この記事はこのような人に向けて書いています。
こんにちは。ゆー です。
皆さん、エクセルのVBA(Visual Basic for Applications)は使ったことがありますか?
VBAはプログラミングの中でも最も易しいと言われているので、プログラミングの入門として覚えるのにも最適です。
VBAを使えるとエクセルで行う様々な作業を自動化したり、VBAに対応したアプリをプログラムで操作できたりしますよ!
しかし、いざVBAを使ってみようとしても
ネットで検索したサンプルコードを見ても、書いてある意味が理解できない・・・。
本格的にVBAの勉強をしようと意気込んでみたものの、一週間も続かなかった・・・。
こんなことになりがちです。
今回の記事では、私の経験からエクセルVBAを活用するためにおさえておきたいポイントを紹介いたします。
VBAとはMicrosoftが提供するプログラミング言語の一種です。
Excel、Access、WordやPowerPointなどにも搭載されていますが、また、Microsoft製品以外でもVBAと連携する機能をもつアプリケーションは多数あります。
すなわちVBAを使えるようになるということは、色々なアプリケーションをプログラムによって操作することができるようになるということです。
エクセルやワードの業務を自動化することもできるし、Adobe Acrobatと連携させてPDFファイルを操作する事例などもあります。
エクセルVBAは基本的にVBEditorという編集ソフトでプログラムを作成します。
慣れると別のエディター(編集ソフト)を使ったりする人もいます。
しかし、初心者のうちは基本のVBEditorで勉強し、さらなるステップアップとして他のエディターに挑戦するのオススメします。
VBEditorはエクセルの開発タブから起動できますが、初期状態では表示されていませんので最初に以下の設定を行います。
ちなみに「Alt + F11」でもVBEditorを起動することができます。
VBEditorは初期状態だと使いにくいので設定を変えましょう。
私のオススメ設定を紹介します。
種類 | 前景 | 背景 |
---|---|---|
標準コード | 黄色 | 黒 |
コメント | 緑 | 黒 |
キーワード | 水色 | 黒 |
識別子 | 白 | 黒 |
各ウィンドウの名称と役割を確認しておきましょう。
こういった用語を知っておけば、困ったときにも検索がしやすくなります。
名称 | 役割 |
---|---|
プロジェクトエクスプローラー | モジュールの構成を表示する。
新しいモジュールの追加なども行える。 |
コードウィンドウ | コード(プログラムの文章)を記入する |
プロパティウィンドウ | モジュールの名称などを変更する |
イミディエイトウィンドウ | プログラム実行中の変数の値などを表示する。 |
エクセルVBAはVBAプロジェクトの下位にモジュール、さらにプロシージャという階層構造になっています。
どのモジュールのプロシージャにコードを作成するのかによって、挙動が変わったり、記載方法を変える必要が出たりしますので、まずは構造を把握しておきましょう。
VBAプロジェクトとはVBAにより作成されるプログラムの最も大きなかたまりです。
実質的にはVBAが記述されているエクセルファイル=一つのVBAプロジェクトと考えてOKです。
初心者のうちは特に意識する必要はありませんが、高度なプログラムではVBAプロジェクトから別のVBAプロジェクトを参照することもあるため、重要な概念です。
モジュールはVBAプロジェクトの中でコードを作成する場所です。
用途に応じて、コードを作成する場所に向き不向きがあります。
基本的には標準モジュールにコードを作成すると覚えておきましょう。
プロシージャとはプログラムを実行する最小単位です。
Sub プロシージャ、Function プロシージャ、Property プロシージャという3種のプロシージャがありますが、Property プロシージャは高度なプログラミングで使用するので、説明を省略します。
Subプロシージャの記入例
Sub プロシージャ名() '処理内容 End Sub
Functionプロシージャの記入例
Function プロシージャ名() '処理内容 End Function
Sub プロシージャ名() ~ End Sub が一つのSubプロシージャ、Functionプロシージャ名() ~ End Functionが一つのFunctionプロシージャです。
2つのプロシージャの違いは値を返すか返さないかによります。
プロシージャ
例えば下記のプログラムを見てみましょう。
' Subプロシージャの例 Sub ShowMessage() MsgBox "Hello, this is a Sub procedure!" End Sub ' Functionプロシージャの例 Function AddNumbers(number1 As Double, number2 As Double) As Double ' 2つの数値を足し合わせて結果を返す AddNumbers = number1 + number2 End Function ' メインプロシージャ Sub Main() ' Subプロシージャの呼び出し Call ShowMessage ' Functionプロシージャの呼び出しと結果の表示 Dim result As Double result = AddNumbers(5.5, 3.2) MsgBox "The sum is: " & result End Sub
ShowMessageプロシージャはメッセージを表示するだけですが、AddNumbersプロシージャは引数として与えられた5.5と3.2の合計値を返しています。
VBAコードはステートメント、関数、オブジェクトのプロパティ/メソッド、変数や定数などで構成されています。
何がステートメントで何がプロパティなのか、最初のうちは厳密に区別できなくても、それぞれの使い方がわかっていれば大丈夫です。
以下に一つずつ説明していきましょう。
プログラム内で特定の動作を実行する命令や文がステートメントです。
ステートメントの例
これらのステートメントを使用した例が以下になります。
Sub StatementExample() ' 変数xの値を設定 Dim x As Integer x = 4 ' Ifステートメントを使用して条件分岐 If x > 5 Then ' 条件が真の場合の処理 MsgBox "変数xは5より大きいです。" ElseIf x = 5 Then ' この条件が真の場合の処理 MsgBox "変数xは5です。" Else ' 条件が偽の場合の処理 MsgBox "変数xは5より小さいです。" End If End Sub
関数とは「引数を受け取り」「処理を行い」「戻り値を返す」文言です。
VBAで使う関数は以下の3つがあります。
関数の種類
Functionプロシージャはプロシージャの項で説明しましたが、関数の一種でもあります。関数プロシージャとも言い、いわば自分で作ることのできる関数です。
ワークシート関数はWorksheetFunction オブジェクトのメソッドなので次の項で説明します。
この項ではVBA関数について、具体例を挙げて説明します。
VBA関数はVBAのプログラム内で直接呼び出して使用できる関数です。
Left関数は引数として文字列と整数を受け取り、文字列の左から指定された数だけ文字を抜き出し、抜き出した文字列を返します。
また、Date関数のように見かけ上は引数を受け取らずに戻り値を返す関数もあります。
Sub VBAFunctionExample() ' Left関数を使って文字列から最初の5文字を取得 Dim originalString As String Dim leftResult As String originalString = "Hello, World!" leftResult = Left(originalString, 5) ' 結果を表示 MsgBox "Left関数の結果: " & leftResult ' Date関数を使って現在の日付を取得 Dim currentDate As Date currentDate = Date ' 結果を表示 MsgBox "現在の日付: " & currentDate End Sub
エクセルVBAはエクセルの機能を操作することができます。
また、冒頭でも述べた通り、その他のアプリケーションも操作することができます。
そのようなVBA以外のプログラムを操作するためにアクセスするのがオブジェクトです。
例えばエクセルに備わっているオブジェクトには以下が挙げられます。
エクセルのオブジェクトの例
メソッドは、オブジェクトが実行できるアクションや操作です。
例えばセルのコピーや貼り付けはRange オブジェクトのメソッドで実行できます。
Range オブジェクトのメソッド例
Sub CopyAndPasteSpecial() ' セルA1の値をコピーする Range("A1").Copy ' セルB1に数式を貼り付ける Range("B1").PasteSpecial Paste:=xlPasteFormulas ' セルC1に値を貼り付ける Range("C1").PasteSpecial Paste:=xlPasteValues ' メッセージボックスで結果を表示 MsgBox "セルA1の値をB1に数式として貼り付けました。" & vbCrLf & _ "セルA1の値をC1に値として貼り付けました。" End Sub
また、前の段落で述べたワークシート関数はWorksheetFunction オブジェクトのメソッドです。
ワークシート関数はエクセルでセルに入力して使う関数、例えばSUM関数やAVERAGE関数です。
ワークシート関数はVBAでも呼び出して使用することができます。
WorksheetFunction オブジェクトのメソッド(ワークシート関数)の例
Sub SumAvgExample() ' セル範囲 A1:A10 の値の合計を計算し、メッセージボックスで表示 Dim total As Double total = WorksheetFunction.Sum(Range("A1:A10")) MsgBox "合計値は: " & total ' セル範囲 B1:B10 の値の平均を計算し、メッセージボックスで表示 Dim avg As Double avg = WorksheetFunction.Average(Range("B1:B10")) MsgBox "平均値は: " & avg End Sub
プロパティは、オブジェクトの特定の属性や設定値のことです。
例えばRange オブジェクトの場合、フォントの色やセルの値などがプロパティです。
プロパティは変更できるものとできないものがあります。
変更できるものはプロパティに値を格納することで変更します。
プロパティの例
Sub SetPropertyExample() ' セルA1に値を設定する Range("A1").value = "Hello, Excel!" ' セルA1のフォントの色を変更する Range("A1").Font.Color = RGB(255, 0, 0) ' 赤色 Dim Str As String Str = "=A1 from VBA" ' セルB1に数式を設定する Range("B1").Formula = "=A1 & A7" ' メッセージボックスで結果を表示 MsgBox "セルA1の値: " & Range("A1").value & _ " セルA1のフォント色: " & Range("A1").Font.Color & _ " セルB1の数式: " & Range("B1").Formula End Sub
変数と定数はプログラムでデータを格納し、操作するための要素です。
変「数」、定「数」と言われますが、格納されるデータは数以外にも文字列だったり、日付だったりすることもあります。
変数にはプログラムの状況に応じて好きな値を格納することができます。
変数はDimステートメントで宣言し、”=”で値を格納します
Sub VariableValue_1() Dim num As Long num = 10 MsgBox "変数に格納した値: " & num End Sub
値の格納に”=”記号を使っていますが、これは数学的の等号記号とは違って左辺と右辺が等しいという意味ではなく、あくまで左辺に値を入れるという意味です
例えば以下のように書くことも可能です。
Sub VariableValue_2() Dim num As Long num = 10 MsgBox "変数に格納した値: " & num num = 20 + 30 MsgBox "変数に格納した値: " & num num = num + 5 MsgBox "変数に格納した値: " & num End Sub
変数の型はたくさんの種類がありますが、まずは以下の型があることをおさえておけばよいでしょう。
型名 | データ型 | 値値 |
---|---|---|
Integer | 整数 | -32,768 ~ 32,767 の整数 |
Long | 長整数 | -2,147,483,648 ~ 2,147,483,647 の整数 |
Double | 小数 | 負:-1.79769313486231E308 ~ -4.94065645841247E-324 正:4.94065645841247E-324 ~ 1.79769313486232E308 |
String | 文字列 | “文字列” 可変長:最大で約 20 億 (2^31) 文字 固定長:1 ~ 約 64 K (2^16) の文字 |
Date | 日付 | 西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻 |
Boolean | ブール | True または False |
Object | オブジェクト | 他のアプリケーションから提供されるデータや機能など |
Variant | バリアント | すべて |
詳しく知りたい方はMicrosoftのVBAリファレンス等をご確認ください。
変数の中でも特に、複数のデータを一つの変数に格納できる配列変数というものがあります。
例えば、10から50までの10の倍数の数値を格納する変数があるとしましょう。
通常の変数では、以下のように1つずつ変数を用意する必要があります。
Dim num1 As Integer Dim num2 As Integer Dim num3 As Integer Dim num4 As Integer Dim num5 As Integer num1 = 10 num2 = 20 num3 = 30 num4 = 40 num5 = 50
しかし、配列を使うと、これをもっと効率的に記述できます。
Dim num(1 To 5) As Integer num(1) = 10 num(2) = 20 num(3) = 30 num(4) = 40 num(5) = 50
定数はプログラム内で変更されない値を表します。
定数はConstステートメントで宣言します。
例えば円周率や税率など、一度定義したら変更することのない値は定数にしておくことで違う値を格納することを防ぎます。
下の例ではPIという定数に3.14159という値を格納した後に、3という値に書き換えようとしてもエラーになる例です。
Sub ConstantValue() Const PI As Double = 3.14159 MsgBox "定数の値: " & PI ' PI = 3 'これはエラーになる End Sub
定数には円周率や税率など、一度定義したら変更することのないデータを格納するのに便利です。
コメントとはプログラム内で実行されない文字列です。
他の開発者や自分自身に対して、コードの理解や保守を容易にするために用いられます。
文頭に「’」をつけるとその文章はコメントになります。
例えば、変数や定数の目的を説明したり…
' シートの合計行数 Dim totalRows As Integer ' 初期化処理 totalRows = WorksheetFunction.CountA(Sheets("Sheet1").Columns(1))
注意事項を残しておいたり…
' 注意: この処理はデータの検証を行っていないため、 ' 不正なデータが存在する場合には予期せぬ結果が発生する可能性があります。
コードの変更履歴を残すなど…
' v1.0 - 初版 ' v1.1 - バグ修正 ' v2.0 - 新機能の追加
さまざまな目的でコメントを記入します。
たくさん述べてしまいましたが、一度に全部を覚える必要があるわけではありません。
試行錯誤しながらまた見返せば良いのです。
自分でVBAプログラムを作成する際に思い返して、「このコードにはこういう意味があるんだな」と納得しながら学習していくことが上達の近道です!
【iCAD用便利ツール】ベルト作成ツール