NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Excel VBAの使い方!(プログラム編)

 前回の記事で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
図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

 
イメージ 3
図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

 
イメージ 4
図3:メッセージボックスに答え表示

3.3 各種演算子
 コンピューターは足し算・引き算(演算子)の他に色々できます。VBAで使われる主な演算子を表2~4に示します。
 
    表2:代入演算子
演算子(真ん中) 説明
A = B AにBを代入する
変数に値を代入する
 
    表3:算術演算子
演算子(真ん中) 説明
A + B AとBの足し算
A - B AとBの引き算
A ^ B AのB乗
* B AとBの掛け算
/ B AとBの割り算
\ B AをBで割った整数
Mod B AをBで割った余り
足したり引いたりする
 
    表4:比較演算子
演算子(真ん中) 意味
A = B AとBは等しい
<> B AとBは等しくない
< B AはB未満
> B AはBを超える
<= B AはB以下
>= 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

 
イメージ 5
図4:上のプログラムを実行した後のExcelシート出力結果
 3の内容を理解すれば、簡単なルーティーンワークから複雑な処理まで自由自在にコンピューターへ仕事をお任せ出来る様になります。

4. 飾る

 3の操作で計算結果が出力されましたが、数字が羅列されているだけで見難いです。最後に誰が見ても見易い様に図5の様に表題などを付けると良いです。

    '表題追加
    Range("A1") = "時間(sec)"
    Range("B1") = "電圧(V)"

イメージ 2
図5:出力データに表題が付いた状態

 VBAExcelの全ての機能が利用できますので表題を付けるだけでなく、セルに色を付けたり、文字の色を変えたり、罫線を引いたり、グラフ化したり、オートシェイプを追加したりと色々出来ます。はじめのうちは色々試してみると面白いですよ。

5.まとめ

 VBAを極めた猛者が作った動画がYouTubeに有りましたので参考までにご紹介します。ここまでの物は私には作れそうにありませんが、ブロック崩し位は作れるかも・・・。ブログの趣旨から思いっきり脱線しそうなので止めときます。
【Mario】Excel Mario / エクセルでスーパーマリオを作ってみた。【完成版】
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る