ExcelVBA(実践5)

ExcelVBA

前回の記事では比較演算と論理演算、演習問題3(FizzBuzz)、挨拶2(入力)について学習しました
今回は演習問題4(数字当てゲーム)に挑戦してもらいます
また、挨拶3(フォームコントロールボタン)、セルへの操作(Range)、セルの行列幅調整についても学習しましょう
まずはExcelを開いて「開発」タブのリボン左端の「Visual Basic」ボタンをクリックし「Microsoft Visual Basic for Applications」画面を起動して、その画面の「挿入」タブの「標準モジュール」を選択してプログラミングの準備をしましょう

演習問題4(数字当てゲーム)

これまで学習した知識を使って以下のプログラムを作ってみましょう
ルール1)変数「正解の数」を1~30のどれかランダムに決定
ルール2)「1~30までの好きな数字を入力して3回以内に正解の数を当ててください」とMsgBoxにて表示
ルール3)InputBoxにて「1~30のどれか数字を入力してください」と質問して、入力内容を変数「回答」に代入
ルール4)ルール1で決めた「正解の数」とルール3の「回答」が一致しているか判定
ルール5)ルール4で一致していた場合は「正解」とMsgBoxにて表示して処理終了
ルール6)ルール4で一致していない場合は結果に合わせて「もっと小さい数です」または「もっと大きい数です」とMsgBoxにて表示
ルール7)ルール3の回答を何回行ったか判定
ルール8)ルール7で3回未満だった場合はルール3へ戻る
ルール9)ルール7で3回回答済みの場合はMsgBoxにて「正解は〇でした」と表示して処理終了(〇は変数「正解の数」の数字)

【正解(2回目)の場合】

【不正解(3回間違え)の場合】

演習問題4(数字当てゲーム)ヒント:処理の流れ

以下の記事に記した処理の流れ(フローチャート)を参照
アルゴリズムの具体例と表現方法

演習問題4(数字当てゲーム)ヒント:考え方


ルール1)変数「正解の数」を1~30のどれかランダムに決定
→ Rnd関数(0以上1未満の数)の29倍(Rnd * 29)は0以上29未満の数であり、
整数型の変数「正解の数」へ代入すると小数第1位で四捨五入されるため0~29の整数となる
よって、変数「正解の数」を1~30の範囲の整数にするには(Rnd * 29 +1)とする
参考:ランダムな数

ルール5)ルール4で一致していた場合は「正解」と表示して処理終了
→ For文を途中で抜けるには「Exit For」を実行する
参考:For文

ルール9)ルール7で3回回答済みの場合はMsgBoxにて「正解は〇でした」と表示して処理終了(〇は変数「正解の数」の数字)
→ 実現方法として以下2パターンある
パターン1:For文の中で、IF文の条件分岐にてループ回数が3だった場合に「正解は〇でした」と表示する
パターン2:正解したかチェックするための変数を設けて初期値を0とし、もし正解した場合はそのチェックするための変数の値を1とし、For文が終わった後の行でIF文の条件分岐にてチェックするための変数が0の場合に「正解は〇でした」と表示する

演習問題4(数字当てゲーム)解答

【解答パターン1】

Sub 数字当てゲーム()
    Dim 正解の数 As Integer
    正解の数 = Rnd * 29 + 1
    MsgBox "1~30までの好きな数字を入力して3回以内に正解の数を当ててください"
    Dim 回答 As Integer
    For i = 1 To 3
        回答 = InputBox("1~30のどれか数字を入力してください")
        If 正解の数 = 回答 Then
            MsgBox "正解"
            Exit For
        ElseIf 正解の数 < 回答 Then
            MsgBox "もっと小さい数です"
        Else
            MsgBox "もっと大きい数です"
        End If
        If i = 3 Then
            MsgBox "正解は" & 正解の数 & "でした"
        End If
    Next i
End Sub

【解答パターン2】

Sub 数字当てゲーム()
    Dim 正解の数 As Integer
    正解の数 = Rnd * 29 + 1
    MsgBox "1~30までの好きな数字を入力して3回以内に正解の数を当ててください"
    Dim 回答 As Integer
    Dim 正解チェック As Integer
    正解チェック = 0
    For i = 1 To 3
        回答 = InputBox("1~30のどれか数字を入力してください")
        If 正解の数 = 回答 Then
            MsgBox "正解"
            正解チェック = 1
            Exit For
        ElseIf 正解の数 < 回答 Then
            MsgBox "もっと小さい数です"
        Else
            MsgBox "もっと大きい数です"
        End If
    Next i
    If 正解チェック = 0 Then
        MsgBox "正解は" & 正解の数 & "でした"
    End If
End Sub

挨拶3(フォームコントロールボタン)

以前、挨拶1(出力)の中のプログラムの実行方法にて、VBAのプログラムを実行するときはキーボードのF5キーを押すかプログラムの上のマークをクリックするとご説明しましたが、今回はそれ以外の方法として、Excel内にボタンを設置し、そのボタンをクリックしたタイミングで実行するようにしたいと思います
まず以下の3つの簡単なプログラムを準備しましょう
なお、プログラムの最後(End Sub)の下に新しくSub プログラム名を記入してキーボードのEnterキーを押すと自動的にプログラムとプログラムの境界線が引かれます

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

