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

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

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

Excelのマクロについて質問します。 <sheet1>の内容をCSVに出力するマクロを使用しているのですが、 問題があって困っています。 <seet1>のA1~K30までは数式が入っていて、<sheet2>のA1~A30に 「OK」と表示されている場合、<sheet1>の対応した行に数値が表示されます。 「OK」以外の場合は、空白になるようにしてあります。 【sheet1】   A    B    C    D    E … 1 100  200  300  400  500 2 100  200  300  400  500 3 100  200  300  400  500 4 100  200  300  400  500 5 6 【sheet2】   A 1 OK 2 OK 3 OK 4 OK 5 6 <sheet1>をマクロでCSV出力する際に、「空白だけど数式が入っているセル」を 除外する方法を教えてください。 現在は「空白だけど数式が入っているセル」もCSV出力されてしまい、「,」が 連続で表示されるので、手動で「,」を削除しています。 ■今使用しているマクロは以下になるので、これに追記する形で改良できないでしょうか。 Sub CSV出力() Dim FileN As String FileN = Application.GetSaveAsFilename( _ InitialFileName:="book1.csv", _ FileFilter:="CSV ファイル (*.csv), *.csv") Sheets("sheet1").Copy ActiveWorkbook.SaveAs Filename:=FileN, FileFormat:=xlCSV ActiveWorkbook.Close Savechanges:=False End Sub よろしくお願いします。

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

  • ベストアンサー
回答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/7940)
回答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
質問者

お礼

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

