【ExcelVBA公開模試】リストを2次元の表にする(その1)
文法を無視して、とりあえず動けばいいという邪道ExcelVBA講座こと「速読VBA単語」に準拠した問題を出題します。
問題
図1のように10チームによる総当たりのリーグ戦を行うことになった。1枚目のシートのA列にチーム名、1行目に略称、L列にはB~K列の合計を求める数式が入力されている。ExcelVBAを用いて各設問の処理を実行しなさい。
(1)2枚目のシートに、総当たりの組み合わせ45通りをセル範囲A2:B46に出力しなさい(図2)。
(2)図3のように、2枚目のシートのC2:C46に左のチームが勝ち=〇、引き分け=△、負け=×を表す記号を入力した。空欄は対戦していないことを表す。この記号に対応する勝ち点(勝ち3点、引き分け1点、負け0点)をリーグ表に入力しなさい(図4)。
<図1>
<図2:設問(1)完成イメージ>
<図3>
<図4:設問(2)完成イメージ>
わえなび式 正解例
(このページの下にあります)
目標回答時間
プロ10分以内、アマチュア15分以内に処理ができたら合格
この問題の出題範囲
「速読VBA単語」Program3-7まで
ご案内
ExcelVBAをなんとなく理解できればいいという初心者のための「速読VBA単語」を受講希望の方はカリキュラムをご覧ください。
正解例
設問(1)
Sub kakko1()
team = Sheets(1).Range("B1:K1")
team_max = UBound(team, 2)
rowcnt = 2
For i = 1 To team_max
For j = 1 To team_max
If i < j Then
Sheets(2).Cells(rowcnt, 1) = team(1, i)
Sheets(2).Cells(rowcnt, 2) = team(1, j)
rowcnt = rowcnt + 1
End If
Next
Next
End Sub
設問(2)
Sub kakko2()
team = Sheets(1).Range("B1:K1")
team_max = UBound(team, 2)
For i = 2 To 46
listdata3 = Sheets(2).Cells(i, 3)
If listdata3 <> "" Then
listdata1 = Sheets(2).Cells(i, 1)
listdata2 = Sheets(2).Cells(i, 2)
For j = 1 To team_max
If listdata1 = team(1, j) Then
listdata1 = j + 1
ElseIf listdata2 = team(1, j) Then
listdata2 = j + 1
End If
Next
If listdata3 = "〇" Then
Sheets(1).Cells(listdata1, listdata2) = 3
Sheets(1).Cells(listdata2, listdata1) = 0
ElseIf listdata3 = "×" Then
Sheets(1).Cells(listdata1, listdata2) = 0
Sheets(1).Cells(listdata2, listdata1) = 3
Else
Sheets(1).Cells(listdata1, listdata2) = 1
Sheets(1).Cells(listdata2, listdata1) = 1
End If
End If
Next
End Sub
設問(2)別解:2次元配列を使ったパターン
Sub kakko2()
Dim teamtate As Range
Dim teamyoko As Range
team = Sheets(1).Range("B1:K1")
team_max = UBound(team, 2)
a = Sheets(2).Range("A2:C46")
For i = 1 To 45
If a(i, 3) <> "" Then
For j = 1 To team_max
If a(i, 1) = team(1, j) Then
team1 = j + 1
ElseIf a(i, 2) = team(1, j) Then
team2 = j + 1
End If
Next
Set teamtate = Sheets(1).Cells(team1, team2)
Set teamyoko = Sheets(1).Cells(team2, team1)
If a(i, 3) = "〇" Then
teamtate.Value = 3
teamyoko.Value = 0
ElseIf a(i, 3) = "×" Then
teamtate.Value = 0
teamyoko.Value = 3
Else
teamtate.Value = 1
teamyoko.Value = 1
End If
End If
Next
End Sub
バックナンバー
この記事が気に入ったらサポートをしてみませんか?