dポイントプレゼントキャンペーン実施中!

下記VBAにてシートごとCSVに変換し特定のフォルダーに指定ファイル名で保存しているのですが、
B列の空行を削除をしたデーターをCSV保存したいのですが、VBAの記述をご教授ください
ファイル名・フォルダーは固定で構いません
よろしくお願いいたします

Sub ボタン1_Click()
Application.DisplayAlerts = False

Sheets("商品.csv").Copy
ActiveWorkbook.SaveAs Filename:="Z:\DATA\商品.csv", _
FileFormat:=xlCSV
ActiveWindow.Close

Application.DisplayAlerts = True

End Sub

「フィルターをかけてCSV保存をVBAで」の質問画像

質問者からの補足コメント

  • うーん・・・

    fujillin 様

    早々のご教授ありがとうございます。
    説明不足で申し訳有りません
    サンプル表の空欄には =IF(Sheet1!A1="","",Sheet1!B1) のように式が記載されていて
    別シートにコピーしても空欄と認識しないようです。
    式を消して試すと確かに行は削除されています。
    式の記載があっても削除するように出来ないでしょうか
    よろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/08/20 10:44

A 回答 (4件)

>別シートにコピーしても空欄と認識しないようです。


値コピーすれば、"" (長さ0の文字列)は消えますが、オリジナルをいじることはできないはずですし、Copy , 再び、値コピーを繰り返すのは手間が多すぎます。No.1さんのご指摘の通りなのですが、さて、マクロのコードにしてみると、少しややこしいです。
Sheets("商品.csv").Copy
この「必殺の」一行を活かすために、全体の方法が決まってしまいます。しかし、元からすると、なんとも冗長になってしまいます。それとも、私のコードの問題なのかな?


'//標準モジュール
Sub ExportCSV()
 Dim orgSh As Worksheet
 Dim ValueArea As Range
 Dim shName As String
 Dim wb As Workbook
 Const myPATH As String = "Z:\DATA\" '行末は必ず、¥。
 Set orgSh = ActiveSheet
 With orgSh
  shName = .Name
  .AutoFilterMode = False
  Set LastCell = .UsedRange.SpecialCells(xlCellTypeLastCell)
  Set ValueArea = .Range("A1", LastCell)
  ValueArea.AutoFilter
  .AutoFilter.Range.AutoFilter _
   Field:=2, _
   Criteria1:="<>" '空白行を取る
  .Copy
  Set wb = ActiveWorkbook
 End With
 With wb
  With ActiveSheet
   .AutoFilterMode = False
   .UsedRange.ClearContents
   ValueArea.Copy .Range("A1") 'ここが重要
  End With
  .SaveAs myPATH & shName , xlCSV '保存
  .Close False
 End With
 ActiveSheet.AutoFilterMode = False
End Sub
    • good
    • 0
この回答へのお礼

完璧です!!
理想通りの結果が得られることができました
ありがとうございました。

お礼日時:2019/08/21 02:45

No2です



>別シートにコピーしても空欄と認識しないようです。
あらそうでしたか・・・
関数の計算結果となると、空白表示のセルをを実際の空白に置き換えるしかないので、

For Each c In Intersect(ActiveSheet.UsedRange, Columns(2))
 If c.Value = "" Then c.ClearContents
Next c
とか。


でも、こんな手間をかけているようなら、最初にご質問の通りフィルターで処理する方が簡単になって来ちゃいますね。

 ActiveSheet.UsedRange.AutoFilter Field:=2, Criteria1:="<>"

で済むはずですので。
    • good
    • 0

こんにちは



処理順序を変えれば(先に別シートへコピー)、フィルターをかけなくとも、空行を削除しても問題ないでしょうから・・・

Rows(1).Insert
Columns(2).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

とかでもよさそう。
(Insertはエラー回避のおまじないです)
この回答への補足あり
    • good
    • 0

そのとおりです。


フィルターを掛けて新しいシートにコピーしてから出力してやれば良いんです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています