
VBAでエクセルからテキストへ書き込む備忘録。
そもそもですが、エクセルからテキストへは読み込みなのか、書き込みなのか混乱しながらになっておりますが、エクセルがVBAの中心と考え、
今回はエクセル→テキストを書き込みとします。
CSVやtxtファイルからエクセルに書き込むのとは違い、エクセルからCSVやtxtに書き込むのは慣れていないせいか非常に面倒に感じます。
さらに、読み込みは何かのシステムを経由して書き込むことはあるとは思いますが、テキストファイルやCSVへ書き込むということは、中心をエクセルにしているようなシステム的な考えができて作成できる人が見ていると思いますので、下記のポイントを踏まえてこの記事を進めていきます。
Openの開き方で処理を変える
WriteじゃなくてPrintを使う
区切り文字は読み込みを意識
まずはサンプルコードと結果を示す
メモ帳に書き込むコード
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 |
'================================================================= ' 目的:テキストへ書き込む ' 注意:Appendが追記で、Outputが削除後書き込みとなる。 ' また、CSVやテキストには改行がエクセルとは違う。また、OSによっても違う ' Win:vbCRLF(キャリッジリターン&ラインフィード) ' Mac:vbCR(キャリッジリターン) ' Linux:vbLF(ラインフィード) ' 改行を設定するなら、使うOSに沿ったものを使用した方が良い。 '----------------------------------------------------------------> '▼参照設定▼ 'なし '----------------------------------------------------------------> '▼動作▼ ' '----------------------------------------------------------------> '▼更新履歴▼ ' '================================================================= Public Sub テキストへ書き込みAppend(argTextRecAdd As String) Dim LastRow As Long Dim LastCol As Integer Dim LoopRun1 As Long, LoopRun2 As Integer Dim WS As Worksheet Dim MasterMsg As String ’書き込みを実施するワークシートを指定する。 Set WS = ThisWorkbook.Worksheets("Data") LastRow = WS.Cells(Rows.Count, 1).End(xlUp).Row LastCol = WS.Cells(1, Columns.Count).End(xlToLeft).Column Open argTextRecAdd For Append As #1 For LoopRun1 = 1 To LastRow 'カンマで変な分類をされていないかのチェック If LastCol = WS.Cells(LoopRun1, Columns.Count).End(xlToLeft).Column Then For LoopRun2 = 1 To LastCol MasterMsg = MasterMsg & WS.Cells(LoopRun1, LoopRun2).Value & "," Next LoopRun2 If Right(MasterMsg, 1) = "," Then MasterMsg = Left(MasterMsg, Len(MasterMsg) - 1) End If '文章中に改行が入っているのを解除する。基本は、起動させておかない。 ' If InStr(MasterMsg, vbCr) > 0 Then ' MasterMsg = Replace(MasterMsg, vbCr, "") ' ElseIf InStr(MasterMsg, vbLf) > 0 Then ' MasterMsg = Replace(MasterMsg, vbLf, "") ' ElseIf InStr(MasterMsg, vbCrLf) > 0 Then ' MasterMsg = Replace(MasterMsg, vbCrLf, "") ' End If Print #1, MasterMsg 'リセット MasterMsg = "" End If Next LoopRun1 Close #1 End Sub |
メモ帳に書き込むコードの呼び出しコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Public Sub エクセルシートからテキストファイルへ書き出す() Dim tmpFileName As String Dim ChousaPath As String ChousaPath = ThisWorkbook.Path & "\保存場所" '処理内容 tmpFileName = "000.txt" Call テキストへ書き込みAppend(ChousaPath & "\" & tmpFileName) Debug.Print "完了" End Sub |
サンプルの実行結果
こんな結果を求めているのであれば上記のコードで解消できます。
私が、なぜこのコードを選んだのかなどの云々の話長くなる系は、ここから始まります。
メモ帳の細かい話
今回のポイントを紹介
Openの開き方で処理を変える
WriteじゃなくてPrintを使う
区切り文字は読み込みを意識
Open フルパス For 開き方 As #ファイル番号
Print #ファイル番号 プリント対象データ
今回は、OpenコードとPrintコードを使用します。
Openの開き方で処理を変える
書込み用の開き方には、二通りの手法がある。
Append:追記
Output:新規書き込み
この理解で良い。Appendを使ったら、フルパスのファイルに追記します。Outputを使ったら、フルパスのファイルに新規で書き込みます。という指示となっている。
フルパスは拡張子をまで入力!
フルパスは、拡張子まで入力をしないといけない。”.txt”もしくは”.csv”の入力までを済ませなくてはいけない。
結構忘れてしまったり書いているとこんがらがるので、注意しておいてください。
念のためのファイル番号について
ファイル番号は、複数同時に起動させないのであれば、基本は”#1”で良い。♯1ではない。”#1”だ。シャープではなくて 番号記号(ナンバーサイン) というのが正式な呼び名。
Shift + 3で番号記号(ナンバーサイン)は出せる。
WriteじゃなくてPrintを使う
Writeは使い勝手があまりよくありません。データを格納するときに、変数の中に全文を作って入れれないのが一番僕のコードの使い方に合いません。
また、細かい使いまわしにおいては後述します。
区切り文字は読み込みと書き込みを意識する
区切りは、読み込みの正確性に影響します。例えば、カンマでSplitした場合は注意が必要で「¥3,000」とかにも反応して列数よりも多くの区切りを入れる可能性があります。
だから、カンマだけではなくていろいろな考えの中で、区切りを作ることで正確な処理につながります。