関連するQ&A

  • エクセルからCSVファイルに出力したい?

    エクセルのシートからマクロを使ってCSVファイルに出力したいです。 そこで調べたのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2376607 こちらの質問で以下のようなコードが参考になりました。 Sub Macro1() Dim myBook As String myBook = ActiveWorkbook.FullName myBook = Left(myBook, Len(myBook) - 3) & "CSV" ActiveSheet.Copy ActiveWorkbook.SaveAs Filename:=myBook, FileFormat:=xlCSV ActiveWindow.Close False End Sub このコードではCSVのファイル名がエクセルシートのファイル名になってしまいます。 今回の質問ですが、CSVファイルを違う名前で保存するにはどのようにすればいいのでしょうか? (CSVファイルの名前は常にabc.csvで保存するものとします)

  • エクセルマクロ 【空白セルを無視する方法を教えてください】

    マクロを独学で学び仕事に応用しているのですが、どうしても分からないことが発生してしまい、質問です。 内容は、今、エクセルシートのA1~B5の範囲で A B 1 1 1 2 1 2 3 4 1 5 1 という形で入力されています(見難くてスミマセン)。 この状態から「A列とB列に同じ数字が入力されてれば、メッセージBOXを表示して、なおかつOKボタンを押したら該当セルを赤くする」というマクロを作りたいのですが、本来であれば1行目のみ赤くなるはずなのですが、空白セルが含まれている3行目も赤くなってしまうんです。つまり、空白セルも「同じ値」と認識されているみたいなのですが...。 この場合、空白セルを無視するにはどうしたらよいのですか?教えてください。なお、マクロは以下のように作っています。 Sub ナンバーチェック() Dim Btn As Integer For X = 5 To 10 If Cells(X, "A").Value = Cells(X, "B").Value Then  Btn = MsgBox("同じ数値です", vbOK, "警告")  If Btn = vbOK Then   Cells(X, "A").Interior.ColorIndex = 3 Cells(X, "B").Interior.ColorIndex = 3 End If End If Next End Sub

  • エクセルVBAでCSV出力する際、リンク0を空白に

    エクセル2019使用 シート名 「フォーマット」 「シート1」 「フォーマット」に入力されているデータを 「シート1」のセルB4:T100(行数は「フォーマット」データ量でその都度変わります) に =フォーマット!A63 のようにリンクさせております。 「シート1」をCSVで出力したところリンク元が空白のため「0」と表示されてしまいます。 詳細設定の「ゼロ値のを表示する」をオフにしてもだめでした。 関数で空白なら空白でもだめでした。 リンク元空白の状態で「シート1」のセルB4:T100をCSV出力。 「シート1」ではリンク元空白を空白にする方法はありますでしょうか。

  • VBAマクロでCSV出力

    はじめまして、よろしくお願いします。 ExcelのVBAマクロで 特定のセルの範囲を「シート名.csv」で出力するようなプログラムを書きたいです。 例)シート名「TEST」内にあるマクロボタンを押すと  A1:A10のセルの内容が「TEST.csv」(アスキー形式ならなんでも)  に出力される。 どういうやり方があるか、お勧めのサイト等、 ご教授いただけないでしょうか? 以上、よろしくお願いいたします。

  • CSV保存マクロ 日付が逆になり困っています。

    マクロに詳しい方、お願いいたします。 エクセルのシートで2018/1/21とセルに記載したものを 下記マクロ(標準モジュールにコード記載)して、CSVで保存しています。 実行後CSVを開くと、21/1/2018になって逆になります。 調べてもわかりません。よろしくお願いします。 Sub Macro1() Application.DisplayAlerts = False main_f = ActiveWindow.Caption out_pass = ActiveWorkbook.Path & "\" Out_name = ActiveSheet.Name Sheets(Out_name).Select Sheets(Out_name).Copy ActiveWorkbook.SaveAs Filename:= _ out_pass & Out_name & ".csv", _ FileFormat:=xlCSV, CreateBackup:=False ActiveWindow.Close Application.DisplayAlerts = True End Sub

  • Excelマクロ CSV出力

    Private Sub cmd_csv_Click() Open "\\サーバ名\フォルダ名\あああ.csv" For Output Access Write As #1 With Sheets("データ") For intRow = 3 To .Range("a2").End(xlDown).Row Print #1, .Cells(intRow, 1) & "," & .Cells(intRow, 2) & "," & .Cells(intRow, 3) & "," & .Cells(intRow, 4) & "," & .Cells(intRow, 5) & "," & .Cells(intRow, 6) & "," & .Cells(intRow, 7) & "," & .Cells(intRow, 8) & "," & .Cells(intRow, 9) & "," & .Cells(intRow, 10) & "," & .Cells(intRow, 11) & "," & .Cells(intRow, 12) & "," & .Cells(intRow, 13) & "," & .Cells(intRow, 14) & "," & .Cells(intRow, 15) Next intRow End With Close #1 MsgBox "出力完了しました。 " & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "出力ファイル:フォルダ名\あああ.csv" End Sub ------------------------------------------------------------- 上記のロジックで「データ」シートのA3からO列の最終行までをCSV出力しています。 このマクロにA列に値が入った行のみを出力する(A列が空白なら無視し次の行へ)というロジックを追加したいのですが、方法がわかる方いらっしゃいますか? どなたか教えてくださいm(__)m!!

  • ExcelのマクロでCSVファイルを開くと遅いのですが

    ExcelのマクロでCSVファイルを開くと遅いのですが速く開く方法はありますか? 普通にファイル-開くに比べてかなり遅いです。 下記のVBAで記述してあります。 Workbooks.Open Filename:=fname ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close savechanges:=False

  • 空白のセルを行削除する。EXCELマクロなのですが・・

    VBA初心者です。 データーをHPから、単純にコピーしてきて、 EXCELに貼り付けています。 フィルターをかけても、画像かなにかがセルに張り付いているのか、 空白行をすべて削除できません。 いろいろ試して(HPから、空白セルの行削除について書かれてあるマクロを貼り付けて)動いたのが、このVBAです。 しかし、遅いので、早いVBAに簡略できればいいのですが。。 大体、1000行ぐらいの文字を貼り付けて、3/1ぐらいが空白行です。A行のセルの空白のみを、削除したいのですが。  まったくの素人なので、わかりません。 どうかよろしくお願いいたします。 Sub 空白の削除() x% = Worksheets("sheet1").Range("A65536").End(xlUp).Row For i = x% To 1 Step -1 If Worksheets("sheet1").Cells(i, 1).Value = "" Then Worksheets("sheet1").Rows(i).Delete Next End Sub

  • Excelのマクロで、セル内の文字をファイル名にしたい

    ”プロト.xls”というExcelファイルの中に、以下の動作をするマクロを作成したいのです。 (1)”C:\顧客\顧客納期連絡.xls”というExcelファイルを開き、  それを”C:\顧客\A.csv”という名前のcsvファイルにする。 (2)”C:\顧客\A.csv”を”xxxxxxxxxxxxxxxxxx”(※注1)という名前にしてコピーする。 ※注1:”xxxxxxxxxxxxxxxxxx”の部分は、”プロト.xls”ファイルのSheet”マスター”のセルD9から取得させる。 そのセルは、 C:\顧客\ABCDEF0215.csv と記述しています。 (3)コピー後、”C:\顧客\A.csv”を削除する。 ------------------------------------------------------------------- Sub 顧客納期連絡() ' ' 顧客納期連絡 Macro ' マクロ記録日 : 2010/2/15 ユーザー名 : xxxxxxx ' ' ChDir "C:\顧客" Workbooks.Open Filename:="C:\顧客\顧客納期連絡.xls" ActiveWorkbook.SaveAs Filename:="C:\顧客\A.csv", FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Save ActiveWindow.Close ActiveWorkbook.Save Dim fname1 As String Dim fname2 As String fname1 = "C:\顧客\A.csv" fname2 = Workbooks("プロト.xls"), Sheets("マスター"), Cells("D9") FileCopy fname1, fname2 Kill "C:\顧客\A.csv" End Sub ------------------------------------------------------------------- 上記のマクロを作成したのですが、FileCopyの行で、構文エラーか型に一致していない、 というエラーになりマクロ再生が停止します。 セルの内容をファイル名にしたいのですが、何か良い方法はございませんでしょうか? 私は超初心者なので、何卒宜しくお願い致します。

  • 【ExcelVBA】空白ではないセルを選択する

    こちらで、Sheetをcsv出力する際、 空白のセルを区切る「,」が入ってしまう件を質問いたしました。 http://okwave.jp/qa/q8886514.html 計算結果が空白でも、そのセルは「文字数が0の文字列としてデータ」がある状態 という事は理解ができました。 そこで、A~C列の「文字数が0の文字列」ではないセルを選択して、 その範囲をSheet2にペースト、そのSheet2をcsvで保存すればよいと思いました。 この部分をマクロに組み込みたいのですが、 A~B列で「文字数が0の文字列」ではないセルを選択という指示をする部分がわかりません。 以下は、マクロの記録を使って作成しました。 Sub csv送信用() ' ' csv送信用 Macro ' ' Sheets("Sheet2").Select Selection.QueryTable.Delete Selection.ClearContents With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Documents and Settings\***\My Documents\***.csv" _ , Destination:=Range("$A$1")) .Name = "***_2" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 2, 2, 2) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With Sheets("Sheet1").Select Columns("A:C").Select Selection.Copy Sheets("csv_copy").Select ActiveSheet.Paste Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\***\My Documents\csv_copy.csv", FileFormat:= _ xlCSV, CreateBackup:=False Application.DisplayAlerts = True Sheets("Sheet1").Select End Sub この Columns("A:C").Select Selection.Copy の、部分を「A~B列で「文字数が0の文字列」ではないセルを選択」してコピーにするとよいのだと思うのですが、 どのように書いたらよいでしょうか。 Excel2007です。 宜しくお願いいたします。

専門家に質問してみよう