MS Excel でCSVファイルを読み込むと、データの内容が勝手に変更されてしまう場合があります。例えば、「007」という数字3文字の文字列が「7」に変わってしまったりします。つまり、それらしいデータを勝手に数字や日付として認識し、標準の書式で表示してしまうようです。一度誤認識されて読み込まれたデータは、もうExcel上では元のデータに修正できません。
この不具合に対する対策として、メニューの「データ」→「外部データの取り込み」で、各項目を文字列に設定して読み込むという方法があります。しかし、頻繁にCSVファイルを利用している人にとっては、毎回こんなことをするのは面倒です。そこで、VBAによるアドインで何とかならないものかと検討してみました。
明示的にExcelに各項目を文字列として読み込ませることができれば、「007」が「7」に変換されることなく、そのまま「007」と読み込まれるはずです。CSVファイルを開いたとき、全項目を文字列として読み直すプログラムをVBAを使って作ってみました。次のプログラムを「Cl1」という名前でクラスモジュールとして作成しました。
Option Explicit
Public WithEvents App As Application
'===== CSVファイルを開いた時に実行確認 =====
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
If UCase(Right(Wb.Name, 4)) = ".CSV" Then
If MsgBox("全項目を文字列として読み込みますか?", vbYesNo, "CSV読み込み") = vbYes Then
LoadCsvS Wb.Name
End If
End If
End Sub
'===== CSVファイル読込み(全項目を文字列として) =====
Private Sub LoadCsvS(fname As String)
Dim fpname As String
Dim i As Long, j As Long, k As Long
Dim hln As String
Dim hi As Variant, hi1 As Variant
Dim cc As String
Dim qflg As Boolean
Dim dat(256) As String ' 列数の最大値は256(Office XP)
fpname = Application.ActiveWorkbook.Path & "\" & fname
Open fpname For Input As #1
i = 0
Do Until EOF(1)
hln = ""
qflg = False
Do Until EOF(1)
cc = Input(1, #1)
If qflg = True Then
' "..."内の文字列の処理
If cc = """" Then
qflg = False
ElseIf cc = vbCr Then
cc = ""
End If
hln = hln & cc
Else
' "..."内以外の文字列の処理
If cc = vbCr Or cc = vbLf Or cc = vbCrLf Then
If hln <> "" Then Exit Do ' 1行読込み終了
ElseIf cc = "," Then
hln = hln & vbBack
ElseIf cc = """" Then
' "..."内の""かどうか判別
k = Len(hln)
If k < 1 Then
qflg = True
hln = hln & cc
ElseIf Right(hln, 1) <> """" Then
qflg = True
hln = hln & cc
End If
Else
hln = hln & cc
End If
End If
Loop
' vbBackを区切りとして分解
hi = Split(hln, vbBack, -1, vbTextCompare)
j = 0
For Each hi1 In hi
' 文字列両端のダブルクォーテーションを消す
If Left(hi1, 1) = """" And Right(hi1, 1) = """" Then
hi1 = Mid(hi1, 2, Len(hi1) - 2)
End If
dat(j) = hi1
j = j + 1
Next
' シートに1行表示
i = i + 1
Rows(i).NumberFormatLocal = "@"
Rows(i).Value = dat
Erase dat
Loop
Close #1
End Sub
このプログラムが、CSVファイルを開いたときに動作するように、標準モジュールに次のように書いておきました。
Option Explicit
Dim acl1 As New Cl1
'===== アドイン読込時に自動実行 =====
Sub Auto_Open()
Set acl1.App = Application
End Sub
上記クラスモジュールと標準モジュールを含むアドインを作成し、Excelで利用できるように設定すれば準備完了です。アドインの作成方法はExcelのヘルプ等で調べられます。
アドインの設定をすると、ExcelでCSVファイルを開いた時に「全項目を文字列として読み込みますか?」と尋ねてきますので、「はい」を選ぶと全項目のデータを文字列として読み直します。これで不要な変換を防ぐことができます。
上記のプログラムを流用するのは自由ですが、無保証でありサポート対象外ですので、ご注意ください。