Option Explicit
' CSV形式テキストファイル書き出すサンプル
Sub WRITE_CSVFile()
Const cnsTITLE = "CSVテキストファイル出力処理"
Const cnsFILTER = "CSVファイル (*.csv;*.dat),*.csv;*.dat"
Dim xlAPP As Application ' Applicationオブジェクト
Dim intFF As Integer ' FreeFile値
Dim strFILENAME As String ' OPENするファイル名(フルパス)
Dim X(1 To 5) As Variant ' 書き出すレコード内容
Dim GYO As Long ' 収容するセルの行
Dim GYOMAX As Long ' データが収容された最終行
Dim lngREC As Long ' レコード件数カウンタ
Dim COL As Long ' カラム(Work)
' Applicationオブジェクト取得
Set xlAPP = Application
' 「名前を付けて保存」のフォームでファイル名の指定を受ける
xlAPP.StatusBar = "出力するファイル名を指定して下さい。"
strFILENAME = xlAPP.GetSaveAsFilename(InitialFilename:="SAMPLE.csv", _
FileFilter:=cnsFILTER, Title:=cnsTITLE)
' キャンセルされた場合は以降の処理は行なわない
If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub
' 収容最終行の判定(Excel認知の最終行から上に向かってデータがある行を探す)
GYOMAX = Cells.SpecialCells(xlCellTypeLastCell).Row
Do While Cells(GYOMAX, 1).Value = ""
GYOMAX = GYOMAX - 1
Loop
If GYOMAX < 2 Then
xlAPP.StatusBar = False
MsgBox "テキストをA~E列2行目から入力してから起動して下さい。",, cnsTITLE
Exit Sub
End If
' FreeFile値の取得(以降この値で入出力する)
intFF = FreeFile
' 指定ファイルをOPEN(出力モード)
Open strFILENAME For Output As #intFF
' 2行目から開始
GYO = 2
' 最終行まで繰り返す
Do Until GYO > GYOMAX
Erase X ' 初期化 ' ①
' A~E列内容をレコードにセット(先頭は2行目)
For COL = 1 To 5
X(COL) = FP_CutInjusticeChar(Cells(GYO, COL).Value) ' ②
Next COL
' レコード件数カウンタの加算
lngREC = lngREC + 1
xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)"
' レコードを出力
Write #intFF, X(1), X(2), X(3), X(4), X(5) ' ③
' 行を加算
GYO = GYO + 1
Loop
' 指定ファイルをCLOSE
Close #intFF
xlAPP.StatusBar = False
' 終了の表示
MsgBox "ファイル出力が完了しました。" & vbCr & _
"レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub
' CSVテキスト項目に出力できない文字を除去する
Private Function FP_CutInjusticeChar(vntInText As Variant) As Variant
Dim strInText2 As String
Dim POS As Long
Dim strChar As String
Dim strOutText As String
FP_CutInjusticeChar = Empty
' 一旦、文字列に変換する
strInText2 = Trim$(CStr(vntInText))
' ブランクの場合は処理なし
If strInText2 = "" Then Exit Function
' 文字列の桁数分繰り返す
strOutText = ""
For POS = 1 To Len(strInText2)
' 1文字を取り出す
strChar = Mid(strInText2, POS, 1)
' ダブルクォーテーションとCRコードをOMIT
If ((strChar <> vbCr) And (strChar <> """")) Then
strOutText = strOutText & strChar
End If
Next POS
' 元の値が数値の場合はDouble型とする
If IsNumeric(vntInText) = True Then
FP_CutInjusticeChar = CDbl(strOutText)
Else
FP_CutInjusticeChar = strOutText
End If
End Function
参考URL
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_050.html
http://www.nurs.or.jp/~ppoy/access/excel/xlM033.html