難易度:★☆☆(かんたん)

※当校のExcel VBAコースを補足する内容となっています。


Excel VBAでは、セル操作に「配列」をよく利用します。効率のよいプログラムを作るためには、この配列操作は欠かせません。まず、金種計算表で使い方を練習しましょう。

Excelにおいて、複数セルの集まりを配列であると説明している場合があります。また、複数セルを対象に1つの数式を作成する配列数式という数式もあります。

今回は、プログラミングにおける配列を取り扱います。

金種計算プログラム

セル「A1」に金額を入力して実行すると、最小単位の紙幣・硬貨がそれぞれ何枚必要かを計算して表示します。ただし、金種は10,000円・5,000円・1,000円・500円・100円・50円・10円・5円・1円の9種類とし、2,000円札は計算に入れないこととします。

金種計算表

金額を大きいお札で除算して、必要な枚数を求めて、残りの金額を計算して… 

除算の余りを求めることのできる、「mod演算子」を使うよ

配列を使わずに求める

紙幣・硬貨が何枚必要か、それぞれ変数を準備して求めます。


Sub 金種計算_before()

    Dim i, w_Amari As Long
    Dim w_10000 As Long
    Dim w_5000 As Long
    Dim w_1000 As Long
    Dim w_500 As Long
    Dim w_100 As Long
    Dim w_50 As Long
    Dim w_10 As Long
    Dim w_5 As Long
    Dim w_1 As Long
    
    
    Range("A4:D12") = ""
    i = 4
    w_Amari = Cells(1, 1)
    w_10000 = Int(w_Amari / 10000)
    If w_10000 <> 0 Then
        Cells(i, 1) = 10000
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_10000
        Cells(i, 4) = "円"
        w_Amari = w_Amari Mod 10000
        i = i + 1
    End If
    
    w_5000 = Int(w_Amari / 5000)
    If w_5000 <> 0 Then
        Cells(i, 1) = 5000
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_5000
        Cells(i, 4) = "円"
        w_Amari = w_Amari Mod 5000
        i = i + 1
    End If
    
    w_1000 = Int(w_Amari / 1000)
    If w_1000 <> 0 Then
        Cells(i, 1) = 1000
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_1000
        Cells(i, 4) = "円"
        w_Amari = w_Amari Mod 1000
        i = i + 1
    End If
    
    w_500 = Int(w_Amari / 500)
    If w_500 <> 0 Then
        Cells(i, 1) = 500
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_500
        Cells(i, 4) = "円"
        w_Amari = w_Amari Mod 500
        i = i + 1
    End If
    
    w_100 = Int(w_Amari / 100)
    If w_100 <> 0 Then
        Cells(i, 1) = 100
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_100
        Cells(i, 4) = "円"
        w_Amari = w_Amari Mod 100
        i = i + 1
    End If
    
    w_50 = Int(w_Amari / 50)
    If w_50 <> 0 Then
        Cells(i, 1) = 50
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_50
        Cells(i, 4) = "円"
        w_Amari = w_Amari Mod 50
        i = i + 1
    End If
    
    w_10 = Int(w_Amari / 10)
    If w_10 <> 0 Then
        Cells(i, 1) = 10
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_10
        Cells(i, 4) = "円"
        w_Amari = w_Amari Mod 10
        i = i + 1
    End If
    
    w_5 = Int(w_Amari / 5)
    If w_5 <> 0 Then
        Cells(i, 1) = 5
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_5
        Cells(i, 4) = "円"
        i = i + 1
    End If
    
    w_1 = w_Amari Mod 5
    If w_1 <> 0 Then
        Cells(i, 1) = 1
        Cells(i, 2) = "枚"
        Cells(i, 3) = w_1
        Cells(i, 4) = "円"
        i = i + 1
    End If
    
End Sub

同じようなif文ばかりで分かりにくいし長い…

配列と繰り返し文を組み合わせることで、簡潔に書けるようになりますよ。

配列を使って求める

金種のデータを配列に格納しましょう。


Sub 金種計算()

    Dim i, j As Long
    Dim w_Kinsyu() As Variant
    Dim w_Amari As Long
        
    w_Kinsyu = Array(10000, 5000, 1000, 500, 100, 50, 10, 5, 1)
    Range("A4:D12") = ""
    w_Amari = Cells(1, 1)
    j = 4
    
    For i = 0 To 8
        If Int(w_Amari / w_Kinsyu(i)) <> 0 Then
            Cells(j, 1) = w_Kinsyu(i)
            Cells(j, 2) = "円"
            Cells(j, 3) = Int(w_Amari / w_Kinsyu(i))
            Cells(j, 4) = "枚"
            w_Amari = w_Amari Mod w_Kinsyu(i)
            j = j + 1
        End If
    Next i
    
End Sub

すごく短くなった!

コードが短くなるということは可読性も向上します。また、処理の追加や修正など、手直しのにかける手間を大きく減らすことが出来るので、こういったスキルを身につけるのは大事なことなんです。