• 締切済み

excel vbaでテキスト出力

A行=ファイル名 B~D行=テキスト内容 としてテキストファイルを出力したいのですが、やり方を教えていただけないでしょうか? A2から空白にあたるまでテキストを順々に出力したいのですが・・・ よろしくお願いします

みんなの回答

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.9

No.1のham_kamoです。 いろいろご指摘やフォローが入ってますが、まずは他の回答者様に感謝です。 Openステートメントに#が入ってないのは単純ミスですが、これで動いてしまっていたので全く気づきませんでした。と言うか、なくても動くということをはじめて知りました。(今までもやってしまってるかもしれない…) テキスト保存するのにブックを開いて、という方法についても、この場合あまり適切ではないと思ったのですが、それも書き出すとNo.2での回答がさらに長くなるので、その後の追加の回答でフォローしようと思っていました。 それで、質問者様に改めて確認したいのですが、「出力できませんでした」というのは具体的にどうなったのでしょうか。 (1)エラーが出て途中でマクロがエラーで止まった (2)実行したがフォルダにファイルが1つもできなかった (3)ファイルはできたが開くと内容が違っていた など、補足をお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

#6のKenKen_SP さんへ こんばんは。Wendy02です。お久しぶりです。せっかくなので、この質問で、こちらの考えていることを少し詳しく書かせていただきます。 なお、 >やはり、Wendy02 ご指摘の不適切なファイル名が原因かと.... (私の場合は、英語のほうで慣れていますのでかまわないです。こういう敬称の習慣は、日本語だけです。) #Fnum の部分は気がついていたのですが、結局のところ、ファイル名として、いくつか不適切な可能性はあるので、そのエラー処理はしたほうがよいのか、と思っているのです。 私としては、回答者さんたちが多くなれば、そのどれかにあたるから良いとしても、最初は、お一人だけだったので、それで、救援のつもりで書いたのです。だけど、私自身が、#1のコードのパターンから大きく外れることはありません。 ご質問者さんへ もし、どのようなエラーだったか、返事を書いてください。それによって、どんな状況かは、ある程度の想定、目安にはなります。 それと、#4のimogasi さんのご指摘が、ある意味、出発点のようで、こちらも、いろんなパターンが予想されて、ご質問者さんが、考えていることは明確にならないのです。 また、たとえば、ファイル名が、同名になったらどうするとか、拡張子のある・なしが混じっているとか、空白値が含まれている場合はどうするとか、VBAプログラマだったら、一通りの思いつくようなパターンを、ある程度、予測可能なエラーは押さえ込まなくてはならないのです。出力データ側も、Value プロパティでよいのか、Text プロパティ(時間や日付が含まれる場合)にする必要があるのか、とか、そういうレベルまで、読んでから、コードを作るのですね。 データの不可抗力な問題を、人間のエラー対処による防ぎ方と、プログラムによって防ぐ方法と二種類あるのです。人間がエラーを対処する場合にも、それが理解していれば良いけれど、そうでないと、やはり、「動かない」ということだけに終わってしまい、再び、質問ということになってしまいます。 また、出力データとしては、どんな方法がよいのか、私などでも、ある程度は想像の範囲なのですが、ユーザーのイメージになるべく合わせて書いていくのです。テキストファイルといっても、種類がありますからね。この前の方は、単独のSQLファイルでした。 >論外とはどのような意味でしょうか? そのコード自体は、一定のレベル以上の人には、参考にはならないということです。ループで、ブックを作っていくのは、ファイル数(行数)が予想出来ない状況では、そういう方法は良くないです。また、スピード自体が遅すぎます。少なくとも、私は、そのようなコードは、お勧めしません。場合によって、数を重ねると、メモリも消費していくのではないかと思います。 テキストデータ自体を出力する場合と、ブックをテキスト出力するのとは、まったく目的が違います。 >普通こういうケースが少ないというのは、本などを見ても乗っておらずこまっているところです Open ステートメントは、ある程度のレベルの人なら、ごく一般的な方法です。ご自身で勉強されたいのでしたら、「Open ステートメント」の使い方を調べてみてください。本にも載っています。(例:『かんたんプログラミング VBA 応用編』技術評論社-ブックを開かずにテキストファイルの入出力を行う) Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] また、それとセットに、Close ステートメントと、Write/Print ステートメントが出てきます。 まあ、私としては、こんなところです。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

またまた、失礼しました。 #6 で Wendy02 さんを呼び捨てにして誠にすみません(汗) 最近書き込みしてないので、緊張してました。 重ね重ねお騒がせして、本当にすみません。 

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

