例文を使って繰り返し業務を時短

【マクロ・VBA】CSVファイルをインポートする

エクセル、マクロ、VBAのCSVファイルをループしてインポートする方法 VBA

CSVファイルインポート時の文字化けの要因とは

  1. ファイルの文字コードが異なる場合:CSVファイルは通常、Unicode以外の文字コードで保存されています。エクセルはUTF-8、UTF-16などのUnicodeを使用するため、CSVファイルとエクセルの文字コードが異なる場合、文字化けが発生する可能性があります。
  2. セルの書式が適切でない場合:CSVファイルには書式が含まれていないため、エクセルにインポートする際に適切な書式を設定する必要があります。適切な書式を設定しない場合、テキストが数値や日付として解釈されることがあり、文字化けが発生する可能性があります。
  3. CSVファイルの区切り文字が異なる場合:CSVファイルは、通常、カンマ、タブ、セミコロンなどの区切り文字を使用してデータを区切ります。エクセルにインポートする際に、適切な区切り文字を指定しない場合、データが正しく区切られず、文字化けが発生する可能性があります。
  4. ファイルの改行コードが異なる場合: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接続 解除

ダミーデータのダウンロード

コメント

タイトルとURLをコピーしました