人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセル2019VBAで空白行を削除し詰めてCSV書き出ししたい。

会員データをエクセル2019のフィルターで表示した時に、非表示の行が出来ます。
CSVで出力するとこの空白行は
,,,,,,,
のような形で出力されてしまいます。

これを行ごと削除して詰めて出力したいです。


会員システムで会員情報をエクセル形式でダウンロードし、フィルターを掛けます。

すると
実際は3,4行目はフィルターで非表示ですが、CSVで書き出すと下記の様になります。

A B C
1 青木,2月,メール配信可,-
2 秋葉,2月,メール配信可,-
3
4 安部,2月,メール配信可,-
5 田村,2月,メール配信可,-
6 高橋,2月,メール配信可,-
7
8 野村,2月,メール配信可,-
9 田村,2月,メール配信可,-

※元データを別シートに抽出していますので上記のデータは関数(抽出結果)です。
※空白行は""で出力しています。
※実際は空白行に,,,などのコンマが並んでいますが、他の方の説明で使われていた下記VBAの式をいれると上記のようになります。

よろしくお願い致します。

●質問者: cilgis
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

Sub macro1()

Dim h As Range

Dim buf As String

Dim FileN As String

FileN = Application.GetSaveAsFilename( _

InitialFileName:="book1.csv", _

FileFilter:="CSV ファイル (*.csv), *.csv")

Open FileN For Output As #1

With Application

For Each h In Range("A1:A" & Range("A65536").End(xlUp).Row)

buf = Join(.Transpose(.Transpose(Range(h, Cells(h.Row, "IV")).Value)), " ")

buf = .Trim(buf)

buf = Replace(buf, " ", ",")

Print #1, buf

Next

End With

Close #1

End Sub


範囲に関しては記載の仕方がよくわからないので、上から下まで全部対象にしたいです。

アクティブレンジという項目を使うとこの空白行を詰めることが出来るみたいなのですが、変更するとエラーになってしまいますので、これを使用したやり方でも、そうでないやり方でもお教え頂けると嬉しいです。

よろしくお願い致します。


1 ● ken3memo
ベストアンサー

>CSVで出力するとこの空白行は

>,,,,,,,

>のような形で出力されてしまいます。

CSVで出力するコードを一部抜き出すと

buf = .Trim(buf)

buf = Replace(buf, " ", ",")

Print #1, buf

Next

の部分で、

buf = Replace(buf, " ", ",")

Print #1, buf

かな。

>,,,,,,,

>のような形で出力

なので、

>,,,,,,,

の時は、出力したくないので※しつこいな

buf = .Trim(buf)
If Len(Trim(buf)) > 7 Then '7文字以上ならデータありにする?手抜きだけど 
 buf = Replace(buf, " ", ",") 'スペースをカンマにしてから
 Print #1, buf 'テキストファイル csvへ一行書き込む
End If

↑なんか変だけど、

現在

>,,,,,,,

>のような形で出力

は、動いているので、

単純に If Len(Trim(buf)) > 7 Then とかbufがLenで調べて7文字以上なら書き出す

そんな手抜き処置を提案してみたり。

手抜き回答ですが、解決のヒントとなれば幸いです。

※外していたらスミマセン。と定型文を書きつつ、うまく動くといいな・・・

あっ、

>※実際は空白行に,,,などのコンマが並んでいますが、

>他の方の説明で使われていた下記VBAの式をいれると上記のようになります。

空白行までできてるなら、

buf = .Trim(buf) '←あっ、ここで、Bufから空白抜いてるジャン、見落とした・・・
If Len(buf) > 1 Then '1文字以上ならデータありにする?手抜きだけど 
 buf = Replace(buf, " ", ",") 'スペースをカンマにしてから
 Print #1, buf 'テキストファイル csvへ一行書き込む
End If

↑こんな感じで、

buf = .Trim(buf) 'ここで、Bufから空白抜いて

If Len(buf) > 1 Then '1文字以上ならデータありなので↓書き込む

buf = Replace(buf, " ", ",") 'スペースをカンマにしてから

Print #1, buf 'テキストファイル csvへ一行書き込む

End If

素朴な疑問ですが、

A B C

1 青木 太朗,2月,メール配信可,-

2 秋葉 花子,2月,メール配信可,-

など、

氏名でセイとメイの間にスペースがあった時、

単純に

buf = Replace(buf, " ", ",") 'スペースをカンマにしてから

Print #1, buf 'テキストファイル csvへ一行書き込む

だと、別問題が発生するような未来が見えるような、見えないような。

名前にスペースが入らなかったらスミマセン、スルーしてください。

buf = .Trim(buf) '←あっ、ここで、Bufから空白抜いてるジャン、見落とした・・・
If Len(buf) > 1 Then '1文字以上ならデータありにする?手抜きだけど 
 buf = Replace(buf, " ", ",") 'スペースをカンマにしてから
 Print #1, buf 'テキストファイル csvへ一行書き込む
End If

で、動くといいなぁ・・・・


ken3memoさんのコメント
あまり関係ないけど buf = Join(.Transpose(.Transpose(Range(h, Cells(h.Row, "IV")).Value)), " ") でgoogle検索すると、定番コードなのか? https://teratail.com/questions/291680?link=qa_related_sp https://oshiete.goo.ne.jp/qa/8559476.html https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13146227253 同じような質問・処理が出てくるので、 参考となれば

cilgisさんのコメント
ありがとうございます!! アドバイス通り下記のように追加したらばっちりでした♪ 感激ですm..m 解決↓↓↓ Sub macro1() Dim h As Range Dim buf As String Dim FileN As String FileN = Application.GetSaveAsFilename( _ InitialFileName:="book1.csv", _ FileFilter:="CSV ファイル (*.csv), *.csv") Open FileN For Output As #1 With Application For Each h In Range("A1:A" & Range("A65536").End(xlUp).Row) buf = Join(.Transpose(.Transpose(Range(h, Cells(h.Row, "IV")).Value)), " ") buf = .Trim(buf) If Len(buf) > 1 Then buf = Replace(buf, " ", ",") Print #1, buf End If Next End With Close #1 End Sub

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