• ベストアンサー

エクセル VBA 保存したCSVファイルについて

いつもお世話になっています。 早速ですが カンマ区切りのテキストファイルをカンマ区切りで読み込んだあと変更を加え ActiveWorkbook.SaveAs Filename:="Book2.csv", FileFormat :=xlCSV, CreateBackup:=False で保存したものを メモ帳などで開いた時に 不要な箇所にカンマの不要な箇所に沢山カンマが付いてしまいます。 M列まであるのでその分の空白もカンマ区切りで保存されてのだと思うのですが これを、不要な部分の空白を除いた形で保存する方法は無いでしょうか? どうぞよろしくお願いします

  • hou66
  • お礼率50% (79/155)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。 >shName = ActiveSheet.Name で取った状態で名称の部分変更ってできるのでしょうか? >やはりThisWookbookなどでシートに記述してからの変更のほうが容易ですかね? >inputで入力する形になっていますがその部分へ渡す事も容易に行えるような気もするのですが・・・ 具体性がなく言葉だけで、できるかと聞かれれば、できると思うのであって、ご自身の技術レベルでコードを進めたいのなら、あくまでも自分の分かる方法で完成させればよいと思います。こちらでは、このレベルでは、どうするのが容易とかいえません。リスクの違いやコード量の違いであって、容易さというのは、この内容では分かりません。元の質問ともかけ離れてしまっています。 VBAにしろ、何を使うにしても、最終的には結果論だと思います。元の質問では、エディタだけで処理もできるものを、なおも質問し続けたものだと思います。自分でできないものを、望んで可能にさせるというのは、あくまでも、ご自分の選択と努力の範囲です。 あえて、その質問をされたいのなら、コードの提示をして新たに質問しなしてください。

hou66
質問者

お礼

いつもありがとうございます。 ご指導していただいたおかげで、なんとかがんばれそうな気がします また、何かありましたら質問していますので、見かけた時にはご指導よろしくお願いします。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 #3の補足の件 とくに、動かしてはいませんが、問題になりそうな部分はありません。 ...Select Selection... は、上の行とつなげることは可能です。 >テキストエディタでVBAのような処理が可能なものがあるのでしょうか? テキストエディタは、文字そのものは置換したりするのは、可能ですが、それ以外は難しいですね。今のコードの延長で問題ありませんが、これ以上は、つなげないほうがよいです。できれば、まとまりの中で、分散化したほうがよいです。そのほうが修正しやすいからです。 ただし、 Function SelectFileNamePath(File種類, Prompt) As Variant 同じ繰り返しがなけば、この程度は、分散しなくてもよいと思いますが、もし、サブルーチン・プロシージャですと、1行ではなくて、もう少しまとまりを作ったほうがよいと思います。 >今のやり方ですと別bookを開いてしまっているためにそれも、出来ないような気がします。 そんなことはないですね。具体的には分かりませんが、'Open ファイル'の前に、シート名を取得して、変数に留めればよいのですね。shName = ActiveSheet.Name で、とっておいてから、その後、コードを進めていっても、新たに変数を更新しなければ、保持しています。

hou66
質問者

お礼

いつもお世話になります。 shName = ActiveSheet.Name で取った状態で名称の部分変更ってできるのでしょうか? やはりThisWookbookなどでシートに記述してからの変更のほうが容易ですかね? inputで入力する形になっていますがその部分へ渡す事も容易に行えるような気もするのですが・・・・

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

#4です。 当てにならない内容をアップして煩わして申し訳ありませんでした。 もうちょっと考えます。

hou66
質問者

お礼

いえいえ ありがとうございます

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

