• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelマクロ 空白セルを無視してCSV出力)

Excelマクロ 空白セルを無視してCSV出力

このQ&Aのポイント
  • Excelのマクロについて質問します。<sheet1>の内容をCSVに出力するマクロを使用しているのですが、問題があって困っています。
  • <sheet1>のA1~K30までは数式が入っていて、<sheet2>のA1~A30に「OK」と表示されている場合、<sheet1>の対応した行に数値が表示されます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんばんは。 出力したものは、行の長短が出来て、凸凹になってしまってもよいということですか? >これに追記する形で改良できないでしょうか。 Sheets("Sheet1").Copy の後で、あくまでも、空白が「文字列」になっている条件ですが、 Range("A1:K30").SpecialCells(xlCellTypeFormulas, xlCellTypeConstants).Delete Shift:=xlToLeft とすれば出来ます。 しかし、こんなコードも考えられます。以下の場合は、複雑な条件を取りつけることが可能です。 今回は、「""」という表示になっていることが条件です。 '//標準モジュールで、出力は、ActiveSheet Sub Test1()  Dim FName As String  Dim Fno As Integer  Dim myRange As Range  Dim i As Long, j As Long  Dim strLine As String  Set myRange = Range("A1", "K30") '範囲    FName = Application.GetSaveAsFilename( _            InitialFileName:="book1.csv", _            FileFilter:="CSVファイル (*.csv), *.csv")  If FName = "False" Or FName = "" Then Exit Sub 'キャンセルが利くようにする    Fno = FreeFile()  Open FName For Output As #Fno  For i = 1 To myRange.Rows.Count   For j = 1 To myRange.Columns.Count    If Trim(Cells(i, j).Value) <> "" Then     strLine = strLine & "," & Cells(i, j).Value    End If   Next j   Print #Fno, Mid(strLine, 2)   strLine = ""  Next i  Close #Fno  Set myRange = Nothing End Sub

bambooshootbox
質問者

お礼

ありがとうございます。 空白は文字列ではなかったので、下の記述を試したところ、 うまくいきました。 色々と応用が利くので、この先も使っていきます。 助かりました。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

>これに追記する形で改良できないでしょうか。 ご利用のエクセルのバージョンが不明ですが、エクセルにCSVとして保存させる方式では、ご希望の事はできません。 #参考 2003以前のエクセルの場合: http://support.microsoft.com/kb/400253/ja の仕様によって、一部の行についてカンマが補填されます 2007以降のエクセルの場合: 上述の「仕様」は変更され、全ての行にカンマが補填されます。 >マクロでCSV出力する際に、「空白だけど数式が入っているセル」を除外する方法 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 みたいな。

bambooshootbox
質問者

お礼

ありがとうございます。 教えていただいた記述でうまくいきました。 色々なやり方があるのですね…勉強します。