ExcelVBA 目次 - ray88’s diary
■参考 モジュール
Function BackupEditUtfText(targetPath As String) As String '------------------------------------------------- '機能:UTF8 形式のCSVファイルの各項目にダブルクォーテーションを付けて加工し ' ANSI形式のCSVファイルで別名保存。 別名保存したファイルパスを返す。 '引数 UTF-8形式のCSVファイルバス '------------------------------------------------- Dim editPath As String '書込用 CSVのPath Dim folderPath As String '書込用 CSVファイルのフォルダバス Dim fileName As String '書込用CSVファイルのファイル名 Dim makeFileTime As String '書込用 CSVファイルの生成時間 Dim FSO As Object 'FileSystemObject インスタンス化用の変数 Dim editText As Object 'TextStreamオブジェクト格納用 Dim intIndex As Long '行番号取得用 Dim temp As String '読取用ファイルのテキスト一時格納用 Dim dataArray As Variant '読込データ各様用配列 Dim editData As Variant '配列より取り出したデータ格納用 Dim editLineData As Variant 'データ書き込み時に各データを結合して格納 Dim maxNum As Integer '配列最大値格納用 Dim i As Integer '配列カウント用変数 '読込用ファイルのファイル名取得 fileName = Dir(targetPath) '読込用ファイルのフォルダパス取得 folderPath = Replace(targetPath, fileName, "") 'ファイル生成時間を取得 makeFileTime = Format(Now(), "yyyyMMddhhmmss") '書込用CSVのファイルパスを格納 editPath = folderPath & makeFileTime & fileName Debug.Print editPath 'FileSystemObjectをインスタンス化 Set FSO = CreateObject("Scripting FilesystemObject") '書込用 CSVファイルを生成 FSO.CreateTextFile (editPath) '書込みモードで書込用 CSVファイルを開く Set editText = FSO.OpenTextFile(editPath, 2) 'インデックス番号を初期化。 このプログラムではインデックスを使用してないが '見出し行を飛ばして処理したり、最終行数を取得したりする際に使用する intIndex = 0 ADODB.Stream を遅延バインディング With CreateObject("ADODB.Stream") '文字コードを指定 .Charset = "UTF-8" .Open .LoadFromFile targetPath 'ファイルの最後まで繰り返し Do Until EOS '各フィールドの値を1行分参照して変数 「temp」 に格納 temp = ReadText(-2) '「temp」 に格納した1行分の値をカンマで区切って配列 「dataArray」 に格納 dataArray = Split(temp, ",") '「配列 「dataArray」 の最大値を取得 maxNum = UBound(dataArray) For i = 0 To TomaxNum '配列の中身が空なら 'ダブルクォーテーションで囲まずカンマのみつける If dataArray(i) = "" Then editData = dataArray(i) editLineData = editLineData & editData & "," '配列の中で数値や日付データなどダブルクォーテーションを '付けたくない列番号を指定 (必要ない場合はコメントアウトして使用) ElseIf i = 3 Then editData = dataArray(i) editLineData = editLineData & editData & "," '上記以外の条件、 または最終項目以外の時に 'ダブルクォーテーションで項目を囲んでカンマをつける ElseIf i <> maxNum Then editData = Chr(34) & dataArray(i) & Chr(34) editLineData = editLineData & editData & "," '配列の最大値 (一番最後のカラム)の場合は 'ダブルクォーテーションで囲んでカンマをつけない ElseIf i = maxNum Then editData = Chr(34) & dataArray(i) & Chr(34) editLineData = editLineData & editData End If Next i '書込用CSVに編集後データを1行分書込み editText.writeline editLineData 'デバック用 Debug.Print editLineData '編集後データ格納用変数を初期化 editLineData = "" intIndex = intIndex + 1 Loop '読込用ファイルをクローズ .Close End With '終了処理 editText.Close editText.Close Set editText = Nothing Set FSO = Nothing '戻り値 (編集後CSVのパス) EditUtfText = editPath End Function