こんにちは、今回の記事はcsvファイルから列番号を指定してその列の情報のみを別ファイルに出力するマクロサンプルを紹介します。
サンプルマクロの概要としては、VBScriptとcsvファイルを同じフォルダに配置し、スクリプトをダブルクリックすると別のcsvファイルに出力するというマクロサンプルになります。
例えば、以下のようにcsvファイルの3列目のデータのみを抽出するというものです。

それでは、いってみましょう!
スポンサーリンク
csvファイルの指定した列番号のみ抽出するVBScript
動作の前提
- 読み込むcsvファイル名は"test.csv"
- 読み込まれたcsvファイルを1行ずつ処理
- 読み込んだ1行を”,”(カンマ)区切りで配列に格納
- 指定列の配列に入っているデータのみを別ファイルに書き出す
- 日本語はSJISのみ対応(UTF-8だと文字化けしました)
詳細な説明についてはVBScript内にコメント文として記載していきます。csvの一つの列要素が改行などで複数行になっている場合の対処処理は記載していないので、上手くいかないかと思います。
スクリプトサンプル
Option Explicit
On Error Resume Next
' スクリプト内で使う変数定義
Dim objInFso '読込csvファイル用システムオブジェクト
Dim objInFile '読込ファイル用
Dim objOutFso '書込csvファイル用システムオブジェクト
Dim objOutFile '出力ファイル用
Dim tmpStr '一時的格納文字列
Dim printStr '出力文字列
Dim fName '出力ファイル名
Dim tmpArry '1行をカンマ区切りで格納するための配列
Dim i 'ループ処理用カウント用
Dim columnNo '抽出する列番号
' ★抽出する列番号を指定、一番左列を1として
columnNo = 3
' 出力ファイル名生成(ここでは実行日時)
fName = Replace(Replace(Replace(Now(),"/", ""),":", "")," ","") & ".csv"
' 出力ファイル定義
Set objOutFso = CreateObject("Scripting.FileSystemObject")
Set objOutFile = objOutFso.CreateTextFile(fName, true)
' csvファイルを1行ずつ読み込み、指定した列のみ書き出す
Set objInFso = WScript.CreateObject("Scripting.FileSystemObject")
' 読込ファイルを開く(★読み込むファイル名はここで指定)
Set objInFile = objInFso.OpenTextFile("test.csv")
' ファイルの最後(EOF)まで読み込む
Do While objInFile.AtEndOfStream <> True
' 読み込んだ1行を一時的な変数に格納
tmpStr = objInFile.ReadLine
' 1行をカンマ区切りで一時的な配列に格納
tmpArry = Split(tmpStr, ",")
' 一時的配列を読込
For i = 0 To UBound(tmpArry)
'指定した列番号=配列の番号(配列は0からカウントなので+1)となったら出力ファイルへ書き出す
If i + 1 = columnNo Then
printStr = tmpArry(i)
objOutFile.Write(printStr + vbCrLf)
End If
Next
Loop
' ファイルクローズ
objInFile.Close
objOutFile.Close
' ファイルシステムオブジェクト解放
Set objInFso = Nothing
Set objOutFso = Nothing
スクリプトでの注意点
スクリプトを作成する際に、エラー処理まで考慮できていないこと・ファイルシステムオブジェクトの扱い方がしっかり分かっていないため、参考までに良きに修正して使っていただければと思います。
さいごに
いかがだったでしょうか。同じような疑問を持たれている方の参考になれば幸いです。複数列を抽出するスクリプトサンプルはまた別途記事で。それでは、また!つぎの記事で。
スポンサーリンク