SEの転職活動で使うべきサイト・エージェント 目指せ年収アップ
SEの転職活動で使うべきサイト・エージェント 目指せ年収アップ
東南アジアをバックパッカーしながら転職活動をした記録
東南アジアをバックパッカーしながら転職活動をした記録
7年目で初の転職活動 2カ月で内定獲得した記録
7年目で初の転職活動 2カ月で内定獲得した記録
おすすめのプログラミングスクール めざせ就職・年収アップ!
おすすめのプログラミングスクール めざせ就職・年収アップ!
メンズクリア2年通い放題入会! その後のヒゲ状況(不定期更新)
メンズクリア2年通い放題入会! その後のヒゲ状況(不定期更新)
ブログ開始3年が経った月収が1万超えてた!
ブログ開始3年が経った月収が1万超えてた!
プログラミング独学・スクール・就職(目次)
プログラミング独学・スクール・就職(目次)
previous arrowprevious arrow
next arrownext arrow
 
Shadow
VBA

Excel VBAの配列からtsv・csvを出力する

仕事でtsvやcsvをエクセルから出したいことがありました。

備忘録として残しておきます。

インターフェースファイルを作るときなどにも役立つのでぜひ知っておいてください。

実際に作ったファイルはこちらから無料でダウンロードできます。

エクセルの仕様

区切り文字とダブルクォーテーション囲みの有無を設定できます。

出力ボタンをクリックすると、隣の「出力元シート」の内容を出力します。

出力場所はエクセルの配置されている場所です。

マクロが無効にされる場合

ダウンロードすると、以下のような警告が表示されることがあります。

ファイルを右クリックして、プロパティから「許可する」にチェックを入れて下さい。

エクセルからファイル出力するコード

コードはこんな感じです。

流れとしては以下です。

①出力対象範囲をを決める(可変対応しており、列、行が増えてもOK)

②出力範囲を配列に取得する

③配列から区切り文字で変数へ格納

④ファイルへ書き込む

ファイル名は[Output_] + [yyyyMMdd_] + [mmss]

 

'=============================================
'目的       :ファイルを出力
'履歴        :#2020/02/14
'=============================================
Sub writeTsv()
     
    Dim startRow As Long                              '読込みする開始行
    Dim endRow As Long                                '読込みする終了行
    Dim startCol As Long                              '読込みする開始列
    Dim endCol As Long                                '読込みする終了行
    Dim menuWs As Worksheet                           'メニューシート
    Dim ws As Worksheet                               'シート
    Dim outputArray As Variant                        '出力するデータの配列
    Dim filePath As String                            '出力するパス
    Dim i As Integer                                   'ループ用変数
    Dim j As Long                                      'ループ用変数
    Dim outputText As String                           '出力テキストを格納
    Dim Delimiter As String                            '区切り文字
    Dim Extension As String                            'ファイルの拡張子
    Dim enclosingLetter  As String                      '囲みの文字
    
    
    '-----------メニューシートを設定値をセット-----------
    Set menuWs = ThisWorkbook.Worksheets("メニュー")
    menuWs.Activate
    '区切り文字ををセット
    If menuWs.Range("E5") = "カンマ" Then
        Delimiter = ","
        Extension = ".csv"
    ElseIf menuWs.Range("E5") = "タブ" Then
        Delimiter = vbTab
        Extension = ".tsv"
    Else
        MsgBox "区切文字を選択してください"
        Exit Sub
    End If
    
    '囲み文字をセット
    If menuWs.Range("E6") = "あり" Then
        enclosingLetter = Chr(34)
    Else
        enclosingLetter = ""
    End If
    
    
    '-----------出力元シートからファイル出力-----------
    '処理対象のシートをセット
    Set ws = ThisWorkbook.Worksheets("出力元シート")
    ws.Activate
    
    '出力対象範囲を取得する
    startCol = 1                                        '開始列
    startRow = 2                                        '開始行
    endCol = Range("A1").End(xlToRight).Column          '最終列
    endRow = Range("A3").End(xlDown).Row - 1            '最終行
    
    
    '処理対象の範囲を配列に取得
    Set outputArray = ActiveSheet.Range(Cells(startRow, startCol), Cells(endRow, endCol))
    
    
    
    '-----------ファイルに書き込む文字列を作成-----------
    '列×行数分ループ
    For i = 1 To endRow
        For j = 1 To endCol
        
            '最終列かつ最終行に来たら改行
            If i = endRow And j = endCol Then
                outputText = outputText & enclosingLetter & outputArray(i, j) & enclosingLetter
                GoTo NextLoop
            End If
            
            '最終列に来たら改行
            If j = endCol Then
                outputText = outputText & enclosingLetter & outputArray(i, j) & enclosingLetter & vbCrLf
                GoTo NextLoop
            End If
            
            '区切り文字で1セルずつ変数へ格納
            outputText = outputText & enclosingLetter & outputArray(i, j) & enclosingLetter & Delimiter
            
NextLoop:
            
        Next j
    Next i
        
    
    'ファイルを書き込み
    '出力先とファイル名をセット
    filePath = ActiveWorkbook.Path & "\Output_" & Format(Now, "yyyymmdd_HHMMSS") & Extension
    
    Open filePath For Output As #1
    Print #1, outputText
    Close #1
    
    
    '処理対象のシートをセット
    menuWs.Activate
    
    MsgBox "出力完了"
    
End Sub

実行結果

「出力元シート」に記載されている内容が出力されます。

エクセルの配置されている場所にファイルが出力されます。

※以下はtsv出力の結果のファイルです。

解説

42行目~62行目でメニューシートの設定内容を変数に格納しています。

66行目~92行目で出力元シートの内容を配列に格納しています。

91、92行目で一番最後の列、行を取得しているため、列、行が増えても自動で出力範囲が変わります。

63行目~86行目でセルごとの値を区切り文字を付けて文字連結しています。

enclosingLetterは、ダブルクォーテーション囲み有無の設定の際に、

「あり」の場合、[“]をセット

「なし」の場合、空白をセットすることで囲み文字が制御されています。

ABOUT ME
LooseCarrot
LooseCarrot
ブログ運営をしているLooseCarrotです。 興味のあることにトライして発信していきます! プロフィール

関連している記事