毎回「ちょっと面倒な作業」していませんか?
今回の例としてはアンケートを挙げていますが、アンケートに限らず、次のような処理はさまざまな資料で発生します。
たとえば、
- 回答の中に改行が混ざっていてうまく表示されない
- 全角と半角がバラバラで検索や集計ができない
- 「なし」「該当なし」「-」など、いろんな表記が混ざっていて統一したい
こういうデータを毎回目で見て修正していませんか?
VBA(マクロ)を使えば、ボタン1つで一括変換できます。
入力方法がバラバラなデータを揃えるVBA
次のような入力方法がバラバラなアンケートデータを整えて、集計など分析しやすい状態にしていきます。
例:変換前のデータ
氏名 | 性別 | 回答 |
---|---|---|
田中 一郎 | 男 | 特に無し |
サトウ ハナコ | 女 | 該当なし |
鈴木 太郎 | 男 | – |
山田花子 | 女 | 特になし |
ゴール:変換後のデータ
氏名 | 性別 | 回答 |
---|---|---|
田中一郎 | 男 | 無し |
サトウハナコ | 女 | 無し |
鈴木太郎 | 男 | 無し |
山田花子 | 女 | 無し |
実際の流れ
ステップ1:準備
- Excelファイルを用意し、1枚目のシートにアンケート結果を貼り付けます。
- セルは「A列:氏名」「B列:性別」「C列:回答」としましょう。
ステップ2:VBAの内容
Sub survey_clean()
Dim i As Long
Dim ls_rw As Long
Dim res As String
' 最終行を取得(C列にデータが入っている行数)
ls_rw = Cells(Rows.Count, 3).End(xlUp).Row
' 2行目から順に処理
For i = 2 To ls_rw
' 氏名列(A列)を整える
Cells(i, 1).Value = Replace(Cells(i, 1).Value, " ", "") ' 全角スペースを削除
Cells(i, 1).Value = StrConv(Cells(i, 1).Value, vbWide) ' 半角を全角に統一
' 回答列(C列)を整える
res = Cells(i, 3).Value
res = Replace(res, Chr(10), "") ' 改行コード削除
res = Replace(res, Chr(13), "") ' 改行コード削除
' よくある不要な表記を「無し」に統一
res = Replace(res, "該当なし", "無し")
res = Replace(res, "なし", "無し")
res = Replace(res, "特になし", "無し")
res = Replace(res, "-", "無し")
Cells(i, 3).Value = res
Next i
MsgBox "完了しました"
End Sub
内容としては、選択されているシートで、C列の最終行を探し出し、2行目から最終行までのデータをきれいにしていくコードです。
全角スペースの削除、半角を全角に、改行(コード)の削除、さらに、回答自体については、セル上で行なってもいいですが、コードが長くなるので、「res」という変数に入れた上で、変数上で改行コードの削除や、内容の変更を行なっています。
今回は例のため、4行で行いましたが、これが100行、1000行とデータが増えていくと目視では限界があります。そのため、VBAを使うことでスムーズに変更することができます。
ただ、文字の変更については、想定したもの以外のものが出てきた場合には、「無し」になるように新たにVBAを追加する必要があります。
ポイント
- 今回は難しい構文や関数は使っていません
- 処理は「1行ずつ」だから、見た目もシンプルになります
- 「Replace」で指定した文字列だけを置き換えるので、トラブルになりにくい
- 変換対象はC列だけ!必要なら他の列にも応用可
他に応用例は?
- 回答に「未回答」がある場合は空欄にするなど、条件分岐も可能です
- 複数の列にまたがって同じような整形をしたいときは、列番号を変えるだけで応用できます
まとめ
一度きりのものであれば、マクロを作成するのは大袈裟ですが、毎月実施している、毎日膨大な量のアンケートの集計を行っている、など定期的にある場合には、マクロで処理をした方が作業時間が短縮できます。
すべての業務の効率化は目視や、パワープレイ(手作業など)をしていることをいかにExcelにやらせるかがポイントです。
コメント