CSVファイルの特定の箇所をExcelに読込む

2024年4月28日

CSVファイルをExcelに読み込む際、CSVファイルの特定の箇所だけを読み込みたいケースがあると思います。
そんな時に利用していただけるVBAを作成しましたのでご紹介します。
今回紹介するサンプルアプリは「CSVファイル取り込み」ボタンをクリックしてCSVファイルを選択するだけで内容を取り込むことができます。取り込む箇所はVBAの中で指定しています。

サンプルアプリ実行結果

以下の手順でCSVファイルを取り込みます。
「CSVファイル取り込み」ボタンをクリックして、下記CSVデータ(CSVSample.csv)を選択します。

 —— CSVSample.csv ———————-
 社員番号,氏名,所在地,郵便番号,連絡先
 10001,山田太郎,東京都,150-0001,03-1234-5678
 10002,小林花子,大阪府,540-0002,06-1234-5678
 10003,佐藤一郎,北海道,060-0003,011-1234-5678
 10004,田中五郎,福岡県,812-0004,092-1234-5678
 10005,林浩司,愛知県,460-0005,052-1234-5678
 ——————————————–

CSVデータの中から「氏名」と「連絡先」だけが取り込まれます。
取り込んだ結果は以下のようになります。

サンプルコードの処理内容

ファイルへの入出力 (I/O) を有効にするOpenステートメントとInputモードの構文を使ってCSVファイルを取り込みます。

「Open varFileName For Input As #1」

 varFileName :フルパスのファイル名を指定します。
 #       :1 ~ 511 の範囲で任意のファイル番号を指定します。

文字列を読込むには Line Input # ステートメントを使います。
Line Inputステートメントは、1行分のデータを読み込むと、読み取りポイントを次の行に移します。
つまり、Line Inputステートメントを繰り返すことで、テキストファイルの中を、1行ずつ、すべて読み込むことができるわけです。
読み取りがファイルの終端に達するまで、Line Inputステートメントを繰り返します。

「Line Input #1, buf

 #  : 任意の有効なファイル番号
 buf : 有効な 変数または 文字列 の変数名

読み取りポイントがファイルの終端に達したかどうかは、EOF関数で判定できます。
EOF関数は、読み取りポイントがファイルの終端に達するとTrueを返します。

 Do Until EOF(1)
  ・
  ・
 Loop

ファイルを閉じるにはCloseステートメントを使います。

「Close #1」

 #:(省略可)Openステートメントで指定したファイル番号を指定します。

サンプルコード  アプリの作成手順はこちら

「ChDir UrlToLocal(ThisWorkbook.Path)」のUrlToLocal関数の説明については以下リンク先を参照ください。正常に動作しない場合の対処方法についても説明しています。
 https://scodebank.com/?p=696

Option Explicit '変数の宣言を強制する

Sub CSVファイル取込み()

   '変数を定義する
    Dim buf  As String, tmp As Variant, i As Long
        
   '既存のデータを削除
    Range(Cells(5, 2), Cells(10, 3)).ClearContents
 
   'CSVSample.csv ファイルの場所を指定
   'ファイルがあるカレントドライブを指定
    ChDir UrlToLocal(ThisWorkbook.Path)

   'カレントドライブのフォルダを開く
    Dim varFileName As Variant
    varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                  Title:="CSVファイルの選択")
                  
    'キャンセルボタンを選択した場合
    If varFileName = False Then
        Exit Sub
    End If
   
   
    'エクセルシートの5行目からCSVデータをセットする
    i = 5
   
    'CSVファイル読み込み
    Open varFileName For Input As #1


      'CSVデータがなくなるまでループ
       Do Until EOF(1)
       
        'CSVデータの1行目を読込む
         Line Input #1, buf

        'カンマでデータを分解して配列変数「tmp」にデータをセットする
         tmp = Split(buf, ",")
                         
         Cells(i, 2) = tmp(1) '氏名をエクセルのセルにセット
         Cells(i, 3) = tmp(4) '電話番号をエクセルのセルにセット
                  
        '次の行を指定
         i = i + 1
       Loop
        
    'CSVファイルを閉じる
    Close #1
    
    'A1のセルを選択して終了
     Range("A1").Select
     
  
End Sub



Public Function UrlToLocal(ByRef Url As String) As String

   'OneDrive環境変数を格納する変数の定義
    Dim OneDrive As String

   'OneDrive環境変数の取得
    OneDrive = Environ("OneDrive")

   '「https://・・・・・・・/Documents」までの文字数を格納する変数の定義
    Dim CharPosi As String

   ' URLからローカルパスを作成する
    If Url Like "https://*" Then 'OneDriveのパスかどうかの判定
           
      '「https://・・・・・・・/Documents」までの文字数を取得
      CharPosi = InStr(1, Url, "/Documents") + 10
      
      'ローカルパス作成
      Url = OneDrive & Replace(Mid(Url, CharPosi), "/", Application.PathSeparator)
    
    Else
    
      'OneDriveのパス以外だったらカレントドライブ指定
      ChDrive Left(Url, 1)
     
    End If

  '作成したローカルパスを返す
   UrlToLocal = Url

End Function