[[20150926223714]] 『他のシートデータをテキストファイル書き込み』(a-su) ページの最後に飛ぶ

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

 

『他のシートデータをテキストファイル書き込み』(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


書き込む範囲が広すぎるんでしょう。
ステップ実行して、
lastRow = Range("HB1105").End(xlDown).row
lastCol = Range("HB1105").End(xlToRight).Column
が意図した値になっているか、確認しては?

コードの意味はわかりますか?
(γ) 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.