エクセル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の式をいれると上記のようになります。

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2022/03/12 20:08:46
id:cilgis

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


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

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

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

ベストアンサー

id:ken3memo No.1

回答回数317ベストアンサー獲得回数115

>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

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

id: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/q131462...

同じような質問・処理が出てくるので、

参考となれば

2022/03/08 15:51:41
id: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

2022/03/12 20:08:09

その他の回答0件)

id:ken3memo No.1

回答回数317ベストアンサー獲得回数115ここでベストアンサー

>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

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

id: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/q131462...

同じような質問・処理が出てくるので、

参考となれば

2022/03/08 15:51:41
id: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

2022/03/12 20:08:09

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません