リストボックスから二つだけ選ばせたい ④ 投票した結果を集計する
昨日は、リストボックスで選んだ二つの項目を投票してみた。
infoment.hatenablog.com
今日は、投票結果の集計に挑戦する。
昨日は投票のために、特定フォルダにテキストファイル(ファイル名:選択項目)をため込む方式とした。
選択した食べ物の名前_年月日_時分秒.txt
まず今回、集計のためのボタンを追加する。
集計のための作戦は、↓こうだ。
- ファイル名を一つずつ取得して、スプリット関数で分割する。
- 分割で得た「食べ物の名前」で、連想配列を作成する。
- 連想配列のキーは「食べ物の名前」。
- 連想配列のアイテムは、食べ物が登場した回数。
- 作成した連想配列を元に、新たな配列を作成する。
「n票:食べ物の名前」 - 投票数を降順でソートする。
- メッセージボックスに表示。
配列のソートには、↓ こちらを用いることにした。
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
結果は、以下の通り。
今回はメッセージボックスに表示させたが、シートに書き出すことも可能だ。
リストボックスに、リアルタイムで投票結果を表示させることもできる。しかし、現時点での集計結果が、新規投票者の思考や心理に影響するかもしれない。
色々と工夫や配慮が必要だが、それは其々の状況によるだろう。
ということで、このテーマはここまで。
参考まで。