名称未設

【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

バックナンバー


この記事が気に入ったらサポートをしてみませんか?