配列を渡してCSV出力するクラスモジュールです。
'=================================================================
' CSVファイル作成クラス
' CreateCSVクラスモジュール
'=================================================================
Option Explicit
'出力先フォルダ
Private path As String
'出力ファイル名
Private fname As String
'ファイルシステムオブジェクト(参照設定:Microsoft Scripting Runtime)
Private fso As FileSystemObject
'テキストストリーム
Private ts As TextStream
'固定値 ダブルクォート
Const WQ As String = """"
'固定値 カンマ
Const COMMA As String = ","
'固定値 除外文字列
Const IGNORE As String = "<NULL>"
'==================================================
' ◆ 書き込み準備
'
' 引数
' (1)name 出力ファイル名
' (2)dat 出力対象日付
'==================================================
Public Sub ready(ByVal name As String, ByVal dat As Date)
'例外捕捉開始
On Error GoTo ERROR_ROUTINE
'ファイル名
If name = "" Then
name = "OUTPUTFILE_"
End If
'デスクトップのパス取得
Dim WSH As Object
Set WSH = CreateObject("WScript.Shell")
path = WSH.SpecialFolders("Desktop") & "\"
'ファイル名決定
fname = name & "_" & Format(dat, "yyyymmdd") & "_" & Format(Now, "yyyymmddhhnnss") & "000.csv"
'ファイルオープン
Set fso = New FileSystemObject
Set ts = fso.OpenTextFile(path & fname, ForWriting, True)
'サブルーチン終了
Exit Sub
'例外処理
ERROR_ROUTINE:
Call MsgBox(Err.Number & ":" & Err.Description, vbCritical + vbOKOnly, "エラー")
End
End Sub
'==================================================
' ◆ 書き込み実施
'
' 引数
' (1)args 1行分の文字列配列
'==================================================
Public Sub writeDate(ByRef args As Variant)
'ファイルが準備されてない
If ts Is Nothing Then
Call MsgBox("ファイルが準備されていません。", vbOKOnly + vbExclamation, "警告")
End
End If
'例外捕捉開始
On Error GoTo ERROR_ROUTINE
Dim line As String
Dim index As Integer
'配列の要素を1個ずつ取得
Dim curCell As String
For index = LBound(args) To UBound(args)
curCell = args(index)
'除外文字列置換
curCell = Replace(curCell, IGNORE, "")
'ダブルクォート置換
curCell = Replace(curCell, WQ, WQ & WQ)
'セルの結合
line = line & IIf(Len(line) = 0, "", COMMA) & WQ & curCell & WQ
Next
'改行付加
line = line & vbNewLine
'書き込みの実施
ts.Write line
'サブルーチン終了
Exit Sub
'例外処理
ERROR_ROUTINE:
Call MsgBox(Err.Number & ":" & Err.Description, vbCritical + vbOKOnly, "エラー")
End
End Sub
'==================================================
' ◆ 書き込み終了
'==================================================
Public Sub finish()
'ファイルクローズ
On Error Resume Next
ts.Close
Set ts = Nothing
On Error GoTo 0
End Sub
' プロパティプロシージャ
Property Get getFName() As String
getFName = fname
End Property
呼び出し側(シートモジュールで使用)。
Option Explicit
Private Sub btnSAMPLE_Click()
'確認メッセージ
Dim res As Integer
res = MsgBox("CSV出力を開始します。" & vbNewLine & "よろしいですか?", vbQuestion + vbYesNo + vbDefaultButton2, "確認")
If res = vbNo Then Exit Sub
'CSV書き込み準備
Dim curFile As New CreateCSV
Call curFile.ready("OUTPUT", #12/1/2018#)
Dim element() As Integer
Dim x As Integer
Dim y As Integer
For y = 1 To 10
Erase element
'データの作成
For x = 1 To 10
ReDim Preserve element(x - 1)
element(x - 1) = x * y
Next
'書き込み実施
curFile.writeDate (element)
Next
'終了メッセージ
Call MsgBox("終了しました。" & vbNewLine & curFile.getFName, vbOKOnly + vbInformation, "情報")
'CSV書き込み終了処理
curFile.finish
Set curFile = Nothing
End Sub