まりふのひと

テキストファイルをCSVに変換するExcelマクロを作成

 昨日の同好会で、「宛名を印刷したい人は、Wordで「氏名」「郵便番号」「住所」を順に入力してくれば、後はなんとかする」と言ってシマッタ!!
なんとかするにはどうすればいいか‥‥ 昨夜布団の中で考えていたら、今朝4時に目が覚め‥‥眠れない。ノコノコ起き出して、テキストファイルをCSVに変換するVBA(マクロ)をExcelで作成した。

§Excel VBA

Option Explicit

Public Sub Auto_Open()
Dim ds1 As Long, ds2 As Long, i As Long
Dim inpData As String, outData As String
Dim inpFile As String, outFile As String

    inpFile = ThisWorkbook.Path & "\TextFile.txt"
    outFile = ThisWorkbook.Path & "\CSVFile.csv"
    ds1 = FreeFile
    Open inpFile For Input As #ds1
    ds2 = FreeFile
    Open outFile For Output As #ds2
    Do While Not EOF(ds1)
        outData = ""
        For i = 1 To 3
            If EOF(ds1) Then Exit For
            Line Input #ds1, inpData
            outData = outData & ",""" & Trim(inpData) & """"
        Next
        If Left(outData, 1) = "," Then outData = Mid(outData, 2)
        Print #ds2, outData
    Loop
    Close ds1, ds2
    Application.Quit
End Sub
  • ファイル名: Text2CSV.xls
  • マクロ名: Auto_Open
    • 従って、開いたら直ぐ実行してしまう。
    • 終了したら、Excelを閉じるようにした。
    • 開いたとき Auto_Open() を実行させない場合(例えば、マクロを修正する場合)は、[Shift]を押したまま開く。
    • フィールドデータの前後の空白は取る。
    • 数値項目であっても「"」で囲む。(今回は全て文字項目であるはず)
  • 条件
    1. Text2CSV.xls は、テキストファイルと同じフォルダに置く。
    2. 入力ファイルは“TextFile.txt” に固定。
    3. 出力ファイルは“CSVFile.csv” に固定で、入力と同じフォルダに出力する。

§手順

 これは、当日のための自分の備忘録(記憶より記録)だ。

  1. “住所録”フォルダを作り、次のファイルを置く(基本)
    • ユーザーが作成したWord文書
    • Text2CSV.xls (Excelマクロ)
    • 宛名印刷.doc (Wordの宛名書きウィザードで作成した文書)
  2. Word文書を開く
  3. 先頭に項目名を入れる。
    • 例えば、“氏名”[Enter],“郵便番号”[Enter]、“住所” だ。
    • 文末に余計な段落記号があれば削除しておく。
  4. ファイル名:“TextFile”,ファイルの種類:“書式なし (*.txt)”で出力する。
  5. Text2CSV.xlsを開く。
    • 直ぐ終わる‥‥はずだ。
  6. CSVFile.csvを開く。
  7. 補完する。
    • 列に “欠礼”,“連名”,“住所2”,“桁1”を追加する。
    • 「住所」にマンション名があれば、「住所2」に移す。
    • 列幅の最適化。
  8. ファイル名:“住所録”,ファイルの種類:“Microsoft Office Excel ブック (*.xls)”で出力する。
  9. 宛名印刷.doc を開く。
  10. 関連付けを修正する。

参考にしたサイト

§テキストファイルを操作する (Office TANAKA)
  1. カンマで区切られたデーををセルに代入する
    1. Dim buf As Variant, tmp As String
    2. Line Input #n, tmp
    3. buf = Split(tmp, ",")
    4. Worksheets("Sheet1").Range("A1:D1") = buf
  2. Binary モードを使うと一瞬で終る
    1. Dim buf As String
    2. TargetFile = "C:\config.sys"
    3. buf = Space(FileLen(TargetFile))
      • ファイルと同じサイズの場所を確保する。(必須)
    4. Open TargetFile For Binary As #n
    5. Get #n, , buf
      • 一気に読み込む。
    6. Worksheets("Sheet1").Range("A1") = buf
※ 上記 2.のまね事を行ってみた。
    1. メモ帳てカンマ区切りのデータを作る。
    2. 全てコピーする。
    3. Excel を起動する。
    4. セル A1 に貼り付ける。
    5. [貼り付けオプション]スマートタグ ⇒[テキストファイルウィザードを起動する]をクリックする。
    6. カンマ区切りを指定する。
  • Wordのデータでは出来ない
    • [貼り付けオプション]で[テキストファイルウィザードを起動する]が出ない。これは、書式もコピーされるためであろう。
  • メモ帳であれば、カンマは全角でもOK