# は関係なかったですね...失礼しました。(_ _(--;(_ _(--; やはり、Wendy02 ご指摘の不適切なファイル名が原因かと....

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

こんにちは。 > 出力できませんでした #1 ham_kamo さんのコードで > Open .Cells(i, 1).Value For Output As fnum    ↓ Open .Cells(i, 1).Value For Output As #fnum にしたら動かないかな? # が抜けてるみたいです。 また、同じようなコードで恐縮ですが、エラートラップを含めた簡単な例 をご紹介しておきます。ご参考までに。 Sub SampleProc()   Dim lLastRow As Long  ' 最終行   Dim i     As Long  ' 行   Dim j     As Long  ' 列   Dim n     As Integer ' ファイル番号   Dim sFilename As String ' ファイル名   lLastRow = Cells(Rows.Count, "A").End(xlUp).Row   For i = 2 To lLastRow     ' ファイル名(A列)     sFilename = Cells(i, "A").Value     n = FreeFile()     On Error Resume Next     Open sFilename For Output As #n     If Err Then       ' ファイル作成(オープン)失敗時の処理       MsgBox CStr(i) & "行:" & sFilename & vbLf _           & "ファイル名として不適切", _           vbCritical, "処理スキップ"     Else       ' ファイル作成(オープン)成功時の処理       ' 出力データ(B~D列)       For j = 2 To 4         Print #n, Cells(i, j).Text       Next j     End If     Close #n     On Error GoTo 0   Next i End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

(1)ファイル名 >A2=テキストファイル名 B2:D2=テキスト内容 __________ A3=テキストファイル名 B3:D3=テキスト内容 のA2のA3は同じファイル名なのか もし同じなら、別ファイルにする必要あるのですか? 普通こういうケースは少ない。 (2)テキストファイルにも ・CSV(数種あるよう) ・PRN(項目の開始桁ぞろえする) ・その他(HTMLなど) がある。 どれなのか認識してないのでしょうが、一度勉強してください。 本来明記すべです。

nuinui2007
質問者

補足

出力したいのは、テキストファイルです(.txt)です 別ファイルにする必要があります 普通こういうケースが少ないというのは、本などを見ても乗っておらずこまっているところです

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 割り込み失礼します。 今の段階では、#1 さんのコードで、出力ファイル名に、".txt" をつけるぐらいで、良いとは思いますが、ひとつの問題は、A列のセルデータが、ファイル名として扱えるかどうか、ということがあります。 それから、出力のテキスト・イメージをどのように考えているのか、分かりません。補足でつけたような、タグを入れるのとか。 単に、 「出力できませんでした」 では、分からないのですね。回答者は、万能ではありませんから、どういうエラーが表示したのかとか、まっく動かせなかったのか、とか、それはさまざまな反応の中で、次につなげるのです。そのままの回答ですと、回答者さんたちが振り回されてしまいます。 出来れば、サンプルデータを出していただいて、それを、このように出力したいのだ、というようにしてくれると分かりやすいかと思います。 それと、補足でつけたマクロのコードは、一応、一般の回答者のレベルとしては論外だと思います。

nuinui2007
質問者

補足

>補足でつけたマクロのコードは、一応、一般の回答者のレベルとしては論外だと思います。 論外とはどのような意味でしょうか? サンプルデータは、質問や補足にあるとおりです A列のデーターはファイル名として使えるものにしてあります

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

