[[20190310211034]] 『VBAでのテキスト書込みについて』(りりちゃん☆彡) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでのテキスト書込みについて』(りりちゃん☆彡)

こんばんわ。
りりちゃん☆彡です。
いつもお世話になっております。

テキスト書込みVBAを本で習っています。
下記に書いたコードはその本で教えてもらったものです。

今は、C14セルの値を、テキストに書込みするという風に
教材は、なっていますが、勉強していく中で、
これをC15,C16とか、C14からF14までを書いて欲しい
と言う時にどうすればいいのかなって思って、C14:F14とか、C14,C15とかかな?と思ってやってみたのですが、上手くいかなかったので、
(1)のようにすればいいのかなと思って、書きこんでみたら出来ました。

こういう時に、IFとかを使うのかな?って思ったのですが、どう使うのかな?
って言う所で止まってしまいました。

(1)
MYTXT.Write Text:=Range("C14").Value
MYTXT.Write Text:=Range("C15").Value

もしも、そうゆうふうにするとしたら
どういうふうにすればいいか、お分かりになる方がいらしたら
教えていただけませんでしょうか。。

どうぞよろしくお願い致します。

☆★★☆

Sub textkakikomi()

Dim MyFSO As New FileSystemObject
Dim MYTXT As TextStream
Dim Filename As String

Filename = ThisWorkbook.Path & "\kakikomi.txt"
Set MYTXT = MyFSO.OpenTextFile(Filename, ForAppending)

MYTXT.WriteBlankLines Lines:=0
MYTXT.Write Text:=Range("C14").Value

MYTXT.Close

Set MyFSO = Nothing
Set MYTXT = Nothing

End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 質問の趣旨が理解できません
 希望する出力結果を提示できますか?

 例えば
 C14,C15 のように、一行で出力したいのか

 C14
 C15
 のように二行で出力したいのか

 C14 または C15
 どちらか一方のみ出力したいのか

 余談ですが、FSO使わなくてもできるから、希望があれば説明します
(稲葉) 2019/03/11(月) 05:47

 午後時間取れそうにないので、取り急ぎたたき台です。
 このようなデータで検証しています。
     |[C]|[D]|[E]|[F]
 [14]|  1|  2|  3|  4
 [15]|  5|  6|  7|  8 

    Sub textkakikomi()
        Dim MyFSO As New FileSystemObject
        Dim MYTXT As TextStream
        Dim Filename As String
        Dim c As Variant, r As Long
        Dim moji As String
        Filename = ThisWorkbook.Path & "\kakikomi.txt"
        Set MYTXT = MyFSO.OpenTextFile(Filename, ForAppending) '追加モード
        '出力例
        '1,2,3,4
        '5,6,7,8
        With MYTXT
            For r = 14 To 15 '                            行
                moji = ""
                For Each c In Array("C", "D", "E", "F") ' 列
                    moji = moji & "," & Cells(r, c).Value
                Next c
                .Write Mid$(moji, 2)
                .WriteBlankLines 1 '                      改行
            Next r
            .Close
        End With
        Set MYTXT = Nothing
        Set MyFSO = Nothing
        MsgBox "書き込み完了"
    End Sub

    Sub openステートメント()
        Dim Filename As String
        Dim c As Variant, r As Long
        Dim moji As String
        Filename = ThisWorkbook.Path & "\kakikomi.txt"
        Open Filename For Append As #1 '                  追加モード
            For r = 14 To 15 '                            行
                moji = ""
                For Each c In Array("C", "D", "E", "F") ' 列
                    moji = moji & "," & Cells(r, c).Value
                Next c
                Print #1, Mid$(moji, 2)
            Next r
        Close #1
        MsgBox "書き込み完了"
    End Sub

    Sub おまけ()
        Dim r As Long
        Open ThisWorkbook.Path & "\kakikomi.txt" For Append As #1
            For r = 14 To 15
                Print #1, Join(Evaluate(Columns("C:F").Rows(r).Address & "&"""""), ",")
            Next r
        Close #1
        MsgBox "書き込み完了"
    End Sub

    Sub おまけ()
        Dim r As Long
        Open ThisWorkbook.Path & "\kakikomi.txt" For Append As #1
            For r = 14 To 15
                Print #1, Join(Evaluate(Columns("C:F").Rows(r).Address & "&"""""), ",")
            Next r
        Close #1
        MsgBox "書き込み完了"
    End Sub