csvで保存するときにあなたの言う余分な「,」をつけないようにすればいいのですよね。空白セルをつめればいいのではないですか。 下記。 Sub test() Dim r As Long, c As Long, re As Long, ce As Long, fr As Boolean Worksheets(1).Activate re = Cells(1, 1).SpecialCells(xlCellTypeLastCell).Row ce = Cells(1, 1).SpecialCells(xlCellTypeLastCell).Column fr = True For r = 1 To re For c = 1 To ce If Cells(r, c) = "" Then fr = False fr = fr * fr End If Next If fr = False Then Rows(r).Delete End If Next For r = re To 1 Step -1 For c = re To 1 Step -1 If Cells(r, c) = "" Then Cells(r, c).Delete Shift:=xlToLeft End If Next Next ActiveWorkbook.SaveAs Filename:="Book2.csv", FileFormat :=xlCSV, CreateBackup:=False End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >ActiveWorkbook.SaveAs Filename:="Book2.csv", FileFormat :=xlCSV, CreateBackup:=False この方法ですと、カンマは付いてしまいます。 Excelの標準では、データ範囲を四角形に区切るので、それで、最大列までの部分をカンマが付いてしまいます。なお、Excelで出力するものは、なぜか標準的なCSVではありません。以下は、以前、別のデータベース用のCSVの目的のためのものを、Excel用に換えたものです。ただ、この件には、あまり注文はつけないでください。テキストエディタで処理したほうが楽なのですから。 '------------------------------------------- Sub CsvFileOut()   Dim objFs As Object   Dim objText As Object   Dim Rng As Range   Dim DataRow As Long   Dim i As Long, j As Long   Dim buf As String   Dim myCsv As String   Const sep As String = "," 'コンマ切り   Const Ext As String = ".csv" '拡張子   Dim myPath As String   Set objFs = CreateObject("Scripting.FileSystemObject")   Set Rng = ActiveSheet.UsedRange   DataRow = Rng.Rows.Count   myPath = ThisWorkbook.Path & "\" 'マクロのブックのパスと同じ場所   If Application.CountA(Rng) <= 1 Then     MsgBox "データが1つか、空です", 16     Exit Sub   End If   Do     myCsv = Application.InputBox("ファイル名を入れてください/拡張子不要", Type:=2)     If myCsv = "False" Or myCsv = "" Then       Exit Sub     ElseIf InStr(myCsv, Ext) = 0 Then        myCsv = myCsv & Ext     End If     If Dir(myPath & myCsv) <> "" Then       MsgBox "同名のファイルが既にあります" & vbCrLf & "'" & myCsv & "'", 16     End If   Loop Until Dir(myPath & myCsv) = ""   Set objText = objFs.CreateTextFile(myPath & myCsv)   For i = 1 To DataRow     buf = VBA.Trim(Rng.Cells(i, 1).Value)     For j = 2 To Rng.Cells(i, 256).End(xlToLeft).Column       buf = buf & sep & VBA.Trim(Rng.Cells(i, j).Value)     Next j     objText.WriteLine (buf)   Next i   Set Rng = Nothing   Set objText = Nothing   Set objFs = Nothing End Sub

hou66
質問者

お礼

いつも大変お世話になっています。 やはり最大までエリアとして判断されるのですね  今回のマクロで欲しい結果が得られていますので助かります。 色々教えていただいた内容をつなぎ合わせてこの様な状態です まだ完成していませんが、今回教えていただいた内容を付けていきたいと思います。

hou66
質問者

補足

今まで色々教えていただいた内容を貼り付けたりして現在の状況です 今回の内容を付け加えることでかなり完成までは近づくと思います あとは元のファイル名の一部分のみ変更して保存するのですが 現在頭の中に浮かんでいるのはシート名を取得してそれの一部変更を行うことが可能なのか ファイル名をセルに書き出して入力された横の列に関数を入れて計算した結果をファイル名にするほうが簡単なようにも思うのですが、今のやり方ですと別bookを開いてしまっているためにそれも、出来ないような気がします。 テキストエディタでVBAのような処理が可能なものがあるのでしょうか? 足したり引いたり並び変えたり・・・ Sub chkchenge() Dim File種類, Prompt, Item As String Dim FileNamePath As Variant Dim rng As Range Dim R As Range Dim c As Range Dim cc As Range Dim d As Range Dim dd As Range 'ファイルのパスを取得します File種類 = "テキスト ファイル (*.*),*.txt" Prompt = "chk ファイルを選択してください" FileNamePath = SelectFileNamePath(File種類, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If Workbooks.OpenText Filename:=FileNamePath, _ DataType:=xlDelimited, comma:=True, _ TextQualifier:=xlTextQualifierDoubleQuote '列挿入 Columns("i:i").Insert Shift:=xlToRight '%DATAの位置を探す Set R = ActiveSheet.Cells.Find("%data") If R Is Nothing Then MsgBox "ファイルが違います" Else End If Set rng = Range(R, Range("a65536").End(xlUp)) '処理範囲から計算する設備を選択し計算する 結果を値にする rng.Offset(1, 8).Resize(rng.Rows.Count - 2).Formula = _ "=RC[-1]+OR(RC[-8]=""bm1"",RC[-8]=""bm2"")*(RC[-1]>=1)*IF(RC[-1]>=81,-80,80)" rng.Offset(1, 8).Value = rng.Offset(1, 8).Value Columns("H:H").Select Selection.Delete Shift:=xlToLeft '並び替えを行う設備を選択して並び替えを行う Set c = Columns("A").Find("bm1", lookat:=xlWhole, After:=Range("A" & Rows.Count)) Set cc = Columns("A").Find("bm1", After:=R, Searchdirection:=2) Range(c, cc.Offset(, 14)).Select Selection.Sort Key1:=c.Offset(, 7), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Set d = Columns("A").Find("bm2", lookat:=xlWhole, After:=Range("A" & Rows.Count)) Set dd = Columns("A").Find("bm2", After:=R, Searchdirection:=2) Range(d, dd.Offset(, 14)).Select Selection.Sort Key1:=d.Offset(, 7), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal End Sub Function SelectFileNamePath(File種類, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(File種類, , Prompt) End Function

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

