CSVファイルインポート時の文字化けの要因とは
- ファイルの文字コードが異なる場合:CSVファイルは通常、Unicode以外の文字コードで保存されています。エクセルはUTF-8、UTF-16などのUnicodeを使用するため、CSVファイルとエクセルの文字コードが異なる場合、文字化けが発生する可能性があります。
- セルの書式が適切でない場合:CSVファイルには書式が含まれていないため、エクセルにインポートする際に適切な書式を設定する必要があります。適切な書式を設定しない場合、テキストが数値や日付として解釈されることがあり、文字化けが発生する可能性があります。
- CSVファイルの区切り文字が異なる場合:CSVファイルは、通常、カンマ、タブ、セミコロンなどの区切り文字を使用してデータを区切ります。エクセルにインポートする際に、適切な区切り文字を指定しない場合、データが正しく区切られず、文字化けが発生する可能性があります。
- ファイルの改行コードが異なる場合:CSVファイルは通常、改行コードを使用してデータを区切ります。Windowsでは、改行コードとして「CRLF」が使用されますが、Mac OSやLinuxでは「LF」が使用されます。エクセルにインポートする際に、ファイルの改行コードが異なる場合、文字化けが発生する可能性があります。
これらの要因を考慮して、適切な文字コード、セルの書式、区切り文字、改行コードを設定することで、CSVファイルをエクセルに正しくインポートすることができます。
CSVファイルをインポートする場合の注意
CSVファイルをエクセルにインポートすると、数値が指数表示になってしまう場合があります。この問題を回避するには、インポート時に数値の書式を設定する必要があります。
Sub ImportCSV()
Dim filename As String
filename = Application.GetOpenFilename("CSV Files (*.csv), *.csv", , "Select CSV File")
If filename = False Then Exit Sub
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & filename, Destination:=Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileDecimalSeparator = "."
.TextFileThousandsSeparator = ","
.Refresh
End With
Range("A1").CurrentRegion.NumberFormat = "0.00"
End Sub
Application.GetOpenFilename
関数を使用して、CSVファイルを選択するダイアログボックスを表示します。- 次に、
ActiveSheet.QueryTables.Add
メソッドを使用して、CSVファイルをエクセルにインポートします。 .TextFileDecimalSeparator
プロパティを設定することで、小数点のセパレーターを明示的に指定し、指数表示を避けることができます。- 最後に、インポートされた範囲に数値書式を適用するために、
Range("A1").CurrentRegion.NumberFormat
プロパティを設定しています。この例では、小数点以下2桁を表示する書式を設定していますが、必要に応じて書式を変更することができます。
CSVファイルをインポート(ループ取り込み)
エクセルファイルを開き、アクティブシートにCSVファイルをインポートする
CSVファイルの各要素(単語)の区切りに従い、何の区切り文字で区切るのかを指定します。
(テキスト量の多い、CSVファイルをインポートする場合はエラー処理をしておくことをお薦め)
*ハイライトの箇所を変更して活用してください
Sub CSVファイルループ取り込み()
'このブックのシート
Dim ws As Worksheet
Set ws = ThisWorkbook.ActiveSheet
'エラー処理
On Error GoTo myError
'インポートするファイル
Dim strPath As String
'Dim myFile As Variant
strPath = Application.GetOpenFilename("CSVファイル(*.csv),*.csv")
If VarType(strPath) = vbBoolean Then
MsgBox "キャンセルされました"
End If
Dim i As Long, j As Long
Dim strLine As String
Dim arrLine As Variant 'カンマでsplitして格納
Open strPath For Input As #1 'CSVをオープン
i = 1
Do Until EOF(1)
Line Input #1, strLine
arrLine = Split(strLine, ",") 'strLineをカンマで区切りarrLineに格納
For j = 0 To UBound(arrLine)
ws.Cells(i, j + 1).Value = arrLine(j)
Next j
i = i + 1
Loop
Close #1
MsgBox "完了"
Exit Sub
myError:
MsgBox "エラー発生"
MsgBox "完了"
End Sub
Split関数:
ある区切り文字で区切られた文字列を、その区切り文字で区切り、区切られた各文字列を、一次元配列として返します。要するに区切り文字(カンマなど)で単語を分ける処理をします。
解説
- 4.5行目:アクティブシートにインポート
参考)シートをしてする場合は以下の通り
ThisWorkbook.Worksheets(1) - 8行目:「On Error GoTo myError」でエラー処理。「ESCキー」のタップでエラー発生。
エラー発生で38行へ。 - 13~15行目:ダイアログを表示して該当のCSVファイルを指定
- 23行目:CSVファイルをオープン
- 25~34行名:CSVファイルを最終行までループ処理
- 28行目:strLineをSplitでカンマで区切りarrLineに格納
参考)CSVデータが空欄の場合などは、このカンマを変更
arrLine = Split(strLine, ",")
- 36行目:CSVファイルを閉じる
UTF-8のCSVファイルをインポート
Sub csvインポート_カンマ区切り()
Dim ws As Worksheet
Dim qtbl As QueryTable
Dim getfilepath As String
Set ws = ActiveSheet
getfilepath = Application.GetOpenFilename("ブック, *.csv")
If getfilepath <> "False" Then
Else
MsgBox "キャンセル"
End
End If
Set qtbl = ws.QueryTables.Add(Connection:="TEXT;" & getfilepath, Destination:=ws.Range("A1"))
With qtbl
.TextFilePlatform = 65001
.TextFileCommaDelimiter = True
.RefreshStyle = xlOverwriteCells
.Refresh
.Delete
End With
MsgBox "完了"
End Sub
解説
- Set qtbl = ws.QueryTables.Add(Connection:=”TEXT;” & getfilepath, Destination:=ws.Range(“A1”))
⇒CSVファイルを開く - qtbl.TextFilePlatform = 65001 :文字コード UTF-8
- qtbl.TextFileCommaDelimiter = True :カンマ区切り
- qtbl.RefreshStyle = xlOverwriteCells :上書き
- qtbl.Refresh:表示する
- qtbl.Delete:CSV接続 解除
コメント