仕事でtsvやcsvをエクセルから出したいことがありました。
備忘録として残しておきます。
インターフェースファイルを作るときなどにも役立つのでぜひ知っておいてください。
実際に作ったファイルはこちらから無料でダウンロードできます。
エクセルの仕様
区切り文字とダブルクォーテーション囲みの有無を設定できます。
出力ボタンをクリックすると、隣の「出力元シート」の内容を出力します。
出力場所はエクセルの配置されている場所です。
マクロが無効にされる場合
ダウンロードすると、以下のような警告が表示されることがあります。
ファイルを右クリックして、プロパティから「許可する」にチェックを入れて下さい。
エクセルからファイル出力するコード
コードはこんな感じです。
流れとしては以下です。
①出力対象範囲をを決める(可変対応しており、列、行が増えてもOK)
②出力範囲を配列に取得する
③配列から区切り文字で変数へ格納
④ファイルへ書き込む
ファイル名は[Output_] + [yyyyMMdd_] + [mmss]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
'============================================= '目的 :ファイルを出力 '履歴 :#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は、ダブルクォーテーション囲み有無の設定の際に、
「あり」の場合、[“]をセット
「なし」の場合、空白をセットすることで囲み文字が制御されています。