リストボックスから二つだけ選ばせたい ④ 投票した結果を集計する

昨日は、リストボックスで選んだ二つの項目を投票してみた。
infoment.hatenablog.com
今日は、投票結果の集計に挑戦する。
f:id:Infoment:20190108205447p:plain
昨日は投票のために、特定フォルダにテキストファイル(ファイル名:選択項目)をため込む方式とした。

選択した食べ物の名前_年月日_時分秒.txt

まず今回、集計のためのボタンを追加する。
f:id:Infoment:20190108205914p:plain

集計のための作戦は、↓こうだ。

  1. ファイル名を一つずつ取得して、スプリット関数で分割する。
  2. 分割で得た「食べ物の名前」で、連想配列を作成する。
  3. 連想配列のキーは「食べ物の名前」。
  4. 連想配列のアイテムは、食べ物が登場した回数。
  5. 作成した連想配列を元に、新たな配列を作成する。
    「n票:食べ物の名前」
  6. 投票数を降順でソートする。
  7. メッセージボックスに表示。

配列のソートには、↓ こちらを用いることにした。
infoment.hatenablog.com

集計ボタンのコードが ↓ こちら。

Private Sub TotalButton_Click()
    ' 連想配列を用いて、各メニューの登場回数を数える。
    Dim Dict As Dictionary
    Set Dict = New Dictionary
    Dim myFile As File
        For Each myFile In FSO.GetFolder(VoteFolder).Files
            Dict(Split(myFile.Name, "_")(0)) = Dict(Split(myFile.Name, "_")(0)) + 1
        Next
    
    ' 作成した連想配列で、どのメニューが何回投票されたかを数えた新たな配列を作成。
    Dim seq() As Variant
    ReDim seq(UBound(Dict.Keys))
    Dim i As Long
    Dim myKey As Variant
        For Each myKey In Dict.Keys
            seq(i) = Dict(myKey) & "票:" & myKey
            i = i + 1
        Next
    
    ' 配列を降順にソート。
    Dim SQC As SeaquenceClass
    Set SQC = New SeaquenceClass
        seq = SQC.SortSeq(seq, myDescending)
        
    ' 結果をメッセージボックスに表示。
        MsgBox Join(seq, vbNewLine)
End Sub

結果は、以下の通り。
f:id:Infoment:20190108210923g:plain

今回はメッセージボックスに表示させたが、シートに書き出すことも可能だ。
リストボックスに、リアルタイムで投票結果を表示させることもできる。しかし、現時点での集計結果が、新規投票者の思考や心理に影響するかもしれない。

色々と工夫や配慮が必要だが、それは其々の状況によるだろう。

ということで、このテーマはここまで。

参考まで。