當我們手邊拿到一份問卷調查的 Excel 檔案,如果問卷題目是「複選」項目,要在 Excel 中分析出每個選項的出現比例,應該沒有比較方便的做法。我自己研究後發現,還是要透過撰寫 VBA 才能快速完成分析工作,否則如果問卷數過多,就會浪費許多時間整理資料。本篇文章將分享我的資料分析方法。
可分析的資料格式
我們收到的資料,大概是這種格式:
每個人的選項以逗號分隔,但每個人的選擇項目都不太一樣,這樣的資料格式必須特別整理過,才能方便透過樞紐分析與圖表的方式呈現。
以下是我們預計整理完後的結果:
資料格式轉換
資料轉換的過程有一定的規律性,所以很適合透過 VBA 轉換資料格式,我們預計用以下流程進行資料整理:
- 結合所有人的選取項目,包含自行填寫「其他」選項(自由填寫)的部分。
- 將所有逗號分隔的項目先轉換成陣列型態
- 將陣列物件過濾掉所有重複的項目
- 最後再將去除重複的項目合併成逗號分隔的字串
以下是完整的 VBA 程式碼:
Function GetItemSize(value As String, Optional separator As String = ",")
Dim DedupeArray As Variant
DedupeArray = RemoveDupes(Split(value, separator))
GetItemSize = UBound(DedupeArray) - LBound(DedupeArray)
End Function
Function RemoveDupStrings(value As String, Optional separator As String = ",")
RemoveDupStrings = Join(RemoveDupes(Split(value, separator)), separator)
End Function
Function RemoveDupes(InputArray) As Variant
Dim OutputArray As Variant
Dim CurrentValue As Variant
Dim A As Variant
On Error Resume Next
OutputArray = Array("")
For Each CurrentValue In InputArray
CurrentValue = Trim(CurrentValue)
Flag = 0
If IsEmpty(CurrentValue) Then GoTo skip
For Each A In OutputArray
If A = CurrentValue Then
Flag = 1
Exit For
End If
Next A
If Flag = 0 Then
ReDim Preserve OutputArray(UBound(OutputArray, 1) + 1)
OutputArray(UBound(OutputArray, 1) - 1) = CurrentValue
End If
skip:
Next
RemoveDupes = OutputArray
End Function
Public Function GetString(ByVal cell As Range) As String
GetString = cell.value & ""
End Function
加入用來計算複選項目的欄位
-
建立一個全新的工作表,假設名稱為 工作表1
-
在 A1
儲存庫透過 RemoveDupStrings
取得不重複選項清單,如下公式:
=RemoveDupStrings(TEXTJOIN(",", TRUE, '表單回應 1'!D2:D200))
-
複製 A1
儲存格,然後用「貼上值」的方式,將內容貼到 A2
儲存格
-
將 A2
儲存格使用 [資料] -> [資料剖析] 功能,解析出所有欄位。此時所有欄位會自動被展開,如果有 6 個選項,就會自動展開 6 個欄位。
-
刪除 第一列
的內容
-
將 工作表1
的所有欄位複製,並到原本的工作表欄位後面 插入複製的儲存格
-
在 E2
儲存格,設定以下公式:
=IF(ISERROR(SEARCH(E$1, $D2)), 0, 1)
-
將 E2
儲存格複製到所有複選分析欄位的儲存格
-
將每個複選選項的欄位進行加總
-
產生圖表!
操作影片
本篇文章的操作步驟有點繁雜,對 Excel 不太熟悉的人可能會看不懂,所以我特別錄製了一段教學影片,應該可以更容易了解完整的操作過程才對。
https://youtu.be/_TexC6h2Bkc
相關連結