VBAプログラミングの基礎 | ドヤ顔BLOG

ドヤ顔BLOG

ドヤッ( ̄ー ̄)

VBAプログラミングの基礎

マクロ機能はユーザーがエクセル上で行った操作を記録し実行する機能である。

VBAとはそのマクロで書かれた処理を記述しているコンピュータ言語である。


VBAを学習する動機としては作業効率の大幅な短縮があげられる。

またマクロ機能だけでは条件分岐や繰り返しなどの高度な処理を記録できない。

例えばセルの中身が5以上ならそのセルを赤くして、(条件分岐)それをデータが入力されている最後のセルまで実行したい(繰り返し)時などである。


【VBAの基本用語と文法】

VBAは標準モジュールのモジュール1に書いていく。Alt+F11でVBE(VBAを記述するエディタ)を立ち上げ、Alt⇒I⇒Mと入力するとモジュール1が立ち上がる。

また、モジュール1の中に目的に応じたプロシージャを記述していく。


プロシージャとはVBAの処理を指定する命令文の集まりだと考えればよい。

命令文(プログラム)をど忘れしてもCtrl+Spaceで入力補助機能が使えるので覚えておくといい。

命令文には例えばエクセルシート上にメッセージを表示するmsgbox()などがある。


プロシージャにはSubプロシージャ、functionプロシージャ、propertyプロシージャの3つがあるが、しばらくはSubプロシージャのみ意識しておけばよい。


Subプロシージャを実行する方法としては

①「マクロ」ダイアログボックスから実行する方法と、

②オートシェイプから実行する方法がある。

前者はAlt+F5から、後者は作成したオートシェイプに右クリックをしてマクロの登録をクリックすればよい。


さて、Subプロシージャを具体的に書いてみると


Sub プロシージャ名()

    処理

End Sub

と書く。


有名なHello WorldをVBAで書くと

Sub Hello_World()

MsgBox “Hello World!”

End Sub

となる。


オブジェクトとはエクセルを構成する各要素のことであり、VBAで操作する対象となるもの全ての総称である。

具体的にはセル(Range、Cells)やワークシート(Sheets)などのような静的なものから、「今選択しているセル(ActiveCell)」などのような動的なものも含まれる。


プロパティとはオブジェクトの状態や属性を指定するものである。

例えば、A1セルというオブジェクトの「値」や「文字の色」などが該当する。

プロパティの使い方は①取得と②設定の2種類がある。

① はオブジェクト名.プロパティ名で取得でき、取得した中身は計算などで利用する。

② はオブジェクト名.プロパティ名=設定値で設定できる。

メソッドとはオブジェクトに対する操作の総称である。

例えば、A1セルというオブジェクトの「削除」や「コピー」などである。

使い方はプロパティと同じくオブジェクト名.メソッド名


またメソッドの種類によっては引数を持つものもあり、引数とはメソッドが実行されるための細かい条件を表す。

例えばセルの削除というメソッドでも、削除した後どの方向にセルを動かすのかといった感じである。

引数は必ずしも指定する必要があるわけでなく、エクセル側がデフォルトでもっている引数もある。これらは全てメソッドを入力する際にヘルプ(F1キー)で確認できる。

引数の指定の仕方は メソッド名 引数名:=設定値, 引数名:=設定値…

とイコールの前に「:」をお忘れなく。


またメソッドの中には戻り値を返すものがある。

戻り値とはメソッドの実行結果のことである。例えば普通エクセル上で扱う関数(SUMなど)は全て計算結果という戻り値を持つ。


ある1つのオブジェクトに対する処理をまとめて記述するためにWithステートメントという書式が用意されている。

Withステートメントを使うことで処理の追加や変更が行いやすくなり、またコード自体の見やすさも向上する。

使い方は

With オブジェクト名

.プロパティ名orメソッド名

.プロパティ名orメソッド名

End With


処理シートごとに

With ThisWorkbook.sheets(“シート名”)

.Activate



End With

のように書くことをすすめる。


【演算子】

これまでプロパティの設定値の代入に=を使ってきたが、これは演算子の一つである代入演算子「=」の例である。

演算子には算術演算子、代入演算子、文字連結演算子、比較演算子、論理演算子がある。


文字連結演算子 &

これは文字通り文字を連結させるための演算子である。なお、VBAでは文字列は「” ”」で囲む。

使い方は“文字列A” & “文字列B”




算術演算子と比較演算子、論理演算子については一般的なプログラミング言語と同様のため省略する。

【条件分岐】

条件分岐は条件に応じて実行する処理を変える仕組みで、条件分岐をコードに記述することで、マクロ機能では実現できない高度な処理が可能となる。

また、条件分岐とループ処理が書ければほとんどのアルゴリズムが実行できる。

VBAでは(他の言語でもほぼ同じ)IFステートメントと上記の演算子を使って条件分岐を記述する。なお処理は上から実行されていく。またIFステートメントは入れ子構造にすることもできる。(つまり処理1のところにまたIFステートメントが書ける)使い方は


IF 条件式1 Then

処理1

ElseIf 条件式2 Then

処理2



Else

処理(これまでの条件式に当てはまらない時の処理)

End IF


条件分岐はIFステートメントだけでなく、Select Caseステートメントもよく使われる。

使い方は


Select Case 条件分岐する対象

Case 条件1

処理1

Case 条件2

処理2



Case Else

処理(その他)

End Select


これらIFステートメントとSelect Caseステートメントの使い分けとして、判断条件の対象が複数に及ぶ場合には前者を、判断条件の対象が一つであって、とびとびの値や範囲を条件に指定したい場合には後者を使えばよい。


