[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『他のシートデータをテキストファイル書き込み』(a-su)
sheet1上でマクロを実行し、他のシート(sheet2)のデータをテキストファイルで書き込みたいのですが、うまくいきません。どうしたらいいでしょうか?
Dim lastRow As Long, row As Long, lastCol As Integer, col As Integer
Dim fileNumber As Integer, csvFile As Variant
csvFile = Application.GetSaveAsFilename("data.csv", "CSV (*.csv),*.csv")
If csvFile = False Then End
Worksheets("sheet2").Activate
Worksheets("sheet2").Range("k10").Select
lastRow = Range("HB1105").End(xlDown).row
lastCol = Range("HB1105").End(xlToRight).Column
fileNumber = FreeFile
Open csvFile For Output As #fileNumber
For row = 2 To lastRow
For col = 11 To lastCol - 2 Print #fileNumber, Cells(row, col) & ","; Next Print #fileNumber, Cells(row, col) & "" Next
Close fileNumber
< 使用 Excel:unknown、使用 OS:unknown >
ご苦労様です。
> うまくいきません。 そこをもっと説明してください。 ・エラーが出るのなら、どの行で発生し、エラーメッセージは何か。 ・想定と異なるなら、どのように違うのか、といった点です。 (γ) 2015/09/26(土) 22:50
マクロを実行するとフリーズしてしまいます。
(a-su) 2015/09/26(土) 22:55
コードの意味はわかりますか?
(γ) 2015/09/26(土) 23:11
γさんからアドバイスがあるように、ステップ実行で、lastRowやLastColの値を調べ、意図したものになっているかどうか 確認してください。その時の参考として。
HB1105 というセルが、何者なのかはわかりませんが、xlDown(下方向)、xlToRight(右方向) にセルを捜すと そのセルの下、あるいは右に、仮に値がなく、すべてが空白セルだった場合、下方向では最終行のセルになりますし 右方向では最終列のセルになります。
したがって、lastRow は、2003 であれば 65536、2007以降であれば1048576 になります。 また、LastCol は 2003 であれば IV列(256)、2007以降であれば、XFD列(16384) になります。
|[HB] |[HC]| |[最終] [1105]|???|空白|空白|空白 [1106]|空白 |空白|空白|空白 [ ]|空白 |空白|空白|空白 [ ]|空白 |空白|空白|空白 [最終]|空白 |空白|空白|空白
それと、コードでは K10 を選択していますが、それ以降、K10 なり ActiveCell なりの参照がありません。 それでいいのでしょうか?
また、取り出す領域、行が 2 To lastRow、列が 11 To lastCol - 2 になっていますね。 仮に LastRow が 5(行目)、LastCol が 14(N列) だったとします。
|[K] |[L] |[M] |[N] [2]|aaaa|bbbb|cccc|dddd [3]|eeee|ffff|gggg|hhhh [4]|iiii|jjjj|kkkk|llll [5]|mmmm|nnnn|oooo|pppp
できあがりの ファイルは
aaaa,bbbb, eeee,ffff, iiii,jjjj, mmmm,nnnn,
になりますが、これも意図通りでしょうか?(反映する領域と、最後に ,空白 となっているところ)
(β) 2015/09/27(日) 06:18
βさんから詳細な説明を頂きました。 是非、こちらの方向での 問題解決にトライして頂きたいと思います。 必ず得るものがあるはずです。
それを前提にした上で、少し違う観点のコメントを。
(1) For row = 2 To lastRow For col = 11 To lastCol - 2 Print #fileNumber, Cells(row, col) & ","; Next Print #fileNumber, Cells(row, col) & "" Next とされていますが、これだと、最後に Print #fileNumber, Cells(row, col) & "" が実行されるので、lastCol -1 列の処理が行われると思います。 ・lastCol列を対象にしなくてよいのか、 ・なぜ、""を追加するのか(文字列化の意図? でもなぜ最終列だけ?) が不明です。
(2) さらに申し上げると、そもそもですが、 ・当該シートを新しいブックにコピー(「移動またはコピー」から操作) ・一行目を削除、10列目までを削除 ・CSVファイルとして保存を実行 という手もあるのではないでしょうか。
行毎に書き込む列数が異なるなら、提示された手法が必要かも知れませんが、 コードでは、すべての行で同じ列数を書き込んでいます。 そこの意図が不明ではありました。 (一セルに多数の文字列があって、シートコピーで情報が失われるケース?)
(γ) 2015/09/27(日) 13:51
γさん
ご指摘ありがとうございました。
Print #fileNumber, Cells(row, col) & ""
ここを見落としていました。
アップされたコードでの出来上がりの形は
aaaa,bbbb,cccc eeee,ffff,gggg iiii,jjjj,kkkk mmmm,nnnn,oooo
でしたね。
(β) 2015/09/27(日) 14:18
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.