エクセルのCSVファイルは、データの有る最右列までの最矩形的な範囲を保存するのだと思います。 それより右列にデータがある場合、””も重要(どの列かを示す必要)なデータなので、質問のようなのは仕様ということで、我慢するほか無いのでは。 見難いというなら、CSVファイルは、視覚用のものではない。 エクセルに読み込まして、シートを見ればよい。 最右列の列(フィールド)データで終わるCSVデータを作っても 、以右フィールドを空白化してくれるかどうか確認・注意が必要になったりして、わずらわしい場合がありそう。 VBAででも使えば、質問のようなのは難しくないので、エクセルの保存に頼るからそうなるともいえる。 また質問のことを実現する必要性は何かな。好みの問題では。

hou66
質問者

お礼

いつもありがとうございます。 やはりそうでしたか、四角くなるのですね 実現する必要性といえば、元々のデータが設備に使用されているデータでして その一部のみを変更して使用したいと考えたからです。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

「不要な箇所」 というのが理解できません。 並びに整合性があるように「,」を入れてあるのでしょう。 それがいやなら、メモ帳で開いて、検索/置換で、不要と思われる「,」を削除して保存すればいいでしょう。 うまく削除できないなんて言うんじゃないよ。

hou66
質問者

お礼

ありがとうございます。 元々のファイルがカンマ区切りで見ると10行ぐらいまでは1列であり その後の行が13行目ぐらいまであるファイルなので その状態のようにするマクロがあれば、教えていただきたいのです。 うまく削除できないとは、言っていませんが。

