前回の記事でVBAを作成する全体の流れを紹介致しました。
今回は実際に作成したプログラム(マクロともコードとも言います)を元にVBAのプログラミング方法についてご紹介します。矩形波(くけいは)を生成するプログラムを例に、4つ(宣言・入力・処理・飾る?)に分けて説明します。
1.宣言
プログラム内で使う変数(数字等を一時格納する場所)内にどの様なものが入るかDim関数でパソコンに教えます(宣言します)。
1.1 宣言のプログラム記入例
'変数宣言
Dim i As Byte
Dim j As Byte
Dim A As Long
Dim Time As Single
Dim Wave As Byte
Dim Duty As Byte
Dim Hz As Single
Dim Voltage As Single
1.2 変数に使う変数の型
参考に変数の型を表1に示します。
表1:VBAで使う変数の型一覧
変数の型 | 格納するデータ |
Boolean | TrueまたはFalse |
Byte | 0~255までの整数 |
Integer | -32,768~32,767の整数 |
Long | -2,147,483,648~2,147,483,647の整数 |
Currency | -922,337,203,685,477.5808~922,337,203,685,477.5807 |
Single | -3.4×10^38~-1.4×10^-45、1.4×10^-45~1.8×10^38 |
Double | -1.8×10^308~-4.0×10^-324、4.9×10^-324~1.8×10^308 |
Date | 西暦100年1月1日~9999年12月31日、時刻0:00:00 ~ 23:59:59 |
String | 任意の長さの文字列 |
Object | オブジェクト |
Variant | すべてのデータ |
1.3 宣言しないと・・・
べつに宣言しなくともパソコンが勝手に「Variant」型と言う全ての値が格納出来る一見便利な型に格納しプログラムは動きます。はじめはこれで全く問題ありませんが、大規模なプログラムになる程実行速度が遅くなったり、エラーが出たり、ひどい場合は違う結果が出力されてしまいます。
と言う事にならない様に宣言をしておく癖を付けておくと良いです。
2.入力
計算する為の前提となる値を入力する必要が有ります。値を得る方法は色々(Excelワークシート上のセルの値、InputBox、UserForm、csv他ファイルの値、乱数など)ありますが、今回はInputBoxを使ってみます。
2.1 InputBoxのプログラム記入例
'変数入力
Duty = InputBox("出力波形のデューティー比(%)を0~100迄の整数で入力して下さい")
Wave = InputBox("出力する波形の数を1~255の整数で入力して下さい")
Hz = InputBox("出力する波形の周波数を正の数で入力して下さい")
Voltage = InputBox("出力する波形の電圧を正の数で入力して下さい")
2.2 InputBoxの値を取得
VBAには「InputBox」と言う便利な関数が有りますのでそれを使ってユーザー(主に自分)から任意の設定条件を取得します。
図1:「InputBox」を実行するとこんな感じの物が出てきます
2.3 計算する前提が無いと・・・
エラーが出ますので気を付けましょう。
3. 処理
入力値から欲しい結果を得る為に、データ処理を行う部分です。
ここがVBAのメインどころかつ自分のプログラミングセンスが問われる所です。
おそらく10人が見本無しにそれぞれ矩形波信号を作ったら、10人とも異なるプログラムを書くことでしょう。仮に私が10回同じ事をしても、まあ毎回違うプログラムになります。※特にその日の気分や体調,ひらめきによって激変するのがプログラムです。
数学では人によって証明の方法が異なっても同じ結果が得られる事が有りますが、プログラムも同じです。同じ結果が得られるならより簡潔に証明(プログラム)した方が素晴らしいです。
3.1 データ処理プログラムの記入例
'信号生成
For j = 0 To Wave - 1
For i = 0 To 254
A = A + 1
If i <= 254 * (Duty / 100) Then
If Duty = 0 Then
Cells(A + 1, 2) = 0
Else
Cells(A + 1, 2) = Voltage
End If
End If
If i > 254 * (Duty / 100) Then
If Duty = 100 Then
Cells(A + 1, 2) = Voltage
Else
Cells(A + 1, 2) = 0
End If
End If
Cells(A + 1, 1) = Time
Time = Time + (1 / Hz) / 255
Next i
Next j
数学とプログラムで決定的に違う部分が上記プログラム中にあります。
プログラムの中央付近から持ってきた以下の式が違いがよく分かる部分です。
A = A+1・・・①式
①式はなんか不自然ですね、一見数学の式の様に見えますが、数学でこの式は説明出来ません、と言うか明らかに右辺と左辺がイコールではないので間違っています。
しかしプログラムならこの式は「あり」です。むしろ無いと困ります。
数学で使う「=」は本来の意味のイコール(同じ)と言う意味で使います。しかしプログラム(VBA)で「=」には2つの意味が有ります。
1つ目は比較演算子で、右辺と左辺がイコール(同じ)か比較せよの意味です。
2つ目は代入演算子で、プログラムは「For関数」や「IF関数」によって動的に計算結果が変化して行きますので、代入演算子の「=」は変化した右辺の計算結果を左辺の古い値に上書き(代入)してイコール(同じ)にせよと言う意味で使います。
①式を比較演算子として見ると答えは「False」でイコールではないとコンピュータは返し、代入演算子として見ると右辺の計算結果(計算前の古いAに1を足した値)を変数Aに上書きする(代入後Aは新しい値になる)為、何の問題もないわけです。
3.2データ処理する為の関数
「For関数」と「If関数」はプログラムの真髄と言える関数です。この2つを覚えておけば大体なんとかなっちゃいます。
3.2.1 For関数
For関数は人とは違い、同じ事をひたすら全力(高速)で失敗せずに(正確に)繰り返します。これこそコンピュータープログラミングの価値です。
For文の中身は以下の通りです。試しにこのプログラムを実行すると図2の様に「答えは10」と表示されます。
Sub test1()
For i = 1 To 10 'iを0~10からまで繰り返す。1ずつ増加(step0.5で0.5ずづ増加も可)
A=A+1 'ここで繰り返したい変数iを利用した計算を記入する
Next i 'iが+1されForに戻る
MsgBox ("答えは" & A) 'メッセージボックスが表示される
End Sub
図2:メッセージボックスに答え表示
3.2.2 If関数
If関数は忠実で優秀な部下と言えます。今まで自分が判断していた地味な仕事は全てIf関数にブン投げましょう。
If関数の中身は以下の通りです。試しにこのプログラムを実行すると図3の様に「答え:Xは1」と表示されます。
Sub test2()
X=1'If関数が判断する未知の数を与えます
If X = 1 Then 'もしXが1ならば下の行を実行せよ
A="Xは1"'Xが1の時、Aに”Xは1”と代入する
Else 'もしXが1じゃなかったら下の行を実行せよ(ここは無くても良い)
A=”Xは1ではない” 'Xが1ではない時、Aに”Xは1ではない”と代入する
End If 'If分終わり
MsgBox ("答え:" & A) 'メッセージボックスが表示される
End Sub
図3:メッセージボックスに答え表示
※変数に値を代入する
表3:算術演算子
演算子(真ん中) | 説明 |
A + B | AとBの足し算 |
A - B | AとBの引き算 |
A ^ B | AのB乗 |
A * B | AとBの掛け算 |
A / B | AとBの割り算 |
A \ B | AをBで割った整数 |
A Mod B | AをBで割った余り |
※足したり引いたりする
表4:比較演算子
演算子(真ん中) | 意味 |
A = B | AとBは等しい |
A <> B | AとBは等しくない |
A < B | AはB未満 |
A > B | AはBを超える |
A <= B | AはB以下 |
A >= B | AはB以上 |
表2~4は良く使う演算子です。はじめは見ながら使って、そのうち見なくとも覚えてしまいますのではじめからがんばって覚える必要は特にないです。
3.4 計算結果の出力
図2,3で使用したMsgBoxで計算結果を出力する方法も有りますが、Excelは強力な表計算ソフトですので、VBAで処理した計算結果は通常Excelシートのセルに出力した方が後でどうとでも加工出来て便利です。
セルへ出力する為の関数(読み取るセルを指定して入力も出来ます)として以下に示す「Range関数」と「Cells関数」の2つが用意されています。例外的な使い方も出来ますが、「Range関数」はお手軽にセルや範囲を指定したい時に、「Cells関数」は関数内に変数を使いたい時に使用します。
Sub test3()
X = 1 '表示する変数Xに1を代入する
Range("A1") = X'セルの”A1”にXの値(1)が出力される
Cells(1 , 2) = X '1行目と2列目の交点セル”B1”にXの値(1)が出力される
End Sub
図4:上のプログラムを実行した後のExcelシート出力結果
4. 飾る
3の操作で計算結果が出力されましたが、数字が羅列されているだけで見難いです。最後に誰が見ても見易い様に図5の様に表題などを付けると良いです。
'表題追加
Range("A1") = "時間(sec)"
Range("B1") = "電圧(V)"
図5:出力データに表題が付いた状態
5.まとめ
VBAを極めた猛者が作った動画がYouTubeに有りましたので参考までにご紹介します。ここまでの物は私には作れそうにありませんが、ブロック崩し位は作れるかも・・・。ブログの趣旨から思いっきり脱線しそうなので止めときます。
励みになりますのでよければクリック下さい(^o^)/