【変数(その1)】

変数とは文字列や数値などのデータを入れておくための箱である。

変数にデータを格納し、その変数は演算などに使える。変数には名前を付けることができ、それを変数名という。

使い方は簡単で

変数名=データ

となる。後により詳しく変数の使い方や概念を見ていくが、今はこの程度の理解でよい。


【ループ】

ループとは同じ処理を何回も繰り返して行うための処理である。

ループを使ってコードを書くことで記述が楽になり、見やすくなり、さらにミスも減らせる。ループ処理の方法はいくつかあるがまずはFor…Nextステートメントを見ていく。

使い方は


For 変数名 = 初期値 To 最終値 Step 増加(減少)幅

処理

Next 変数名


このFor…Nextステートメントで使われる変数はループする回数を数えるために使うのでカウンタ変数と呼ばれることがある。(カウンタ変数はiやjが使われる)

またループが回る回数は最終値-初期値+1になるので注意。

次にFor…Nextステートメントを実際に使うのは、複数のセルに対して処理を繰り返して行う場合がほとんどなのでこれを見ていく。

Cellsプロパティを使えば上記の処理は行える。これはRangeオブジェクトと同様に指定したセルのオブジェクトを表せる。

使い方は Cells(行,列)のようにセルの行と列を指定する。

さらにCellsプロパティは指定したオブジェクトを起点にそこからの相対的な行と列を指定してセルを指定できる。(つまりOffsetのような使い方ができる)

また実はOffsetプロパティもあり、これも指定したオブジェクトを起点にそこからの相対的な行と列を指定してセルを指定できる。

Cellsプロパティは起点セルを1とするのに対してOffsetプロパティは起点セルを0とするという違いがある。

両方とも使い方は

基準となるオブジェクト.Offset(行,列)

基準となるオブジェクト.Cells(行,列)


【変数(その2)】

ここでは変数を宣言とデータ型という概念を導入してより深く学んでいく。

変数の宣言とは使用する変数を定義することで、データ型というのは使用する変数の種類(文字列なのか?数値なのか?など)を定義することである。

使い方は

Dim 変数名 As データ型

となる。

なおデータ型がオブジェクト型のときは

Set 変数名 = 値

となることに注意。

またミスを防ぐために宣言していない変数の使用を禁止するOption Explicitステートメントがある。

これはプロシージャの外に記述する。以降では宣言していない変数が紛れ込むのを防ぐためにOption Explicitステートメントの使用をオススメする。


データ型の種類

データ型の名称

データ型

取りうる値

整数型

Integer

‐32768から32768までの整数

長整数型

Long

‐20億から20億ぐらいまでの整数

単精度

Single

実数

倍精度

Double

実数(単精度より精度は良い)

文字列型

String

文字列

オブジェクト型

Object

オブジェクト

バリアント型

Variant

あらゆる種類のデータ型


変数の有効範囲と有効期限

基本的に変数が有効なのはプロシージャ内だけであり、同一の名前の変数であってもプロシージャをまたぐと別変数になる。

このようにプロシージャ内だけで有効な変数をプロシージャレベル変数(ローカル変数)という。

一方、変数はプロシージャの外でも宣言することができ、Option Explicitステートメント同様に標準モジュールの冒頭に記述する。

このような変数は同一モジュール内では共有されモジュールレベル変数(グローバル変数)という。

また変数の有効期限については、前者はプロシージャ実行中のみに対して、後者はブックを開いている間中ずっと有効である。


【定数】

定数は変数と異なり同じ値を保持し続ける箱である。定数も変数同様宣言とデータ型の設定を行う。使い方は

Const 定数名 As データ型 = 値

また変数同様に、プロシージャ内で宣言すればプロシージャ内だけで有効な定数になるのに対して、プロシージャの外でも宣言すると定数は同一モジュール内では共有される。

プログラム内で使う決まった数値はなるべく定数化しておくと、あとあと大変楽になる。


【コメント】

各変数の意味やそれぞれどういう処理をしているのかをメモできるコメントという機能がある。使い方は「‘」のあとに自由に文字を入れれば良いだけである。


【その他のループ処理】

条件を満たしている間処理を繰り返すDo While…Loopステートメントがある。

使い方は

Do While 条件式

処理

Loop


または

Do

    処理

Loop While 条件式


逆に条件を満たすまでの間処理を繰り返すDo Until…Loopステートメントもある。

使い方は

Do Until 条件式

処理

Loop


または

Do

    処理

Loop Until 条件式


また指定したオブジェクト内のすべてに対して同一の処理を行うFor Each…Nextステートメントもある。

使い方は


For Each 変数 In オブジェクトの集合

処理

Next


無限ループに突入するのを防ぐために、強制的にループを抜け出すステートメントがあり

DoループではExit Do、ForループではExit Forがあり、普通はIfなどと同時に使う。


【関数】

SUM()関数など普通に我々が使うエクセル上で動く関数のことをワークシート関数と呼び、VBAで使うMsgBox()のような関数はVBA関数という。

関数は引数を指定すれば何らかの処理を行い、その結果戻り値が返ってくるという構造は同じである。

重要な関数としてはMsgBox()の他にInputBox()関数やRnd関数がある。

VBAでも一部のワークシート関数は使用でき、使い方は

WorksheetFunction.ワークシート関数名(引数)


また関数は自作できる。自作関数の作り方は

Function 関数名(引数名 As 引数のデータ型) As 戻り値のデータ型

処理

関数名=戻り値

End Function