ExcelVBA(実践6)

ExcelVBA

前回の記事では演習問題4(数字当てゲーム)、挨拶3(フォームコントロールボタン)、セルへの操作(Range)、セルの行列幅調整について学習しました
今回はまず演習問題5(ドット絵)に挑戦してもらい、その後でWhile文、プログラムの連携について学習し、それに関連する演習問題6(複雑な数列の連携)に挑戦してもらって、最後にSleep関数についても学習しましょう
まずはExcelを開いて「開発」タブのリボン左端の「Visual Basic」ボタンをクリックし「Microsoft Visual Basic for Applications」画面を起動して、その画面の「挿入」タブの「標準モジュール」を選択してプログラミングの準備をしましょう

演習問題5(ドット絵)

これまで学習した知識を使って以下のプログラムを作ってみましょう
ルール1)「マリオ(静止画)」と文字が書かれたフォームコントロールボタンを用意し、ボタンに「ドット絵」というプログラム名を設定してクリックすると以下のドット絵が表示されるようにする

ルール2)セルの行の高さと列の幅はそれぞれ以下の大きさに設定する
 行の高さ Cells.RowHeight = 20 * 0.118
 列の幅 Cells.ColumnWidth = 20 * 0.75

演習問題5(ドット絵)ヒント:途中経過(首)
Sub ドット絵()
    Cells.ColumnWidth = 20 * 0.118
    Cells.RowHeight = 20 * 0.75
    Range("F6:J6 , E7:M7").Interior.ColorIndex = 3 '帽子部分(ColorIndex = 3 赤色)
    Range("E9:E10 , F11:I12 , J12:L12 , G9 , H8:I10 , J10 , K8:K9 , L9:M10 , N10").Interior.ColorIndex = 40 '顔の部分(ColorIndex = 40 肌色)
    Range("D9:D11 , E11 , E8:G8 , F9:F10 , G10 , J8:J9 , J11:M11 , K10 ").Interior.ColorIndex = 1 'かみとひげと目の部分(ColorIndex = 1 黒色)
End Sub
演習問題5(ドット絵)解答
Sub ドット絵()
    Cells.ColumnWidth = 20 * 0.118
    Cells.RowHeight = 20 * 0.75
    Range("F6:J6 , E7:M7").Interior.ColorIndex = 3 '帽子部分(ColorIndex = 3 赤色)
    Range("G13:G15 , J13:J14 , G15:J15 , F16 , H16:I16 , K16 , F17:L18 , E18:E19 , F19:G19 , J19:K19 , L18: L19 ").Interior.ColorIndex = 5 'ズボン部分(ColorIndex = 5 青色)
    Range("G16, J16").Interior.ColorIndex = 6 'ズボンのボタン部分(ColorIndex = 6 黄色)
    Range("E9:E10 , F11:I12 , J12:L12 , G9 , H8:I10 , J10 , K8:K9 , L9:M10 , N10").Interior.ColorIndex = 40 '顔の部分(ColorIndex = 40 肌色)
    Range("C16:D18 , E17 , L17 , M16:N18").Interior.ColorIndex = 40 '手の部分(ColorIndex = 40 肌色)
    Range("C21 , D20:F21 , K20:M21 , N21").Interior.ColorIndex = 53 'くつの部分(ColorIndex = 53 茶色)
    Range("C15 , D14:D15 , E13:E16 , F13:F15 , H13:I14 , K13 , K14:M15 , L16 , N15 ").Interior.ColorIndex = 3 '服の部分(ColorIndex = 3 赤色)
    Range("D9:D11 , E11 , E8:G8 , F9:F10 , G10 , J8:J9 , J11:M11 , K10 ").Interior.ColorIndex = 1 'かみとひげと目の部分(ColorIndex = 1 黒色)
End Sub

While文

For文の際にループには決められた回数繰り返すループと条件を満たす間ずっと繰り返すループの2種類あるという説明をしましたが、今回はWhile文という条件を満たす間ずっと繰り返すループについて学習しましょう

While文は以下のような構文になります

While 条件
 処理
Wend

While文のループはWhile~Wend で挟まれた処理を条件を満たす間ずっと繰り返します
この条件とは比較演算と論理演算で学習した通り、計算結果がTrueの時に実行するという意味です
(詳しくはMicrosoftのVBAに関する「While…Wend ステートメント」のページをご覧ください)
また、処理の行は左端から一定の隙間(インデント)を空けて、Whileのループに含まれている部分であることを見やすくしましょう

では実際にWhile文を使ったプログラムを書いて見ましょう
以下はBoolean型の変数「正解」を宣言して「正解」の初期値をFalseにしており、While文の条件として「正解」がFalseの間はずっとInputBoxの質問を繰り返します
InputBoxの質問に入力した内容を文字型の変数「回答」へ代入し、「回答」が正しい場合は「正解」をTrueに変更しWhileのループを抜け、「回答」が正しくない場合はMsgBoxで「違います」と表示します

上記のプログラムと同じ内容を以下に記載します

Sub While文()
    Dim 正解 As Boolean
    正解 = False
    Dim 回答 As String
    While 正解 = False
        回答 = InputBox("織田信長を本能寺で倒した人物を漢字で答えて")
        If 回答 = "明智光秀" Then
            正解 = True
        Else
            MsgBox "違います"
        End If
    Wend
End Sub

プログラムの連携

