Excelについて詳しく解説します
- VBAでテキストファイルを読み込むにはどうすればいい?
- ボタンを押して実行したい
- コピペで作業できるようにしてほしい
この記事ではExcelVBAで「対象のテキストファイルのデータを1行ずつシートに転記する」サンプルコードを紹介します。
記事内のサンプルコードをコピペして設定するだけで、作業の自動化が可能です。
また、このサンプルコード内の処理についても、詳しく解説しています。
ご参考までに、それではどうぞ。
目次
対象のテキストファイルのデータを1行ずつシートに転記する
'対象となるテキストファイルのフルパスを変数「trgtTextFileFulllPath」に定義 Dim trgtTextFileName As String trgtTextFileName = "読込テキストファイル.csv" Dim trgtTextFilePath As String trgtTextFilePath = ThisWorkbook.Path Dim trgtTextFileFullPath As String trgtTextFileFullPath = trgtTextFilePath & "\" & trgtTextFileName '読込結果を出力するシートを指定 Dim trgtSh As Worksheet Set trgtSh = ThisWorkbook.Worksheets("テキストファイル読込") '出力開始行を指定 Dim trgtRow As Long trgtRow = 1 '出力開始列を指定 Dim strtCol As Long strtCol = 4 Dim buf As String Dim tmpAry As Variant Dim indexNum As Long Dim trgtRng As Range '対象のテキストファイルを読み込むために開く Open trgtTextFileFullPath For Input As #1 Do Until EOF(1) '変数「buf」に1行分のデータを格納 Line Input #1, buf 'テキストファイル対象行のデータを配列に格納 tmpAry = Split(buf, ",") '配列の要素の数を変数「indexNum」に定義 indexNum = UBound(tmpAry) - LBound(tmpAry) + 1 '出力セル範囲を変数「trgtRng」に定義して出力 Set trgtRng = trgtSh.Range(trgtSh.Cells(trgtRow, strtCol), trgtSh.Cells(trgtRow, strtCol + indexNum - 1)) trgtRng.Value = tmpAry '次の対象行を取得 trgtRow = trgtRow + 1 Loop '開いたテキストファイルを閉じる Close #1
▼実行前
▼実行後
※住所は全てダミーデータです。
今回のコードでは、画像のようにボタンを押すと対象のテキストファイルからデータを読み込み、読み込んだデータをシートに転記しています。
順に解説します。
マクロを実行できるボタンの設置方法
はじめにコードの解説の前にボタンの設置方法を解説します。
「開発」タブ、「挿入」をクリックして、フォームコントロール内の「ボタン(フォームコントロール)」をクリックしてください。
※「開発」タブがない場合は、「ファイル」内「オプション」から「リボンのユーザー設定」を選択し、「開発」にチェックを入れて「OK」を押してください。
「ボタン(フォームコントロール)」をクリックした状態で通常のオートシェイプと同じようにシート上をドラッグアンドドロップすることで、任意の大きさのボタンを設置することができます。
ドラッグアンドドロップでボタンを設置すると画像のダイアログが表示されるので、テキストファイル読込マクロの名前(画像では「LoadTextFile」)を指定して「OK」をクリックしてください。
その後、ボタンが表示されるので右クリックから「テキストの編集」を選択して、ボタン名を任意の名前に書き換えてください。
これでクリックするとマクロが実行されるボタンが設置できました。
対象のテキストファイルのデータを1行ずつシートに転記するコードの解説
テキストファイル読込・出力に関連する変数定義
はじめに、読み込みたいテキストファイルの情報や出力時に使用する変数を定義しています。
'対象となるテキストファイルのフルパスを変数「trgtTextFileFulllPath」に定義 Dim trgtTextFileName As String trgtTextFileName = "読込テキストファイル.csv" Dim trgtTextFilePath As String trgtTextFilePath = ThisWorkbook.Path Dim trgtTextFileFullPath As String trgtTextFileFullPath = trgtTextFilePath & "\" & trgtTextFileName '読込結果を出力するシートを指定 Dim trgtSh As Worksheet Set trgtSh = ThisWorkbook.Worksheets("テキストファイル読込") '出力開始行を指定 Dim trgtRow As Long trgtRow = 1 '出力開始列を指定 Dim strtCol As Long strtCol = 4
変数「trgtTextFileName」に読み込みたいテキストファイル名を指定し「trgtTextFilePath」にそのテキストファイルが保存されているパスを指定します。
ここで「ThisWorkbook.Path」を指定していますが、これは、「マクロ実行ブックが保存されているパス」を返します。
ただ、「ThisWorkbook.Path」には末尾の「\」は含まれていないため、読込テキストファイルのフルパスを定義する変数「trgtTextFileFullPath」には「trgtTextFilePath & "\" & trgtTextFileName」を指定しています。
次に出力対象シートを変数「trgtSh」に定義しています。また、出力開始行と出力開始列についてもそれぞれ変数「trgtRow」「strtCol」に定義しています。
テキストファイルを読み込むために開く「For Input」
つづいて、テキストファイルを読込むために開く「For Input」について解説します。
Dim buf As String Dim tmpAry As Variant Dim indexNum As Long Dim trgtRng As Range '対象のテキストファイルを読み込むために開く Open trgtTextFileFullPath For Input As #1 ~~~ '開いたテキストファイルを閉じる Close #1
「Open ~ For Input As #~」は、フルパスで指定したファイルを任意の番号を割り振って開く処理になります。
ここでは、「trgtTextFileFullPath」を番号「1」として「For Input」、つまり読み込むために開いています。
その後任意の処理を行い、最後に必ず「Close #~」で開いたファイルを閉じます。
「Close #~」を行っていない場合、余計なテキストファイルが開いたままとなり、連続実行時にエラーが発生する、同じ番号でテキストファイルを開けないなどの弊害が生じるため、必ず行うようにしましょう。
繰り返し処理「Do Until Loop」でシートにデータを転記
最後に、「Do Until Loop」を使って、テキストファイルのデータを転記するコードについて解説します。
Do Until EOF(1) '変数「buf」に1行分のデータを格納 Line Input #1, buf 'テキストファイル対象行のデータを配列に格納 tmpAry = Split(buf, ",") '配列の要素の数を変数「indexNum」に定義 indexNum = UBound(tmpAry) - LBound(tmpAry) + 1 '出力セル範囲を変数「trgtRng」に定義して出力 Set trgtRng = trgtSh.Range(trgtSh.Cells(trgtRow, strtCol), trgtSh.Cells(trgtRow, strtCol + indexNum - 1)) trgtRng.Value = tmpAry '次の対象行を取得 trgtRow = trgtRow + 1 Loop
「Do Until Loop」は、指定した条件を満たすまで繰り返しを続ける処理です。
ここでは、条件に「EOF(1)」を指定しています。これは、「End Of File」の略で、読み込むために開いている任意の番号(ここでは「1」)が割り振られたファイルの末尾に達すると「True」を返します。
つまり、テキストファイルの最終行に達して「EOF(1) = True」となるまで処理を繰り返すことになります。
次に「Line Input #1, buf」で、任意の番号のテキストファイルから、対象の1行分のデータを変数「buf」に格納します。
続いて、カンマ区切りデータとなっている変数「buf」の値を「Split(buf, ",")」によって配列「tmpAry」に格納しています。
「Split」は画像のように、第一引数に指定した文字列(ここでは「buf」)を第二引数に指定した文字列(ここでは「,」)を基準に分割する関数です。
この時「tmpAry」は画像のような配列となります。(テキストファイルのデータは「No, 郵便番号, 住所, 住所カナ」で構成)
続いて、シートに転記するため、データの数を「indexNum」に定義します。この時使用している「UBound()」と「LBound()」はそれぞれ、指定された配列の最大のインデックス番号、最小のインデックス番号を取得します。
上の画像の丸数字がインデックス番号なので「UBound(tmpAry)」は「3」と「LBound(tmpAry)」は「0」となり、「tmpAry」の要素数「indexNum」には「3 - 0 + 1」つまり「4」が定義されます。
ここまでに定義してきた変数(「trgtRow」「strtCol」「indexNum」)を使ってセル範囲「trgtRng」を定義し、「tmpAry」の値を「trgtRng」に転記します。
最後に、「trgtRow」に1を追加して、転記する行を1行下にずらしてループのはじめに戻ります。
以上、コピペでできるExcelVBAでの「対象のテキストファイルのデータを1行ずつシートに転記する」方法の紹介でした。
コード内で解説した繰り返し処理や関数もコピペで使えますので、試してみてください。