PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやデータ分析などもやっています。

【VBA】Excelマクロを使って年代を調べよう!【連想配列】

Excelマクロを使って年代を調べよう!

久しぶりに、VBAを書くような気がします。
会社勤めをしている人は、分かって頂けると思いますが。
どうしてもExcelが身近なツールとなり、仕事を下支えする存在になっています。

最近では、MarketoとかSalesforce、kintoneとか巷で話題の最新のツールを使う機会があれども、
ローカルでの管理はExcelに頼っているという実情もあるかと思います。

ローカルとリモート。
パソコンの知識とITリテラシー

埋まらない社内SEと運用者のミゾ・・・。

f:id:PeaceJet:20170712102026p:plain

上記のように、A列に年齢データがあるとします。
簡単に、年代と人数を調べたいなと思って、以下のコードを書きました。

10代~90代までを連想配列に入れる方法で、動作します。

※注意※ 「ツール」→「参照設定」→「Microsoft Scripting Runtime」を有効にして下さい。

外部のライブラリを使用しないように、Collectionとかを使って実装してみたのですが。
Keyが上手く取れなかったので、結局、Scripting RuntimeからDictionaryを使うことにしました。

途中で、すごい勢いで初期化しておりますが、これをしないと結果が空欄になってしまうので仕方ないかと。

Public Sub SearchAge()

    Dim aWs As Worksheet: Set aWs = ThisWorkbook.ActiveSheet
    Dim Tenth, Twentyth, Thirtyth, Fourtyth, Fiftyth, Sixtyth, Seventyth, Eightyth, Ninetyth As Long

    Dim Age As Object: Set Age = New Scripting.Dictionary
    
    Tenth = 0
    Twentyth = 0
    Thirtyth = 0
    Fourtyth = 0
    Fiftyth = 0
    Sixtyth = 0
    Seventyth = 0
    Eightyth = 0
    Ninetyth = 0
    
    For i = 2 To aWs.Range("A65535").End(xlUp).Row
        
        Select Case aWs.Range("A" & i).Value
            
            Case 10 To 19
                Tenth = Tenth + 1
            Case 20 To 29
                Twentyth = Twentyth + 1
            Case 30 To 39
                Thirtyth = Thirtyth + 1
            Case 40 To 49
                Fourtyth = Fourtyth + 1
            Case 50 To 59
                Fiftyth = Fiftyth + 1
            Case 60 To 69
                Sixtyth = Sixtyth + 1
            Case 70 To 79
                Seventyth = Seventyth + 1
            Case 80 To 89
                Eightyth = Eightyth + 1
            Case 90 To 99
                Ninetyth = Ninetyth + 1

        End Select
    
    Next i
    
        Age.Add Key:="10代", Item:=Tenth
        Age.Add Key:="20代", Item:=Twentyth
        Age.Add Key:="30代", Item:=Thirtyth
        Age.Add Key:="40代", Item:=Fourtyth
        Age.Add Key:="50代", Item:=Fiftyth
        Age.Add Key:="60代", Item:=Sixtyth
        Age.Add Key:="70代", Item:=Seventyth
        Age.Add Key:="80代", Item:=Eightyth
        Age.Add Key:="90代", Item:=Ninetyth
        
    Dim Key As Variant: Key = Age.Keys
    
    aWs.Range("B" & 1) = "年代"
    aWs.Range("C" & 1) = "人数"
    
    For k = 1 To 9
    
         aWs.Range("B" & k + 1) = Key(k - 1)
         aWs.Range("C" & k + 1) = Age(k & "0代")
    
    Next k
    
'        Debug.Print Age("10代")
'        Debug.Print Age("20代")
'        Debug.Print Age("30代")
'        Debug.Print Age("40代")
'        Debug.Print Age("50代")
'        Debug.Print Age("60代")
'        Debug.Print Age("70代")
'        Debug.Print Age("80代")
'        Debug.Print Age("90代")

End Sub