今回はプログラムから別のプログラムを呼び出して連携する方法を学習しましょう
連携する方法は「Call 呼び出したいプログラム名」とするだけです
(詳しくはMicrosoftのVBAに関する「Call ステートメント」のページをご覧ください)
実際に別々のプログラムを呼び出して連携するプログラムを書いてみましょう
折角なので単純なプログラムを呼び出すのではなく「等差数列」と「等比数列」という少し数学の勉強っぽいプログラムにしてみます

以下は「等差数列」という1から開始して+3ずつ一定間隔で並んでいる数列をA1~A10セルへ入力するプログラムと「等比数列」という3から開始して×2ずつ一定の倍率で並んでいる数列をB1~B10セルへ入力するプログラムを2つ用意して、「プログラムの連携」というプログラムからそれぞれ順番に呼び出しています
処理順序を分かりやすくするためにそれぞれのプログラムにブレイクポイント(赤丸)を入れました

上記のプログラムと同じ内容を以下に記載します

Sub 等差数列()
    Dim a As Integer: a = 1 '変数aの宣言と初期化
    Dim i As Integer
    For i = 1 To 10
        Cells(i, 1).Value = a
        a = a + 3
    Next i
End Sub
Sub 等比数列()
    Dim b As Integer: b = 3 '変数bの宣言と初期化
    Dim j As Integer
    For j = 1 To 10
        Cells(j, 2).Value = b
        b = b * 2
    Next j
End Sub
Sub プログラムの連携()
    MsgBox "等差数列を呼び出します"
    Call 等差数列
    MsgBox "等比数列を呼び出します"
    Call 等比数列
End Sub

演習問題6(複雑な数列の連携)

これまで学習した知識を使って以下のプログラムを作ってみましょう
ルール1)以下の数列の値をA1~A10のセルへ入力する「階差数列」というプログラムを作成する
階差数列 6、11、18、27、38、51、66、83、102、123
ルール2)以下の数列の値をB1~B10のセルへ入力する「フィボナッチ数列」というプログラムを作成する
フィボナッチ数列 1、1、2、3、5、8、13、21、34、55
ルール3)ルール1とルール2で作成したプログラムを順番に呼び出す「複雑な数列の連携」というプログラムを作成する

演習問題6(複雑な数列の連携)ヒント:考え方(階差数列)

数列を表す変数cと隣との差を表す変数dを用意し10回のループの中で以下のようにずらしていく

演習問題6(複雑な数列の連携)ヒント:考え方(フィボナッチ数列)

数列を表す変数xと変数xの右隣の値を表す変数y、変数xと変数yの合計の値を表す変数zの3つを用意し10回のループの中で変数xに変数yを代入し、変数yに変数zの値を代入して以下のようにずらしていく

演習問題6(複雑な数列の連携)解答
Sub 階差数列()
    Dim c As Integer: c = 6 '変数cの宣言と初期化
    Dim d As Integer: d = 5  '変数dの宣言と初期化
    Dim i As Integer
    For i = 1 To 10
        Cells(i, 1).Value = c
        c = c + d
        d = d + 2
    Next i
End Sub
Sub フィボナッチ数列()
    Dim x As Integer: x = 1 '変数xの宣言と初期化
    Dim y As Integer: y = 1 '変数yの宣言と初期化
    Dim z As Integer '変数zの宣言
    Dim j As Integer
    For j = 1 To 10
        Cells(j, 2).Value = x
        z = x + y
        x = y
        y = z
    Next j
End Sub
Sub 複雑な数列の連携()
    Call 階差数列
    Call フィボナッチ数列
End Sub

Sleep関数

Sleep関数を使うとプログラム実行中に指定した時間だけ処理をストップすることが出来ます
ただ、このSleep関数というのは今まで学習したMsgBox関数やRnd関数やInputBox関数などVBAがあらかじめ用意している関数ではなく、WindowsのOSが用意している関数(Windows APIと言います)のため、使用するためには「Microsoft Visual Basic for Applications」画面の先頭行に以下の長い呪文のようなコマンドを記述する必要があります
(詳しくはMicrosoftのWindowsAPIに関する「Sleep 関数 (synchapi.h)」のページをご覧ください)

Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)

このコマンドの意味はWindowsのOSに関する複雑な内容なので理解しなくて大丈夫ですが、アルファベットの大文字と小文字も区別されるので間違えないようにそのまま記述しましょう
1点だけ注意する点として、Millisecondsとはミリ秒のことでSleep関数は時間をミリ秒で指定する必要があります(1000ミリ秒 = 1秒です)
また、VBAでは長い行は「半角スペース + アンダーバー」を挿入すると、以下のように改行して2段に分けて書くことが出来ます(単語の途中で改行するとエラーになるので単語と単語の間で改行するようにしてください)

Declare PtrSafe Sub Sleep Lib _
“kernel32” (ByVal dwMilliseconds As Long)

実際にSleep関数を使ったプログラムを書いてみましょう
以下はA1~A10セルに1秒ごとに数字1~10を入力するプログラムです

上記のプログラムと同じ内容を以下に記載します

Declare PtrSafe Sub Sleep Lib _
"kernel32" (ByVal dwMilliseconds As Long)
Sub Sleep関数()
    Dim i As Integer
    For i = 1 To 10
        Cells(i, 1).Value = i
        Sleep 1000
    Next i
End Sub

ここまで学習したVBAの内容を理解できているか確認するため、次回は演習問題7(アニメーション)に挑戦してもらおうと思います
その後、デバッグ、関数、セルの書式設定についても学習してもらいます

<<1つ前の記事  1つ後の記事>>

コメント

タイトルとURLをコピーしました