【初心者必見!】VBAプログラミング講座 言語規則編

VBAプログラムの基本構造

VBA(Visual Basic for Application)の基本構造として、外部から実行されるサブモジュール(Sub)と、呼び出される関数(Function)の2つを定義していきます。

サブモジュールはプログラムを実行する際の入り口の役割をし、画面に配置したボタンや、マクロ実行の際に選択ができ、プログラムの起動トリガーとして機能します。

関数は、プログラム中や、セルの中から呼び出せますが、画面に配置したボタンや、マクロ実行からは呼び出せません。

また関数は、関数に引数を渡すことが出来、関数内で引数を処理して結果を返す事が出来ます。

主な使い方は、同じような処理を何度もプログラム中に書く場合、関数化して、呼び出して使うような使い方をします。

まとめると、サブモジュールは単体で機能するもの。

関数は各サブモジュールや関数から呼び出せるものと思ってください。

特に関数は、プログラミングを行う上で、非常に使います。

是非とも使えるようになってください。

VBAの変数の定義方法

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の変数の型

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型という便利な型があるのですが、これは、代入する値により格納される型がコロコロ変わるので、バグの元になり易いですので、極力使わないようにしましょう。

他にもありますが、まず使わないので割愛します。

VBAの判定分(IF文、SELECT文)

判定文としては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文は、一つの変数の内容を比較するもので、以下のような書き方をします。

SelectCase△変数名
Case△条件1
  処理1
Case△条件2
  処理2
Case△条件3
  処理3
CaseElse
  処理4
EndSelect

通常はIF文を使うことが多いと思いますが、SELECT文を使う事でコードが見やすくなります。

VBAのループ(do、for)

ループの構文としては2つあります。

1つは、Doループとし、条件を満たしている間ループするDo While文と、条件を満たすまでループするDo Until文、一定回数ループさせるfor文があります。

まずはDoループ

条件を満たしている間、条件を満たすまでループさせたい時はDoループを使用します。

最初に条件判定(1回も処理されない場合がある。)
DoWhile△条件

  処理1(条件を満たしている間実行)

Loop


最後に条件判定(必ず1回は処理される)
Do 

処理2(条件を満たしている間実行)

LoopWhile△条件



最初に条件判定(1回も処理されない場合がある。)
DoUntil△条件

処理1(条件を満たしている間実行)

Loop


最後に条件判定(必ず1回は処理される)
Do

処理2(条件を満たしている間実行)

LoopUntil△条件

つぎにforループ

主に規定回数ループさせる場合に使用します。

書き方には2種類あり、単純に数値を使って規定回数ループさせる書き方と、オブジェクト(文字列の配列など)の要素数ループさせる書き方があります。

要素数のループは、要素数が一定でない場合(何個あるのか分からない場合)に自動ですべての要素数ループしてくれます。

For△変数名△=△初期値△to△終了値△Step△変数に対する増加数(マイナスも可)

  処理1

Next

ForEach△変数名△In△グループオブジェクト

  処理2

Next

VBAのラベルとgoto文

ラベルとは、プログラムのコード中で、特定の位置に移動したい場合の起点として機能します。

例えば、エラー処理を行う場合にエラーのパターンで、すべての処理が不要になる場合、特定の位置にラベルを置いておくと、一部の処理をスキップできます。

具体的な例で行くと、プログラム中でファイルを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のエラー処理(On Error)

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の関数呼び出し

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

今回はここまで。

bassmania

メンサ会員 IT系企業に20年以上従事。 プログラミング・インフラ系エンジニア