No.1です。 質問内容と書かれたVBAがいろいろと食い違っているみたいなので、補足質問です。 Range("B1").Select で最初にB1を選択されているので、 ActiveCell.Offset(1, 0).Activate を実行すると、ActiveCellはB2に移動します。 Filename = ActiveCell.Value & ".txt" で、そのセルの内容をFilenameに代入していますが、質問文では A行=ファイル名 と書かれています。ファイル名はA2でなくB2より下に入っているのでしょうか。 それから、 B~D行=テキスト内容 とありますが、マクロでは ActiveCell.Offset(0, 1).Activate タイトル = ActiveCell.Value となっているので、この時点でActiveCellは右に1つ移動してC2になります。 なので「タイトル」にはC2の内容が入ります。 そして続いて 題名 = ActiveCell.Value がありますが、これはタイトルと同じセル(C2)の内容が入ります。 そして次の ActiveCell.Offset(0, 4).Activate 記事 = ActiveCell.Value ですが、ActiveCellがC2なので、その4つ右のG2がActiveCellとなり、そのセルの値が「記事」に代入されます。 その後 ActiveCell.Offset(0, 5).Activate が実行されて、ActiveCellは5つ右のL2となります。 まとめると、  ファイル名=B2  タイトル=C2  題名=C2  記事=G2 となっています。 その後の新しいブックを追加して、内容を転記してテキスト保存し、閉じるところはとりあえず飛ばして、 GoTo Top でTopに戻ったとき(このようなGoToの使い方は推奨されませんが)、上記に説明した通りにこの時点でActiveCellはL2となっており、その後の ActiveCell.Offset(1, 0).Activate では、L3が選択され、 Filename = ActiveCell.Value & ".txt" でL3セルがファイル名となってしまいます。 もしここで、次のファイル名をB3から取得したいのであれば、 Goto文の前で ActiveCell.Offset(0,-11) としてActiveCellをB列に戻してやる必要があります。 しかし、上記のマクロの内容では ____________ A2=テキストファイル名 B2:D2=テキスト内容 ____________ とはだいぶ異なるようなのですが、ファイルに出力したいセルは本当に上記のようにB~D列なのでしょうか? それからもう一つ大きなミスがあります。 FileName = ActiveCell.Value & ".txt" とファイル名に".txt"という拡張子をつけているので、たとえセルの内容が空でも、FileNameには".txt"という文字列が入り、 If FileName = "" Then このIf文は成立することはありません。 If FileName = ".txt" Then とするか、もしくは、順序を変えて If ActiveCell.Value = "" Then GoTo owari End If FileName = ActiveCell.Value & ".txt" とした方がよいでしょう。 しかし、実際にこういう処理をループで回すときは、GoTo文は使わず、 Do While ActiveCell.Value <> "" 処理 Loop とする方がよいです。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

B~D行=テキスト内容 というのは、B,C,Dのセル内容をそれぞれ一行ずつ、ということでしょうか? とりあえずそのようにマクロを書いてみました。実行する方法は以下の通りです。 ・Alt+F11でVBAの画面を開く ・「挿入」>「標準モジュール」を選択 ・右の画面に以下のマクロをコピーして貼り付ける ・その画面でF5キーを押すか、Alt+F11でExcelの画面に戻ってAlt+F8でマクロを実行 思った通りの動作でなかったら補足をお願いします。 Sub Macro1()  Dim i As Integer, j As Integer  Dim fnum As Integer  fnum = FreeFile  With ActiveSheet   For i = 1 To Range("A65536").End(xlUp).Row    Open .Cells(i, 1).Value For Output As fnum    For j = 2 To 4     Print #fnum, .Cells(i, j)    Next j    Close #fnum   Next  End With End Sub

nuinui2007
質問者

補足

わかりずらくてすいません ____________ A2=テキストファイル名 B2:D2=テキスト内容 ____________ ____________ A3=テキストファイル名 B3:D3=テキスト内容 ____________ このような感じでファイルが終了するまでテキストに出力したいのですが・・・ 出力できませんでした 内容は少し違いますが、 Sub Macro1() Range("B1").Select Top: ActiveCell.Offset(1, 0).Activate Filename = ActiveCell.Value & ".txt" If Filename = "" Then GoTo owari End If ActiveCell.Offset(0, 1).Activate タイトル = ActiveCell.Value 題名 = ActiveCell.Value ActiveCell.Offset(0, 4).Activate 記事 = ActiveCell.Value ActiveCell.Offset(0, 5).Activate Workbooks.Add Range("A1").Formula = "<T>" & タイトル & "</T>" Range("A2").Formula = "<D>" & 題名 & "</D>" Range("A3").Formula = "<K>" & 記事 & "</K>" ActiveWorkbook.SaveAs Filename:= _ Filename, FileFormat:=xlText, _ CreateBackup:=False ActiveWindow.Close GoTo Top owari: End Sub このようなイメージで作ってましたが、最初のファイルしかテキスト出力できなくてその後はエラーで止まってしまい困ってます^^;