Sub こんにちは()
    MsgBox "こんにちは"
End Sub
Sub Hello()
    MsgBox "Hello"
End Sub
Sub Bonjour()
    MsgBox "Bonjour"
End Sub

プログラムの準備が出来たらExcelの画面に移動し、開発タブのリボンのコントロールグループの中にある「挿入」をクリックし、その下に表示されるフォームコントロールの左上の□(ボタン)をクリックします

そしてボタンを設置したい場所でマウスをドラッグすると「マクロの登録」という画面が表示されるので対象のプログラムを選択するとボタンが設置されます

設置されたボタンの文字を適当な文字へ変更し、ボタンの外側をクリックするとボタン設置完了です
(ボタンの周りに白い○が付いている状態はまだボタンが編集中の状態です)
設置したボタンをクリックすると設定したプログラムが呼び出せるようになっています

同様の手順で3つのボタンを設置し、それぞれボタンをクリックしてプログラムを呼び出してみましょう
なお、ボタンを削除するにはボタンの上で右クリックをして、ボタンを編集中の状態(ボタンの周りに白い○が付いている状態)にしてからボタンの外側をクリックし、その後でキーボードのDelキーを押すと削除出来ます

セルへの操作(Range)

以前、セルへの操作(Cells)を学習しましたが、今回はもう1つのセルの操作(Range)について学習していこうと思います
セルの場所の指定について、CellsはCells(行番号 , 列番号)でしたがRangeはRange(“アルファベットの列番号&数字の行番号”)と表すため、例えば一番左上のセルはRange(“A1”)と表します
また、セルへの値の入力の仕方は「Range(“アルファベットの列番号&数字の行番号”).Value = 値」となります
セルの場所の指定の表記方法以外にCellsとRangeには以下のような違いがあります
(詳しくはMicrosoftのVBAに関する「Range.Cells プロパティ」のページをご覧ください)

比較項目CellsRange使用例
① 変数によるセル指定×Cells(i , 1)
※iは変数
② 複数範囲のセル指定×Range(“A1:B5 , C7”)
③ 名前の管理によるセル指定×Range(“関東地方”)
※セルの特定の範囲に
「関東地方」という名前を定義した場合

上記の①については以前、セルへの操作(Cells)で説明したのでここでは省略します
上記の②について、以下のようなプログラムを実行すると複数のセルに一括で同じ値をセット出来ます

上記の③について、プログラムを実行する前にまずExcelに以下のような表を作成しましょう

次に数式タブのリボンの「定義された名前グループ」の「名前の管理」ボタンをクリックし、
上記のA列~H列の2行目以降をそれぞれ名前の定義にて以下のように定義しましょう
「名前の管理」の使い方が分からない場合はExcelの名前の管理に関する記事を参照してください

「名前の管理」にて定義したそれぞれの地方ごとに色を付けるプログラムを実行したいと思います
色を付けるには「Range(“定義した名前”).Interior.ColorIndex = 色のインデックス番号」という書き方で、色のインデックス番号とは以下のようにExcelにあらかじめ決められた56種類の色の番号のことを表します

1        13        25        37        49       
2        14        26        38        50       
3        15        27        39        51       
4        16        28        40        52       
5        17        29        41        53       
6        18        30        42        54       
7        19        31        43        55       
8        20        32        44        56       
9        21        33        45           
10        22        34        46           
11        23        35        47           
12        24        36        48           

上記の内容で実際に以下のプログラムを実行するとそれぞれの地方ごとに色を付けることが出来ます

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

Sub セルへの操作Range2()
    Range("北海道").Interior.ColorIndex = 3
    Range("東北").Interior.ColorIndex = 4
    Range("関東").Interior.ColorIndex = 45
    Range("中部").Interior.ColorIndex = 6
    Range("近畿").Interior.ColorIndex = 7
    Range("中国").Interior.ColorIndex = 8
    Range("四国").Interior.ColorIndex = 19
    Range("九州").Interior.ColorIndex = 20
End Sub

セルの行列幅調整

行の高さや列の幅はRowHeight(行の高さ)とColumnWidth(列の幅)で設定することが出来ますが、ややこしいことに行と列で数字の単位が違うので注意しましょう
(詳しくはMicrosoftのVBAに関する「Range.RowHeight プロパティ」「Range.ColumnWidth プロパティ」のページをご覧ください)

Cells.RowHeight = 数字 ※ポイント単位(1ポイントの大きさ = 1/72インチ = 0.3527センチ)
Cells.ColumnWidth = 数字 ※文字数単位(1文字の大きさ = 標準フォント標準フォントサイズにおける 0 という数字1文字の大きさ)

実際に行の高さ(RowHeight)と列の幅(ColumnWidth)を同じ数字にするとどれくらい差があるか見てみましょう

上記のプログラムを実行すると以下のようにセルが横長になりました

行の高さと列の幅を同じ大きさにするには、行の高さと列の幅にそれぞれ以下の係数を掛けます

上記のプログラムを実行すると以下のようにセルが正方形の形になりました

これまで学習した内容をきちんと理解しているか確認するため、次回は演習問題5(ドット絵)に挑戦してもらいます
その後で、While文やプログラムの連携についても学習し、演習問題6(複雑な数列の連携)にも挑戦してもらい、さらにSleep関数について学習しましょう

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

コメント

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