ray88’s diary

お仕事で困ったとき用の自分用の覚書

Uipath ログ編集⑤

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