はじめに
本連載は、自分自身がVBAを用いてオブジェクト指向の考え方を整理し直すための備忘録である。
趣味でC言語やBASIC、PHPなどを用いてプログラミングを行ってきたが、「オブジェクト指向」という言葉を耳にする機会は多いものの、実際にどういう概念であるのか、長らく理解できずにいた。Webサイトや書籍を参考にしても、説明は抽象的であり、実感を伴う理解には至らなかった。
あるとき、Arduinoを用いて複数のLEDを点滅させるプログラムに出会った。英語の記事であったが、そこには「なぜオブジェクト指向が必要なのか」がC言語の例を挙げ、平易に説明されていた。それが大きなヒントになり、オブジェクト指向の片鱗を理解するに至った。
その記事を手がかりに、より身近なプログラミング環境であるVBAを用いて動作を確認しながら、段階的にコードを改変していくことで、自然とオブジェクト指向の考え方に行き当たり、最終的にはオブジェクト指向の考え方を取り入れたコードが完成した。
この経験を記録として残しておくために、本稿をまとめた。同じような疑問を持つ者にとって、何かの参考となれば幸いである。
本稿では、セルをLEDに見立てて点滅させる処理を題材とし、下記のとおり五回にわたり手続き型からクラス設計へと発展させていく。
第1回 変数とサブルーチンによる手続き型の構造
第2回 配列と構造体による変数管理
第3回 変数と処理をクラスにまとめる
第4回 クラスモジュールを改造する
第5回 複数のオブジェクトを制御する
コードはすべて実際に動作確認したものである。特別なライブラリや外部ツールは使用していない。ExcelとVBAだけで完結する内容であり、実際に動作を確かめながら読み進めることで、理解が深まるはずである。
表現や語句の使い方に不備があるかもしれないが、間違っている箇所があれば、コメントで指摘してもらえるとありがたい。
第1回 変数とサブルーチンによる手続き型の構造
マイコンの実験では、LEDを点滅させるのが身近な方法である。本稿ではExcelのワークシート上に疑似LEDを作成し、それを点滅させることでプログラムの動きを実感することにした。
下図はExcelのワークシートに疑似LEDを配置したもので、”*”は消灯状態、”●”は点灯状態を示す。

コード1は疑似LEDをワークシートに作成し、点滅させるものである。
コード1. 疑似LEDの点滅
' 疑似LED制御用のパブリック変数を宣言する
Public R As Integer ' LEDセルの行番号(Row)
Public C As Integer ' LEDセルの列番号(Column)
Public T_on As Long ' 点灯時間(ミリ秒単位)
Public T_off As Long ' 消灯時間(ミリ秒単位)
Public Clr As Long ' LEDの表示色(例: vbRed, vbBlue)
' LEDセルの初期設定を行う(位置・色・初期状態など)
Sub makeLED()
R = 1 ' 行番号を1に設定(セルA1)
C = 1 ' 列番号を1に設定(セルA1)
T_on = 500 ' 点灯時間を500ms(0.5秒)に設定
T_off = 500 ' 消灯時間を500ms(0.5秒)に設定
Clr = vbRed ' LEDの色を赤に設定
' セル(R, C)に疑似LEDを配置(初期状態は消灯)
With Cells(R, C)
.Value = "*" ' 消灯状態の記号(例: "*")
.HorizontalAlignment = xlCenter ' セル内の文字を中央揃え
.Font.Color = Clr ' フォント色をLED色に設定
.Interior.Color = vbBlack ' 背景色を黒に設定(LED背景)
End With
End Sub
' LEDを1回点滅させる(点灯→待機→消灯→待機)
Sub BlinkLED()
Dim Now_ms As Long
' 点灯処理
Now_ms = Timer * 1000 ' 現在時刻(ミリ秒)を取得
Cells(R, C).Value = "●" ' 点灯状態の記号(例: "●")
While Timer * 1000 < Now_ms + T_on ' 点灯時間が経過するまで待機
DoEvents ' 他の操作を受け付ける(応答性確保)
Wend
' 消灯処理
Now_ms = Timer * 1000 ' 再度現在時刻を取得
Cells(R, C).Value = "*" ' 消灯状態に戻す
While Timer * 1000 < Now_ms + T_off ' 消灯時間が経過するまで待機
DoEvents ' 他の操作を受け付ける
Wend
End Sub
' LED点滅のメインループ(無限に点滅を繰り返す)
Sub main()
Call makeLED ' LEDセルの初期設定を実行
Stop ' 実行を一時停止(F5で続行可能)
Do ' 無限ループで点滅を繰り返す
Call BlinkLED ' LEDを1回点滅させる
DoEvents ' IDE操作や割り込みを受け付ける
Loop
End Sub
まずはExcelを開いて新しいワークブックを作成し、[Alt]+F11でVisual Basic Editor(VBE)を起動する。VBAプロジェクトウィンドウで新しく作成したワークブックを右クリックし、[挿入] → [標準モジュール]を選んで標準モジュールを追加する。追加したモジュールにコード1を貼り付ければ、すぐに実行できる。
Sub Main() にカーソルを合わせてF5キーを押すと、ワークシートに疑似LEDが作成される。再度F5キーを押すと、疑似LEDが点滅を開始する。停止させるには、VBEの中断かリセットボタン[■]をクリックする。Sub makeLED() で設定しているパブリック変数の値を変更することで、疑似LEDの位置や点滅時間、表示色を自由に調整できる。
また、Sub BlinkLED() の中でどのように点滅処理が行われているかを理解しておくと、次回以降の内容がよりスムーズに追えるようになる。
第1回はここまで。次回は、疑似LEDの数を増やしてみる。