- ベストアンサー
ExcelのVBAでテキストファイルのAの文字列がある行とCの文字列がある行の間にBを追記したい
以下のプログラムを実行してs.txtを作成します。 Sub test() Open "C:\s.txt" For Output As #1 Print #1, "A" Print #1, "C" Close #1 End Sub これで1行目がA、2行目がCのテキストファイルが作成されます。 この作成したテキストファイルのAがある行とCがある行の間にBを追記し、 1行目 A 2行目 B 3行目 C このようにするにはどうすればよいのでしょうか? 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003 ご存知の方がおられましたらご回答をよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問者の意図をそのまま実行するなら、 配列に読み込んで、ずらしてから書き込む。 昔、シーケンシャルファイルをよく扱ったことがあったが。 Sub test2() Dim s(20) as string,r as integer 'サイズは適当に合わせる Open "C:\s.txt" For Input As #1 r = 0 Do While Not EOF(1) r = r + 1 Line Input #1, s(r) If s(r - 1) = "A" And s(r) = "C" Then s(r + 1) = s(r) s(r) = "B" r = r + 1 End If Loop re = r Close #1 Open "C:\s.txt" For Output As #1 For r = 1 To re Debug.Print r, s(r) Print #1, s(r) Next Close #1 End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
Sub test() Open "C:\s.txt" For Output As #1 Print #1, "A" Print #1, "C" Close #1 End Sub を書き込んだ(作成した)のはだれ?質問者ではないの。 本当はこんな単純な2行のファイルではないのでしょう。質問に降格と誤解を招く。知る人は知る、こんなコードを書いてもらわなくても 文章でわかる。 もし質問者なら、 Print #1, "A" Print #1, "B" Print #1, "C" として、作り直したらと言いたくなる。行数が多くて総和行かないのでしょう。だからこんな例は役立たない・。 少ないならエクセルに読み込ませ、Bの行を挿入し、データを入れて 保存するのが素人には早い。 テキストエディタ(メモ帳など)を使って挿入もでもできる。 ーー ヒントをもらっても出来ないレベルなら困るが 下記をEOFまで繰り返し テキストファイルを読む(LiNInput#を使うが良さそう) スペースとかでSplit、単項目ならそのままの値 X(0)(最初の区切りまで)か、または単項目の場合値がAなら、Aを書いて、次にBをファイルに書く Aでなければ、そのまま書く。 この繰り返し ーー Googleで「テキストファイル 読む VBA」「テキストファイル 書く VBA」(またはVB)で照会すれば、コード例があるサイトが沢山出る。
お礼
ご回答いただきどうもありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 テキストファイルのインポートで、一旦、テキストバッファの変数に入れて、そこで調べて、出力するという方法もあるのですが、難しいことをせずに、Excelに出力して、表の中で処理したほうが早いのでは? Dim i As Long For i = Range("A65536").End(xlUp).Row - 1 To 2 Step -1 If Cells(i - 1, 1).Value = "A" And Cells(i, 1).Value = "C" Then Cells(i, 1).Insert Cells(i, 1).Value = "B" End If Next なお、比較方法が、複雑な場合は、 Like 演算子のほうがよいかもしれません。 例: Cells(i - 1, 1).Value Like "A"
お礼
Open "C:\s.txt" For Input As #1 Do Until EOF(1) Line Input #1, strData i = i + 1 Cells(i, 1).Value = strData Loop Close #1 For i = 1 To Range("A65536").End(xlUp).Row If Cells(i, 1).Value Like "A" Then Cells(i + 1, 1).Insert Cells(i + 1, 1).Value = "B" End If Next Open "C:\s.txt" For Output As #1 For i = 1 To Range("A65536").End(xlUp).Row Print #1, Cells(i, 1).Value Next Close #1 という風に一部を変更してやってみました。 ご回答いただきどうもありがとうございました。
- n-jun
- ベストアンサー率33% (959/2873)
出来上がったテキストファイルを1行ずつ読み込み、 Aが含まれた行が読み込まれたらフラグを立て、別のテキストファイルに書き込む。 Cが含まれた行が読み込まれた時フラグが立っていれば、その行を書き込む前にBを含む行を書き込んでから、 Cを含む行を書き込む。 と言ったことをしていけばいいのでは?
お礼
ご回答いただきどうもありがとうございました。
補足
それをどのように記述すればよいのかがわかりません。
お礼
早速やってみたところ問題を解決することができました。 この方法だとシートに記述しなくて済むので処理が速くて良いですね。 ご回答していただきどうもありがとうございました。