(稲葉) 2019/03/11(月) 12:52

稲葉様

こんばんわ。
りりちゃん☆彡です。
いつもお世話になっております。

この度は、お忙しい中教えてくださり、どうもありがとうございました(*^^*)

私の、言葉足らずの質問にお時間をさいて頂いて感謝の気持ちで一杯です。
朝早くから、お返しを下さったのに、すぐにお返事できず大変失礼いたしました。

教えていただいたコード、先程やってみました。
私が疑問を感じたことがびしっとできていました(^^♪ありがとうございました!!

そうかぁ。。IFっていうのじゃなくて、FORっていうのを使うんですね。。
本で見たら、IFっていうのは条件が成立した時に処理するって書いて有った。
Forっていうのは、指定した回数だけ処理を繰り返すって書いて有った。
りりがやりたかった、CとかDとかEとかも書込みしたい時ってはどうすればいいの?って、言う時は
Forっていうのを使って指定した回数だけ処理を繰り返すっていう方法を使うんですね。
そうだったんですか、本で見ていてふーんっては思っていたけど、分かってきた気がします。
とても勉強になりました。

もう一個の方の、openステートメントっていうやつは、FileSystemObjectっていうのを使わずにやる方法なんですね。りりは、本に書いて有ったのしか知らなかったけど、同じ事をやるのに、違う方法でもできるんですね。
こんなに色々な方法が有ったなんて、、びっくりです。

ところで Print #1ってなっているのは、何の事なんですか??知らないのでよかったら教えてくださいっ。

あと、おまけで頂いたやつ。コードが驚くほど短くなっているんですね!
Evaluateって書いてあるやつ、多分初めて見ました。こうすると短いコードでできるんですね。。

稲葉さんがすごすぎて、尊敬してしまいます。。
質問したりしてもっと教えてもらいたいって思うのに、何から聞いたらよいのやら。。
かけだしすぎて、質問することもできなくて申し訳ない気持ちで一杯です。。(:_;)

もしもお嫌でなければ、是非もう少し教えてもらえたら嬉しいです☆彡
(りりちゃん☆彡) 2019/03/11(月) 21:57


 、、、なんか憎めないなぁ
 open
 print
 close
 でワンセットです
 詳細は調べてもらった方が、私がここで説明するより
 遥かに分かりやすいと思うので、簡単に。

 openでテキストファイルを開いたときに、整理番号を配る必要があります 
 それが#1ですね。
 書き込むときも番号で呼んであげる必要があるので
 print #1 , テスト
 口語にすると、一番さんテストって書き込んでください
 となります
 複数ファイルを同時に開く場合なんかは、2とか3も使いますが、
 大抵これで事足ります
 よくFreeFile関数で空いている番号取得するよう書かれていますが
 私の経験上、必要になったことがないです
 有識者の方で、トラブル事例があれば教えていただきたいです

 Evaluateは覚えなくてもできることが大半なので、
 今はForなどの使い方を繰返し使って覚えて見てください
(稲葉) 2019/03/12(火) 01:08

ファイル記述子について。
昔のBASICでは、番号固定だと、同様に固定使用した他のアプリと同時利用した場合に問題がでたのですが、今のExcel VBAだと、FreeFileを使わなくとも問題が出ない気がしますね。

例えば、ディレクトリ位置は1つしか覚えない、という問題も、昔はOS上全てで1つだったのですが、今はWindowsの覚えているカレントと、Excelが覚えているカレントは別になっています。 Excelをもう1つ起動すると、Excel同士でも別になっているので、1つのブック内で2重にディレクトリ変更でもしなければ問題が発生しません。

ファイル記述子も同様に、Excel毎に分けて管理するように変えているのではないかと推測します。(今でも、同一ブック内で同時に複数の同じファイル記述子を使えますが、これはエラーになるので、問題は発生しません)
(???) 2019/03/12(火) 10:40


 ???さん解説ありがとうございます。
 体系的に学んだことがございませんので、いつも技術的なご説明参考になります。
(稲葉) 2019/03/12(火) 11:22

蛇足を重ねますが、ファイル記述子の数字は1〜512まで使えるのに、ヘルプでは1〜511の範囲、と書かれていたりします。(Excel2010の場合)

ヘルプを見ると、1〜255は他のアプリからアクセスできなくなり、256以上は共有になる、とあるのですが(FreeFileも、1を指定すると256以上の値を返す)、実際には1〜255でも他アプリからアクセスできたりするので、意味不明です。

あと、番号固定だと問題があるケースを見つけました。

 Sub test()
    Open "c:\tmp\test.txt" For Output As 1
    Print 1, "test"
    Close 1
 End Sub

こう書くと、Print文だけは1がファイル記述子なのか数値なのか判らないので、エラーになります。 エラー表示した後に、Print #1 のように # を付けてからマクロを実行すると、「実行時エラー'55': ファイルは既に開かれています。」のエラーになり実行できなくなります。

イミディエイトウィンドウ上で Close するとか End することでリソース解放させれば動きますが、FreeFile関数を使っていれば避けられます。 まぁ、コーディングミスするのが原因なのですが。

(???) 2019/03/12(火) 12:02


 おまけ
 Output Open の使用時は注意。

 すでにあるファイルをOutput Openしただけで中身が消えます。
 元に戻せません。
 (ファイルが無ければ、新しく作られる)
 1度試してみるのもいいかも。

 Open "存在するtxt,csvファイルのフルパス" For Output As #1
 Close #1

 因みに2種あるので調べてみては。

 Print #1,書き込むもの
 Write #1,書き込むもの
(BJ) 2019/03/12(火) 12:31

 >実際には1〜255でも他アプリからアクセスできたりするので、意味不明です。 
 こちらは私も認識しました。
 Open状態で、テキストをメモ帳で開いても問題なかったですし、開いた状態でPrintも可能でした。
 Lock Read(またはWrite)指定で変わるなら、ファイル番号の意味としてはどうなんでしょう?

 >Print文だけは1がファイル記述子なのか数値なのか判らないので、エラーになります。
 こちらもエラーになるなら、実行時のトラブルにはならなそうですね!

 BJさん
 ありがとうございます。
 私が使うときは、ほぼほぼPrintだけだった(ブックを開いた記録や印刷記録)ので気にしてなかったのですが
 WriteじゃないとInputの時に正確に読み取れないんですね。
 意識して使い分けできるようにします。

(稲葉) 2019/03/12(火) 12:59


稲葉様
こんばんわ。りりちゃん☆彡です。
いつもお世話になっております。

print #1 っていうのを使って書きこんだ、マクロは、open、print、closeっていうので
ワンセットなんですね。

#1が番号なんですね。見えない紙の番号って感じですか?
一旦この見えない紙みたいなprintっていうのに、りりが書きたかったものを、開いて書きこんで、それをtxtに書きこんでいるっていうイメージでいいんでしょうか?
???さんと、稲葉さんがお話されている内容をチラ見したけど、ひょっとしてprintっていうのを使うと、
何枚かの書きこみたいシートがあった時も、同じtxtに書きこみできるって事?
♯1とか、♯2とかにして。。
難しすぎて、またまたちんぷんかんぷんになっちゃったけど。
。なんとなくそう思いました(>_<)

せっかく、稲葉様や、???様、BJ様でためになる、難しそうなお話をされているんだと思うのですが、
りりあんまり意味が分かっていなくて。。

それにしても、いろんな方法が有って覚えることが沢山あるんですね。。
本を見ても書いてあることすら、はっ??ってなって分かったような、わかっていないような
私ですが、もっともっと勉強していつか皆様のように、話せるりりになりたいな。。

稲葉様、???様、BJ様この度は本当にどうもありがとうございました。
難しい話についていけずせっかく教えていただいているのに、何もお話できなくてすみません。
こんな私ですが、これからもどうぞよろしくお願いします。

もしよろしければ、また色々教えてください(*'▽')
(りりちゃん☆彡) 2019/03/12(火) 22:26


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.