重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (9件)

No.1のham_kamoです。


いろいろご指摘やフォローが入ってますが、まずは他の回答者様に感謝です。
Openステートメントに#が入ってないのは単純ミスですが、これで動いてしまっていたので全く気づきませんでした。と言うか、なくても動くということをはじめて知りました。(今までもやってしまってるかもしれない…)

テキスト保存するのにブックを開いて、という方法についても、この場合あまり適切ではないと思ったのですが、それも書き出すとNo.2での回答がさらに長くなるので、その後の追加の回答でフォローしようと思っていました。

それで、質問者様に改めて確認したいのですが、「出力できませんでした」というのは具体的にどうなったのでしょうか。
(1)エラーが出て途中でマクロがエラーで止まった
(2)実行したがフォルダにファイルが1つもできなかった
(3)ファイルはできたが開くと内容が違っていた
など、補足をお願いいたします。
    • good
    • 0

#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 ステートメントが出てきます。

まあ、私としては、こんなところです。
    • good
    • 0

またまた、失礼しました。


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

# は関係なかったですね...失礼しました。

(_ _(--;(_ _(--;
やはり、Wendy02 ご指摘の不適切なファイル名が原因かと....
    • good
    • 0

こんにちは。



> 出力できませんでした

#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
    • good
    • 0

(1)ファイル名


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

この回答への補足

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

補足日時:2007/02/04 21:16
    • good
    • 0

こんばんは。



割り込み失礼します。

今の段階では、#1 さんのコードで、出力ファイル名に、".txt" をつけるぐらいで、良いとは思いますが、ひとつの問題は、A列のセルデータが、ファイル名として扱えるかどうか、ということがあります。

それから、出力のテキスト・イメージをどのように考えているのか、分かりません。補足でつけたような、タグを入れるのとか。

単に、
「出力できませんでした」
では、分からないのですね。回答者は、万能ではありませんから、どういうエラーが表示したのかとか、まっく動かせなかったのか、とか、それはさまざまな反応の中で、次につなげるのです。そのままの回答ですと、回答者さんたちが振り回されてしまいます。

出来れば、サンプルデータを出していただいて、それを、このように出力したいのだ、というようにしてくれると分かりやすいかと思います。

それと、補足でつけたマクロのコードは、一応、一般の回答者のレベルとしては論外だと思います。

この回答への補足

>補足でつけたマクロのコードは、一応、一般の回答者のレベルとしては論外だと思います。

論外とはどのような意味でしょうか?

サンプルデータは、質問や補足にあるとおりです
A列のデーターはファイル名として使えるものにしてあります

補足日時:2007/02/04 21:14
    • good
    • 0

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
とする方がよいです。
    • good
    • 0

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

この回答への補足

わかりずらくてすいません
____________
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

このようなイメージで作ってましたが、最初のファイルしかテキスト出力できなくてその後はエラーで止まってしまい困ってます^^;

補足日時:2007/02/04 17:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!