関連するQ&A

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

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

  • エクセルVBAでファイルをCSV保存の仕方

    エクセルのシートをCSVファイルに保存するため以下のようなマクロを書きました。 Sub Macro1() Cells.Select Selection.Copy Workbooks.Add ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.SaveAs FileName:="C:\WINDOWS\デスクトップ\Book1.csv", FileFormat _ :=xlCSV, CreateBackup:=False ActiveWindow.Close ThisWorkbook.Activate End Sub 一応これで保存できるのですが、自動記録でやったためファイルの名前が出てしまいました。 この部分をわたし以外の誰でも任意の名前をつけ、任意のフォルダーに保存できるように書き換えたいのです。 どのように記述すれば良いかお教えください。お願いします。

  • (VBA)書式が変更されてしまいます

    ↓SaveAsで保存すると書式が変更されてしまいます。 ActiveWorkbook.SaveAs FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close False ネットで↓の回避策を見つけたのですがうまくいきません。 **************************************************************** Sub CSV_Save() 'Sheet1をCSV形式で保存します。 With ActiveWorkbook.Sheets(1) 'A1:A10まで日付あるいは通貨設定のデータが入っているとします。 For Each rng In Range("A1:A10") 'テキスト文字列に変更します。 rng.Value = "'" & rng.Text Next rng End With ActiveWorkbook.SaveAs FileName:="C:\test.csv", FileFormat:=xlCSV End Sub **************************************************************** ご指導お願いします。

  • EXCEL VBAでカンマ区切りテキストファイルに変換する方法

    EXCELで作成したシートをVBAでカンマ区切りテキストファイル(CSVファイルではなく)に変換する方法を教えてください 下記のプログラムではテキストファイルに変換されますが、カンマ区切りになりませんでした。 Sub Samp() ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\aa.txt", FileFormat _ :=xlText, CreateBackup:=False End Sub

  • CSVファイルの保存方法をお教えください

    Microsoft Office Personal 2010を使っています。 HogeHoge.csv をエクセルで開きます、この時シートの表示はHogeHoge.csv のままです 平均計算などの処理後このファイルを閉じようとすると下記のようなメッセージが出ます がこの時[はい]をクリックして閉じると正常に保存されるのですが マクロで保存をしようとするとなかなか上手くいきません。 A列の日付けが 2014/1/15 10:30 が 1/15/2014 10:30 となってしまいます。 HogeHoge.csvには、CSV(カンマ区切り)と互換性のない機能が含まれている可能性があります。この形式でブックを保存しますか? ・このまま保存するには、[はい]をクリックします。 ・機能を保存するには、[いいえ]をクリックしてから、最新のExcelの形式で保存します。 とでます   下記のようなマクロですがどのようにすれば良いのか分かりません   どうぞよろしくお願いいたします。 Sub 保存終了() ChDir "D:\DATA\BackT" ActiveSheet.SaveAs Filename:="D:\DATA\BackT\HogeHoge.csv", FileFormat _ :=xlCSV, CreateBackup:=False If Workbooks.Count = 1 Then Application.DisplayAlerts = False Application.Quit Else: ActiveWorkbook.Close False End If End Sub

  • エクセル テキスト形式の名称変更保存

    みなさまお世話になります 早速ですが、標記の件です csv形式になっているテキストファイル(拡張が異なりますset)をエクセルで カンマ区切りにて開いた後 保存しようとした場合 上書き保存であれば、拡張も元々の拡張子で保存されるのですが マクロを使用してファイル保存をしようとすると ActiveWorkbook.SaveAs Filename:=ActiveSheet.Name, FileFormat:=xlCSV, CreateBackup:=False 拡張子がCSVになってしまいます。 それを元々の拡張にて保存を行いたいのです。 またファイル名が長いので 変更をかけた後  シート名の一部を変更して保存したいためにActiveSheet.Nameを 使用しています どうぞよろしくお願いします。

  • VBAでSaveAs使用し、指定していないのにデスクトップに保存される理由

    VBAで構文中に ActiveWorkbook.SaveAs FileFormat:=xlCSV, _ CreateBackup:=False という記述をしました。すると、保存場所を指定していないのにデスクトップに保存されてしまいます。まず、なぜでしょうか?また、保存場所の指定はどのようにすればよいでしょうか?

  • EXCEL確認メッセージを出さずに保存したい

    恐れ入りますが、ご教示お願い致します。 質問(1) EXCELファイルを (1)特定の名前で (2)CSVファイルにして 保存をしたいと考えています。次のマクロを書いたところ、”CSVへの変更を保存しますか?”確認メッセージがでます。 確認メッセージを出さずに、保存するためには、どのように記述したらよいでしょうか? With ActiveWorkbook .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal, FileFormat:=xlCSV .Close End With (2)改行するためにはどうしたらよいでしょうか? .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal, FileFormat:=xlCSV を、次のように改行させたいのです。 .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal,      FileFormat:=xlCSV _ を使うということを、なんとなく覚えておりますが、うまくいきません。注意点等をご教示頂ければと思います。 以上 よろしくお願い致します。

  • EXCELのマクロで保存するときのメッセージ

    CSVファイルを上書き更新後、ファイルを閉じる作業をしたいのですが、EXCEL2000のマクロでその作業を行うと、次のメッセージがでて、次の手作業の要求がきます。 (1)ファイルの上書きするとき  この場所にAAAというファイルが既にあります。置き換えますか・・・はいのクリック (2)ファイルを閉じるとき  AAAへのファイルの変更を保存しますか・・・いいえをクリック この(1)(2)の作業も、マクロに書きたいのですが、どうすればよいのでしょうか 現在のマクロは ActiveWorkbook.SaveAs Filename:= _ "C:\AAA.csv" _ , FileFormat:=xlCSV, CreateBackup:=False ActiveWindow.Close よろしくお願いします

  • VBAでのCSV保存

    VBAでExcelのデータを保存したく、 ActiveSheet.SaveAs _ Filename:=xxxxx, _ FileFormat:=xlCSV といった感じにしています。 ほぼこの方法で問題ないのですが、なぜか変形してしまう データがあります。 文字列として2004/6/18といった形で入力しているデータが 6/18/2004のように変化してしまいます。 FileFormatを指定しなければ、2004/6/18のままですが、 それではCSVファイルになりません。 どうしたらいいのでしょうか?

専門家に質問してみよう