may the VBA be with you

Excel VBAとか業務自動化とか

テキスト出力マクロ ができるまで その2

はじめに

前回、

vba-belle-equipe.hatenablog.com

  • テキストファイルを作る
  • 設定した数だけパス(出力フォルダ&ファイル名)の文字列を出す

ことができるようになりました。

シートの準備

前回と同じく、シートは下の2つ。

操作盤

f:id:vba-belle-equipe:20160322092919p:plain

出力先フォルダ、ファイル名等を設定しています。

フォーマット

f:id:vba-belle-equipe:20160322093223p:plain

文章のひな形を設定しています。

フォーマットの文章を出力する

1行出力

テキストファイルを開いて、1行書いて、閉じるまでの流れは

Sub test()
  Dim filePath As String
  Dim ff As Long
  filePath = "c:¥test¥test.txt"
  ff = FreeFile
  Open filePath For Output As #ff
  Print #ff, "テストです"
  Close #ff
End Sub

こんな感じでした。

複数行出力

Open、Closeは1回でいいので、

  Print #ff, "ほにゃらら"

この部分を繰り返します。

デバッグプリント

まずは基本に忠実に、「フォーマット」にあるひな形を全てイミディエイトウインドウに出力してみましょう。

Sub test2()
  Dim i As Long
  Dim maxRow As Long
  Sheets("フォーマット").Activate
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  For i = 1 To maxRow
    Debug.Print Cells(i, 1)
  Next
End Sub

最大行をとって、Debug.Printです。

[[名前]]は1個[[値段]]円の[[品物]]を[[個数]]個買いました。
全部でいくらでしょう。

正解:[[合計]]円

出ました。

ファイルに出力

Debug.Printしていた部分を、テキストファイルに出力します。

Sub test3()
  Dim filePath As String
  Dim ff As Long
  Dim maxRow As Long
  Dim i As Long
  filePath = "c:¥test¥test.txt"
  ff = FreeFile
  Open filePath For Output As #ff
  Sheets("フォーマット").Activate
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  For i = 1 To maxRow
    Print #ff, Cells(i, 1)
  Next
  Close #ff
End Sub

こんな感じでしょうか。

cドライブの「test」フォルダの中の「test.txt」に、ひな形がそのまま出力されるようになりました。

フォーマットの一部を置換する

とりあえずフォーマットのまま出力できるようになりました

[[名前]]は1個[[値段]]円の[[品物]]を[[個数]]個買いました。
全部でいくらでしょう。

正解:[[合計]]円

が、このままだと悲しいので、名前等を設定に応じて変えられるようにしたいところです。

テキストの置換

vba 文字列 置換」あたりで検索すると、Replaceを使えばいいことがわかります。

  Replace("置換対象の文字列全体", "置換したい文字列", "置換後の文字列")

こんな感じです。


ひな形の中で、項目に [[  ]] がついているのが、置換したい部分です。

とりあえず、 [[名前]] の部分を置換してみましょう。

Sub test4()
  Dim str As String
  str = "[[名前]]は1個[[値段]]円の[[品物]]を[[個数]]個買いました。"
  Debug.Print "置換前の文字列 >> " & str
  str = Replace(str, "[[名前]]", "アナキン・スカイウォーカー")
  Debug.Print "置換後の文字列 >> " & str
End Sub
置換前の文字列 >> [[名前]]は1個[[値段]]円の[[品物]]を[[個数]]個買いました。
置換後の文字列 >> アナキン・スカイウォーカーは1個[[値段]]円の[[品物]]を[[個数]]個買いました。

はい。できました。

まとめ

[[  ]] の部分は何でもよかったんです。

これにしたばっかりに、はてな記法で若干めんどくさいことになりました。



まあそれはそれとして、残った課題は

  • 全ての項目を置換する
  • テキストごとの設定にあわせて置換する
  • 設定された数だけ、置換したテキストを作成する

こんなところでしょうか。



もうちょっとだけ続きます。