関連するQ&A

  • エクセルVBA テキストに出力、名前を付けて保存

    エクセルVBA テキストに出力、名前を付けて保存    A  B   C   D 1  aa  bb  cc  =A1&B1&C1 2  dd  ee  ff  =A2&B2&C2 3  gg  hh  ii  =A3&B3&C3 上記エクセルのD列の内容(セルA1~C3が連続したもの)を1行毎にテキストに出力し、 B列の内容をファイル名にしてテキストファイルを多量に自動生成したいのです。 上記エクセルのように3行なら下記の3つのファイルが生成されるといったVBAがほしいのです。 ファイル名がbb.txtで、テキストの内容はaabbcc。 ファイル名がee.txtで、テキストの内容はddeeff。 ファイル名がhh.txtで、テキストの内容はgghhii。 実際は数千行あるので、数千ファイルを一気に生成させたいのです。 どうぞよろしくお願いいたします。

  • エクセルVBAでテキストを出力したい

    エクセルVBAでテキストを出力したいのですが、 やり方がわからないので教えてください。 仮にSheet2のA列に文章があるとして、 シート全体を1つのテキストファイルとして出力し、 ファイル名をSheet1のA1セルにしたいです。 同じような質問もあるのですが、ファイル名に関しては、 ちょっと見当たらなかったので質問しています。

  • エクセルのセルをテキストファイル出力する方法教えてくれませんか。

    初心者ですが、 どなたか、エクセルのセル1つを、 テキストファイル出力できる方法をご存知ですか? 詳細には、 エクセルファイルの列Aの内容がテキストファイル名で、 列Bの内容が本文であるテキストファイル出力を 約3000個、順次したいと考えています。 例えば、エクセルファイルに以下のようなデータを保持しているとします。 列A  列B 001  あいうえお 002  かきくけこ 003  さしすせそ この場合、001.txtは本文が「あいうえお」、 002.txtは本文が「かきくけこ」、 003.txtは本文が「さしすせそ」というように、 エクセル1行についてテキストファイルを1つ作成したいと考えています。 このような処理を短時間で実施するのに適した方法をご存知の方がいらっしゃいましたらご教示いただければと思います。 どうぞよろしくお願いいたします。

  • エクセルVBAにてテキスト出力がうまくいきません

    エクセルシートの1列に以下のような文字列を打ち込みました。 - a aa aaa aaaa aaaaa - b bb bbb bbbb bbbbb - c cc ccc cccc ccccc - 「-」の2行後をテキストを出力した際のファイル名とし、ファイル名を含んだ次の「-」までの文字列をそのテキストの中に出力したいです。なお、全体の行数は分かっています。 例えば上の文字列に対して実行すると、 a.txt b.txt c.txt というファイルができ、それぞれの中には a aa aaa aaaa aaaaa などがそれぞれ出力されるようにしたいです。 Sub tepa() Dim strFilename As String Dim FileNumber As Integer Dim strREC As String j = 1 For i = 1 To 70 If Cells(i, 1) = "-" Then strFilename = Cells(i + 2, 1) & ".txt" Do While Cells(i + j, 1) <> "-" If i > 70 Then Exit Sub End If FileNumber = FreeFile strREC = Cells(i + j, 1) Open strFilename For Append As FileNumber Print #FileNumber, strREC Close j = j + 1 Loop End If i = i + j Next End Sub さきほど初めてVBAなるものを知り、見よう見まねで書いてみましたが・・・ループに陥ったりテキストファイルが1つめしか出力されなかったりとうまくいきません。 改善点など教えていただけたら嬉しいです。 よろしくお願いします。

  • VBAでエクセルからのファイル名とテキスト化を自動で実行する方法

    マクロを実行して、エクセルのセルからファイル名とテキストファイルを自動で出力したいのですが、VBA初心者なのでプログラムの書き方がわかりません。 どうかVBAのプログラムの書き方を教えて下さい。 【マクロ実行前のエクセル状態】 1.エクセルのA列にファイル名1を入力 2.エクセルのB列にファイル名2を入力 3.エクセルのC列にテキスト出力させたい文字列を入力 【期待のマクロ動作】 ファイル名1+ファイル名2のファイル名でC列の文字列をテキストファイルで出力。 《例》 A B C 1 2 あ ⇒マクロ実行⇒ファイル名『12』テキスト内容『あ』 3 4 い ⇒マクロ実行⇒ファイル名『34』テキスト内容『い』 5 6 う ⇒マクロ実行⇒ファイル名『56』テキスト内容『う』 7 8 え ⇒マクロ実行⇒ファイル名『78』テキスト内容『え』 ・ ・ ・ ・ 上記の様に、一回のマクロ実行で入力されている列のセル全て がファイル名付きのテキストファイルとして出力をさせたいです。 申し訳ありませんが、よろしくお願いいたします。

  • Excel VBAで列ごとのデータをテキストファイルへ書くには?

    エクセルのシート(たとえばSheet1)が以下のようになっているとします。 A B C D E F 1 商品A 11111111 あいうえお 3 1000 2 商品B 22222222 かくくけこ 1 2500 3 商品C 33333333 さしすせそ 2 3500 ・ ・ これを決まった列ごとにテキストファイル(固定ファイル名)に書き出すということは、エクセルのVBAで可能でしょうか? テキストファイルの内容は以下のようにしたいのです。 E列を数量として、その分だけのテキスト行を書き出したいのですが… <<bbb.txt>> 商品A 商品A 商品A 商品B 商品C 商品C ・ ・ <<ccc.txt>> 11111111 11111111 11111111 22222222 33333333 33333333 ・ ・ <<fff.txt>> 1000 1000 1000 2500 3500 3500 ・ ・ また、このようなことが参考になるHPがあればお教え願いたいのですが。 以上よろしくお願いします。

  • ExcelのVBA

    Aというフォルダ内にあるEXCELファイルにてC列を参照(C列にはAフォルダ内にあるテキストファイルのファイル名が記載されている)し、 D列にC列に記載されているテキストファイルの内容(15文字程度)をVBAで出力したいと思っています。 Googleで色々と調べてみたのですが、同じような内容が発見できなかったので、質問致しました。 非常に困っていますので、どなたか教えていただけませんでしょうか? よろしくお願いします。

  • エクセル VBA テキストファイル書き出す応用?

    以下のページより、 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_040.html Option Explicit ' テキストファイル書き出すサンプル(2) Sub WRITE_TextFile2() Const cnsFILENAME = "\SAMPLE.txt" Dim intFF As Integer ' FreeFile値 Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 ' 最終行の取得 GYOMAX = Range("A65536").End(xlUp).Row ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(出力モード) Open ThisWorkbook.Path & cnsFILENAME For Output As #intFF ' 2行目から開始 GYO = 2 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' A列内容をレコードにセット(先頭は2行目) strREC = Cells(GYO, 1).Value ' レコードを出力 Print #intFF, strREC ' 行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE Close #intFF End Sub ------------------------------------------------------------- これを参考にしてテキストファイル書き出すのは出来たのですが、 今回は、ちょっと応用で以下のようにしたいです。 Sheet1のA2~A20までテキストファイル名が書いてあるとします。 また、Sheet2~Sheet20ぐらいまで、各Sheetに文章が入っているとします。 テキストファイルに書きだしたいのですが、 Sheet2の内容は、Sheet1のA2のファイル名 Sheet3の内容は、Sheet1のA3のファイル名 Sheet4の内容は、Sheet1のA4のファイル名 このようにしたいのですが、どのようにすればいいのか教えてください。 よろしくお願います。

  • エクセル VBA で 教えてください!

    初めて質問させていただきます 初心者で困っています どなたかご教授よろしくお願いします! A列 ____B列______C列 B_____________________ 123 D______________________ 1 D______________________ 2 B______________________456 D______________________ 1 D______________________ 2 D______________________ 3 B______________________789 D______________________ 1 自分はB列にいます(表現が正しいかもわかりませんが) 同じ行で A列の内容が Bだったら隣のCセルの 内容をBセル(自分のいるセル)にコピー Dだったら上の内容(Bの時コピーした内容)をコピーし          行を下へ繰り返し A列のデータが空白まで繰り返す そうして B列を 埋めたいのですが よろしくお願いしたします!       

  • VB.NET Excelデータを読み込んでテキストファイルへの出力の仕方を教えてください

    プログラミング初心者です。複数のExcelのデータを取得して、テキストファイルに出力したいのですが、どなたか教えてください。 ファイル名:Emp_Name.xls(社員名一覧:セルA1からA20に氏名が入力されています Private_info_1(から20まで20個のファイルあり).xls(個人情報:セルA3に氏名,セルB1からB5に部署名、社員IDなどが入力されています.。セルが空白の場合もあり) ファイルEmp_Name.xlsに入力されている氏名と一致する場合、Private_info_1.xlsからPrivate_info_20.xlsまでのファイルから、セルA3、B1からB5の値を取得し、一行づつテキストファイルに出力したいのですがなにか良い方法がありますでしょうか?よろしくお願いします。 <出力> 氏名 部署 社員ID 勤務地 年齢 備考 ←の内容が必要 さくら 営業 A0001 東京 20 あり ←テキストへ出力 さくら 営業 A0001 東京 30 さくら 営業 A0001 神奈川 20 なし

専門家に質問してみよう