第4講 If文(もしもボックス)
第7話 講評を5段階にする
(※本ページは
初心者のための excel 2016 マクロ vba 入門講義 基礎から応用まで 第1部の第4講第7話
の一部を再利用してます。)

061
        ~
081
を実現するプログラム例
Private Sub CommandButton1_Click()
  CommandButton2_Click 'シートのB4からK46までを消去させる
  Dim w As Integer, i As Byte, j As Byte
  '以下国語などの表示
  Cells(4, 3) = "国語"
  Cells(4, 4) = "社会"
  Cells(4, 5) = "数学"
  Cells(4, 6) = "理科"
  Cells(4, 7) = "英語"
  Cells(4, 8) = "合計"
  Cells(4, 9) = "平均"
  Cells(4, 10) = "合否"
  Cells(4, 11) = "講評"
  Cells(45, 2) = "合計"
  Cells(46, 2) = "平均"
  For i = 1 To 40 '出席番号の表示
    Cells(4 + i, 2) = i
  Next
  For i = 0 To 39 '100点以下のランダムな得点の入力
    For j = 0 To 4
      Cells(5 + i, 3 + j) = Int(101 * Rnd)
    Next
  Next
  For i = 0 To 39
    w = 0 '0への初期化
    For j = 0 To 4 '横(各生徒)合計算出
      w = w + Cells(5 + i, 3 + j)
    Next
    Cells(5 + i, 8) = w '横(各生徒)合計算表示
    Cells(5 + i, 9) = w / 5 '横(各生徒)平均表示
    If w >= 250 Then Cells(5 + i, 10) = "合格" Else Cells(5 + i, 10) = "不合格"
    If w >= 320 Then
      Cells(5 + i, 11) = "大変優秀です"
    Else
      
If w >= 280 Then
        Cells(5 + i, 11) = "優秀です"
      Else
        If w >= 230 Then
          Cells(5 + i, 11) = "並の成績です"
        Else
          If w >= 200 Then
            Cells(5 + i, 11) = "頑張りが必要です"
          Else
            Cells(5 + i, 11) = "かなりの頑張りが必要です"
          End If
        End If
      End If

    End If
  Next
  For i = 0 To 6
    w = 0 '0への初期化
    For j = 0 To 39 '縦(各教科)合計算出
      w = w + Cells(5 + j, 3 + i)
    Next
    Cells(45, 3 + i) = w '縦(各教科)合計表示
    Cells(46, 3 + i) = w / 40 '縦(各教科)平均表示
  Next
End Sub
Private Sub CommandButton2_Click()
  Range("B4:K46").Select
  Selection.ClearContents 'C10からK46までのセルの消去
  Range("A1").Select
End Sub
参考ダウンロード添付ファイル

第4講最後の課題です。
整数には次のような性質があります。
『任意の整数は
偶数なら2で割り、奇数なら3倍して1を加える
という操作を繰り返すと最後は1になる


例えば、7609を例に取ると
yu



任意の整数を発生させて、for文とif文を組み合わせて、
プログラムを組んで、
この性質を証明しましょう。
この課題は、ノーヒントでは余りにも難しいですから、
ヒントを書いておきます。
まず、制御変数の終わりの値は、大きめに取っておきますから、
Long型で宣言して下さい。
For i = 0 To 100000
回数が何回になるか分からないからです。
For文には途中でFor文から強制的に抜ける方法があるのです。
最初に入力する値をwとしておいてこれを先の約束

偶数なら2で割り、奇数なら3倍して1を加える』
で加工していってwが1になった時点で
If w = 1 Then Exit For
とすることによってFor文を強制的に抜けるわけです。
この後サブプロシージャやファンクションプロシージャなども勉強しますが、
Exit SubとかExit Functionなどとやって、
強制的にサブプロシージャやファンクションプロシージャから抜けることが出来ます。
表示の位置は制御変数のiを上手く使います。

yu
Cells(3 + Int(i / 10), 2 + ((2 * i) Mod 20)) = w
If w > 1 Then Cells(3 + Int(i / 10), 3 + ((2 * i) Mod 20)) = "→"
の2文を使うことをヒントとして提示しておきます。
Int(i / 10)がiを10で割り、小数部分を切り捨てています。
a mod b はaをb割ったときの余りを算出するものです。
今回は((2 * i) Mod 20)となっていますから、iの2倍を20で割った余りを使っています。
2 * iとなっている理由は、数字および→を1個おきに表示させたいからです。

以上のヒントを基にプログラムを組んでみて下さい。


第6話へ 第8話へ


トップへ