2008年08月06日

エクセルでCSVファイルをそのまま開く

 システム間の連携や、データの吐き出しの際によくCSVファイルを使うのだけれど、一つ問題がある。CSVファイルをエクセルで読み込むと、文字列データが勝手に数字に変換されたりしてしまうのです。これは結構ポピュラーな問題らしく、web上でもよく質問されている。
 メモ帳で開いたりすれば元データが見られるんだけど、それではさすがに見にくい、エクセル上で手軽に確認・編集できればと思ってソースを書いてみました。
 例によって多分内容は汚いけど、動くので問題ないと思います。
(新しくブックを追加してますが、それが嫌な人は「新規ブックを作成」の部分を削除してください)
Sub CSVをそのまま開く()

Dim CSVのパス As String
Dim 読み込み用数列(1 To 256) As Integer
Dim i As Integer
Dim j As Integer

'---------------------------------------------------------
'CSVファイルを指定

CSVのパス = Application.GetOpenFilename( _
FileFilter:="CSVファイル,*.csv,すべてのファイル,*.*")

If CSVのパス = "False" Then
Exit Sub
End If

If LCase(Right(CSVのパス, 4)) <> ".csv" Then
Exit Sub
End If

'---------------------------------------------------------
'新規ブックを作成

Workbooks.Add (xlWBATWorksheet)

'---------------------------------------------------------
'読み込み用数列を生成

For i = 1 To 256
読み込み用数列(i) = 2
Next

'---------------------------------------------------------
'読み込み

With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & CSVのパス, _
Destination:=Range("A1"))
.TextFileCommaDelimiter = True

.TextFileColumnDataTypes = 読み込み用数列

.Refresh
.Delete
End With

End Sub
 Excel2007には対応していません。「For i = 1 To 256」の256を16384に変更すれば良いのかも知れないし、そんな単純ではないかも知れない。
(8/7修正:不要な部分を少し削りました)
この記事へのコメント
その後、若干手を入れた物。

Sub opencsvastext()

Dim csvpath As String
Dim textarray(1 To 256) As Integer
Dim i As Integer
Dim j As Integer

'---------------------------------------------------------
'新規ブックを作成

Workbooks.Add

'---------------------------------------------------------
'CSVファイルを指定

csvpath = Application.GetOpenFilename( _
FileFilter:="CSVファイル,*.csv,すべてのファイル,*.*")

If csvpath = "False" Then
Exit Sub
End If

If LCase(Right(csvpath, 4)) <> ".csv" Then
Exit Sub
End If

'---------------------------------------------------------
'不要なシートを削除

i = Sheets.Count

If i > 1 Then
For j = i To 2 Step -1
Application.DisplayAlerts = False
Sheets(j).Delete
Application.DisplayAlerts = True
Next
End If

Sheets(1).Select

'---------------------------------------------------------
'読み込み用数列を生成

For i = 1 To 256
textarray(i) = 2
Next

'---------------------------------------------------------
'読み込み

With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & csvpath, _
Destination:=Range("A1"))
.TextFileCommaDelimiter = True

.TextFileColumnDataTypes = textarray

.Refresh
.Delete
End With

End Sub
Posted by LSTY at 2011年08月24日 16:10
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック
過去ログ