第13講 3次元ループと3次元配列による成績一覧表の高度化
第4話 戻るボタンの作成
どうですか。うまくいきましたか。
ただし、年間処理はまだ正しい結果は出ません。
年間処理のコードを作ることが第13講の主題でした。
ところで、ボタンが一番上にあり、2学期以降についてはうまく動作しているかどうか確認するのにスクロールしなければなりません。
そこで、
Private Sub CommandButton4_Click()
f21 '生徒の合計点・平均点の計算
f22 '各教科等の合計点・平均点の計算
f23 '各生徒の合否判定
f24 '各生徒の講評
f25 '各生徒の最高点の算出
f26 '各生徒の最低点の算
f27 '各教科と合計・平均の最高点の算出
f28 '各教科と合計・平均の最低点の算出
Cells(71, 1).Select
End Sub
Cells(71, 1).Selectのように工夫して下さい。数字は、画面の大きさや設定によりますので、皆さんで工夫して下さい。
これは、2学期処理を押すと、2学期の一覧表が出てくるようにしたものです。例えば、
2学期データ作成ボタンをクリックすると、
のように自動的にスクロールされます。
さらに、もう一つ工夫しましょう。例えば、年間成績処理を押すと
工夫によって年間成績一覧表へは自動的に移動できるようになりましたが、
ボタンに戻るにはやはりいちいちスクロースしなければなりません。
そこで、戻るボタンを3つ作り、一番上に一瞬で戻れるようにしましょう。
コード内容は、
Private Sub CommandButton12_Click()
Cells(1, 1).Select
End Sub
という簡単なものです。
どうしてもうまくいかなかった方は、参考ファイル成績一覧表マクロ(シート1枚版)暫定2を利用して下さい。
ではいよいよ成績一覧表マクロ(シート1枚版)暫定2の年間処理を3次元ループによって処理します。
第4話ではセルを利用して3次元処理を行います。
第5話ではグローバル3次元配列を宣言して、3次元配列を使用して3次元処理を実現します。
では3次元ループによって年間処理を実行するコードを書き換えてください。
まず、グローバルな3次元配列は用意しないで、セルのデータを利用して年間処理を行う処理方法を考えましょう。
年間成績一覧表に載せる各教科のデータは、3つの学期の平均とし、小数第1まで表示することにします。
したがって、シートのセルの設定も行ってください。
(あるいは、プログラムの方で小数第1まで表示できるように設定されてもかまいません。)
尚、現在のコード
Private Sub CommandButton10_Click()
f41 '生徒の合計点・平均点の計算
f42 '各教科等の合計点・平均点の計算
f43 '各生徒の合否判定
f44 '各生徒の講評
f45 '各生徒の最高点の算出
f46 '各生徒の最低点の算
f47 '各教科と合計・平均の最高点の算出
f48 '各教科と合計・平均の最低点の算出
Cells(162, 1).Select
End Sub
Function g41(t As Byte, a As Byte)
Dim i As Integer
g41 = 0
If t = 0 Then
For i = 1 To 5
g41 = g41 + Cells(147 + a, 1 + i)
Next
End If
If t = 1 Then
For i = 1 To 40
g41 = g41 + Cells(147 + i, 1 + a)
Next
End If
End Function
Sub f41()
Dim i As Byte, j As Byte
'生徒の合計点・平均点の計算
For i = 1 To 40
Cells(147 + i, 7) = g41(0, i)
Cells(147 + i, 8) = g41(0, i) / 5
Next
End Sub
Sub f42()
Dim i As Byte, j As Byte
'各教科等の合計点・平均点の計算
For i = 1 To 7
Cells(188, 1 + i) = g41(1, i)
Cells(189, 1 + i) = g41(1, i) / 40
Next
End Sub
Sub f43()
Dim i As Byte, j As Byte
'各生徒の合否判定
For i = 1 To 40
If Cells(147 + i, 7) >= 300 Then
Cells(147 + i, 11) = "合格"
End If
If Cells(147 + i, 7) < 300 Then
Cells(147 + i, 11) = "不合格"
End If
Next
End Sub
Sub f44()
Dim i As Byte, j As Byte
'各生徒の講評
For i = 1 To 40
If Cells(147 + i, 7) >= 350 Then
Cells(147 + i, 12) = "あなたはかなり優秀です。"
End If
If Cells(147 + i, 7) < 350 And Cells(147 + i, 7) >= 300 Then
Cells(147 + i, 12) = "おめでとう。"
End If
If Cells(147 + i, 7) < 300 And Cells(147 + i, 7) >= 200 Then
Cells(147 + i, 12) = "合格まで後一歩です。"
End If
If Cells(147 + i, 7) < 200 Then
Cells(147 + i, 12) = "かなりのがんばりが必要です。"
End If
Next
End Sub
Function g42(t1 As Byte, t2 As Byte, a As Byte)
Dim i As Integer
If t1 = 0 Then
g42 = 0
If t2 = 0 Then
For i = 1 To 5
If g42 < Cells(147 + a, 1 + i) Then g42 = Cells(147 + a, 1 +
i)
Next
End If
If t2 = 1 Then
For i = 1 To 40
If g42 < Cells(147 + i, 1 + a) Then g42 = Cells(147 + i, 1 +
a)
Next
End If
End If
If t1 = 1 Then
g42 = 500
If t2 = 0 Then
For i = 1 To 5
If g42 > Cells(147 + a, 1 + i) Then g42 = Cells(147 + a, 1 +
i)
Next
End If
If t2 = 1 Then
For i = 1 To 40
If g42 > Cells(147 + i, 1 + a) Then g42 = Cells(147 + i, 1 +
a)
Next
End If
End If
End Function
Sub f45()
Dim i As Byte, j As Byte
'各生徒の最高点の算出
Dim max As Integer
For i = 1 To 40
Cells(147 + i, 9) = g42(0, 0, i)
Next
End Sub
Sub f46()
Dim i As Byte, j As Byte
'各生徒の最低点の算出
Dim min As Integer
For i = 1 To 40
Cells(147 + i, 10) = g42(1, 0, i)
Next
End Sub
Sub f47()
Dim i As Byte, j As Byte
'各教科と合計・平均の最高点の算出
For i = 1 To 7
Cells(190, 1 + i) = g42(0, 1, i)
Next
End Sub
Sub f48()
Dim i As Byte, j As Byte
'各教科と合計・平均の最低点の算出
For i = 1 To 7
Cells(191, 1 + i) = g42(1, 1, i)
Next
End Sub
をなるべく生かすというのを条件とします。
第3話へ 第5話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る