VBA(Visual Basic for Application)の基本構造として、外部から実行されるサブモジュール(Sub)と、呼び出される関数(Function)の2つを定義していきます。
サブモジュールはプログラムを実行する際の入り口の役割をし、画面に配置したボタンや、マクロ実行の際に選択ができ、プログラムの起動トリガーとして機能します。
関数は、プログラム中や、セルの中から呼び出せますが、画面に配置したボタンや、マクロ実行からは呼び出せません。
また関数は、関数に引数を渡すことが出来、関数内で引数を処理して結果を返す事が出来ます。
主な使い方は、同じような処理を何度もプログラム中に書く場合、関数化して、呼び出して使うような使い方をします。
まとめると、サブモジュールは単体で機能するもの。
関数は各サブモジュールや関数から呼び出せるものと思ってください。
特に関数は、プログラミングを行う上で、非常に使います。
是非とも使えるようになってください。
VBAの変数。
変数とは、プログラム中で値を格納する為のワークエリアとなります。
ワークエリアとして、プログラム全体で使用できるグローバル変数と、サブモジュール、関数の中だけでしか使えない、ローカル変数の2種類。
あとは、最初に値を代入し、変更することが出来ないコンスタント値があります。
変数定義の言語規則としては、以下となります。
スコープ△変数名△as△変数の型△=初期値
※△はスペースを表す。
スコープとは、変数の有効範囲となります。
Publicが全体、Dimがサブモジュール、関数の内部だけ有効。
constをつける事で、プログラム中で変更できないようになります。
変数名は、好きに付けてもらっても構いませんが、予約語と被らないようにしましょう。また、グローバル変数で使用した変数名は、ほかで使用すると不具合に繋がるので、極力グローバル変数と分かるような名称にするのが良いでしょう。
変数の型は、後で詳しく説明しますが、ワークエリアとして使う際に文字を格納するのか、数値を格納するのかを明示的に示す必要があります。
用途に応じた型を指定しましょう。
具体的な定義例を示します。
'グローバル変数定義 public pub_aaa as Integer ' Integer型宣言 'コンスタント定義 public const cst_bbb as long = 1024 ' long型コンスタント定義 --------------------------------------- public Sub Main() 'ローカル変数定義 Dim ccc as string ' String型宣言 End Sub
VBAの変数の型としては以下があります。
データ型 | 名称 | 用途 | 範囲 |
Integer | 整数型 | 整数格納用 | -32,768 ~ 32,767 |
long | 長精度整数型 | 整数格納用(倍精度) | -2,147,483,648 ~ 2,147,483,647 |
Single | 単精度浮動小数点型 | 小数点格納用 | -3.402823E38 ~ -1.401298E-45(負の値) |
Double | 倍精度浮動小数点型 | 小数点格納用(倍精度) | 4.94065645841247E-324 ~ 1.79769313486232E308(正の値) |
String | 文字列型 | 文字列格納用 | 最大約20億文字まで |
Date | 日付時刻格納型 | 日付時刻格納用 | 西暦100 年1月1日~西暦9999年12月31日までの日付と時刻 |
Object | オブジェクト型 | オブジェクト参照格納用 | オブジェクトを参照するデータ型 |
Variant | バリアント型 | 格納時に、自動で数値と文字を格納 | String型と同様 |
Boolean | ブール型 | 真・偽の2拓を格納する。 | 真 (True) または偽 (False) |
整数を格納する型が2種類ありますが、基本的にLong型だけを使用しておけば問題ありません。
小数点を格納する型も2つありますが、こちらも同様にDouble型だけを使用しておけば問題ありません。
あと、Variant型という便利な型があるのですが、これは、代入する値により格納される型がコロコロ変わるので、バグの元になり易いですので、極力使わないようにしましょう。
他にもありますが、まず使わないので割愛します。
判定文としては2種類。
単純な比較のIF文と、複数の比較のSELECT文の2種類があります。
まずIF文としては、単独の条件で、条件が真の時と偽の時で処理を分けるケースと、複数のIF文をつなげるパターンの2通りあります。
If△条件△Then 処理1 Else 処理2 End If If△条件1△And△条件2△Or△条件3・・・Then 処理1 ElseIf△条件4△Then 処理2 Else 処理3 End If
SELECT文は、一つの変数の内容を比較するもので、以下のような書き方をします。
Select△Case△変数名 Case△条件1 処理1 Case△条件2 処理2 Case△条件3 処理3 Case△Else 処理4 End△Select
通常はIF文を使うことが多いと思いますが、SELECT文を使う事でコードが見やすくなります。
ループの構文としては2つあります。
1つは、Doループとし、条件を満たしている間ループするDo While文と、条件を満たすまでループするDo Until文、一定回数ループさせるfor文があります。
まずはDoループ
条件を満たしている間、条件を満たすまでループさせたい時はDoループを使用します。
最初に条件判定(1回も処理されない場合がある。) Do△While△条件 処理1(条件を満たしている間実行) Loop 最後に条件判定(必ず1回は処理される) Do 処理2(条件を満たしている間実行) Loop△While△条件 最初に条件判定(1回も処理されない場合がある。) Do△Until△条件 処理1(条件を満たしている間実行) Loop 最後に条件判定(必ず1回は処理される) Do 処理2(条件を満たしている間実行) Loop△Until△条件
つぎにforループ
主に規定回数ループさせる場合に使用します。
書き方には2種類あり、単純に数値を使って規定回数ループさせる書き方と、オブジェクト(文字列の配列など)の要素数ループさせる書き方があります。
要素数のループは、要素数が一定でない場合(何個あるのか分からない場合)に自動ですべての要素数ループしてくれます。
For△変数名△=△初期値△to△終了値△Step△変数に対する増加数(マイナスも可) 処理1 Next For△Each△変数名△In△グループオブジェクト 処理2 Next
ラベルとは、プログラムのコード中で、特定の位置に移動したい場合の起点として機能します。
例えば、エラー処理を行う場合にエラーのパターンで、すべての処理が不要になる場合、特定の位置にラベルを置いておくと、一部の処理をスキップできます。
具体的な例で行くと、プログラム中でファイルを2つオープンした場合に終了処理で2つのファイルをクローズする必要がありますが、2つ目のファイルのオープン前にエラーが発生した場合、そのまま処理すると2つ目のファイルクローズでエラーが発生します。
それを回避するために、ラベルを使用して2つ目のファイルクローズをスキップすることが出来ます。
ラベル名の書き方は、ラベル名に”:”をつけるだけです。
Goto文は指定したラベルまで処理を移動します。
'グローバル変数定義 public pub_aaa as Integer ' Integer型宣言 'コンスタント定義 public const cst_bbb as long = 1024 ' long型コンスタント定義 --------------------------------------- public Sub Main() 'ローカル変数定義 Dim ccc as string ' String型宣言 Goto ラベル名 If△条件△Then 処理1 Else 処理2 End If ラベル名: End Sub
VBAでエラーが発生した場合、強制的にエラー発生ステップで処理が停止しますが、エラー処理を適切に入れる事で、エラー時でも動作を継続することが出来ます。
エラー処理の書き方は主に二つ。
1つ目は、エラー時にエラー用のラベルまで処理を飛ばすOn Error Goto文。
2つ目は、エラーが発生しても継続して処理を続行するOn Error Resume Next文。
Public Sub Main() On Error GoTo ラベル名 Dim ccc As String If△条件△Then 処理1 Else 処理2 End If ラベル名: エラー処理 End Sub
Public Sub Main() On Error Resume Next Dim ccc As String If△条件△Then 処理1 Else 処理2 End If End Sub
また、エラーが発生した場合、エラーの内容などを取得することが出来ます。
VBAでは、Errというオブジェクトがシステムで定義されており、エラーが発生した場合、最後に発生したエラーの内容が格納されています。
下の例では、Errオブジェクトの3つのプロパティを参照しています。
プロパティには、他にもいくつかありますが、よく使いそうなものを紹介します。
プロパティ名 | 説明 |
Description | エラーの説明(日本語) |
Number | エラーを指定する値 |
Source | エラーを発生させたオブジェクト、アプリ名 |
Public Sub Main() On Error GoTo ラベル名 Dim ccc As String If△条件△Then 処理1 Else 処理2 End If ラベル名: MsgBox (Err.Source & Err.Description & Err.Number) End Sub
VBAで関数を呼び出す時は、関数の戻り値の有無により、書き方が変わります。
戻り値がある場合は、関数の戻り値を格納するエリアを左に書きます。
戻り値がない場合は、CALL文を使用します。(無くても呼び出せますが、分かりにくいので極力つけましょう)
' 呼び出し元サブモジュール Public Sub Main() Dim ccc As String ccc = Test1() Call Test2 End Sub '戻り値あり関数 Public Function Test1() As String Test1 = "test" End Function '戻り値なし関数 Public Function Test2() call MsgBox ("test") End Function
今回はここまで。