- ベストアンサー
エクセル VBA 保存したCSVファイルについて
いつもお世話になっています。 早速ですが カンマ区切りのテキストファイルをカンマ区切りで読み込んだあと変更を加え ActiveWorkbook.SaveAs Filename:="Book2.csv", FileFormat :=xlCSV, CreateBackup:=False で保存したものを メモ帳などで開いた時に 不要な箇所にカンマの不要な箇所に沢山カンマが付いてしまいます。 M列まであるのでその分の空白もカンマ区切りで保存されてのだと思うのですが これを、不要な部分の空白を除いた形で保存する方法は無いでしょうか? どうぞよろしくお願いします
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >shName = ActiveSheet.Name で取った状態で名称の部分変更ってできるのでしょうか? >やはりThisWookbookなどでシートに記述してからの変更のほうが容易ですかね? >inputで入力する形になっていますがその部分へ渡す事も容易に行えるような気もするのですが・・・ 具体性がなく言葉だけで、できるかと聞かれれば、できると思うのであって、ご自身の技術レベルでコードを進めたいのなら、あくまでも自分の分かる方法で完成させればよいと思います。こちらでは、このレベルでは、どうするのが容易とかいえません。リスクの違いやコード量の違いであって、容易さというのは、この内容では分かりません。元の質問ともかけ離れてしまっています。 VBAにしろ、何を使うにしても、最終的には結果論だと思います。元の質問では、エディタだけで処理もできるものを、なおも質問し続けたものだと思います。自分でできないものを、望んで可能にさせるというのは、あくまでも、ご自分の選択と努力の範囲です。 あえて、その質問をされたいのなら、コードの提示をして新たに質問しなしてください。
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #3の補足の件 とくに、動かしてはいませんが、問題になりそうな部分はありません。 ...Select Selection... は、上の行とつなげることは可能です。 >テキストエディタでVBAのような処理が可能なものがあるのでしょうか? テキストエディタは、文字そのものは置換したりするのは、可能ですが、それ以外は難しいですね。今のコードの延長で問題ありませんが、これ以上は、つなげないほうがよいです。できれば、まとまりの中で、分散化したほうがよいです。そのほうが修正しやすいからです。 ただし、 Function SelectFileNamePath(File種類, Prompt) As Variant 同じ繰り返しがなけば、この程度は、分散しなくてもよいと思いますが、もし、サブルーチン・プロシージャですと、1行ではなくて、もう少しまとまりを作ったほうがよいと思います。 >今のやり方ですと別bookを開いてしまっているためにそれも、出来ないような気がします。 そんなことはないですね。具体的には分かりませんが、'Open ファイル'の前に、シート名を取得して、変数に留めればよいのですね。shName = ActiveSheet.Name で、とっておいてから、その後、コードを進めていっても、新たに変数を更新しなければ、保持しています。
お礼
いつもお世話になります。 shName = ActiveSheet.Name で取った状態で名称の部分変更ってできるのでしょうか? やはりThisWookbookなどでシートに記述してからの変更のほうが容易ですかね? inputで入力する形になっていますがその部分へ渡す事も容易に行えるような気もするのですが・・・・
- okormazd
- ベストアンサー率50% (1224/2412)
#4です。 当てにならない内容をアップして煩わして申し訳ありませんでした。 もうちょっと考えます。
お礼
いえいえ ありがとうございます
- okormazd
- ベストアンサー率50% (1224/2412)
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)
こんばんは。 >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
お礼
いつも大変お世話になっています。 やはり最大までエリアとして判断されるのですね 今回のマクロで欲しい結果が得られていますので助かります。 色々教えていただいた内容をつなぎ合わせてこの様な状態です まだ完成していませんが、今回教えていただいた内容を付けていきたいと思います。
補足
今まで色々教えていただいた内容を貼り付けたりして現在の状況です 今回の内容を付け加えることでかなり完成までは近づくと思います あとは元のファイル名の一部分のみ変更して保存するのですが 現在頭の中に浮かんでいるのはシート名を取得してそれの一部変更を行うことが可能なのか ファイル名をセルに書き出して入力された横の列に関数を入れて計算した結果をファイル名にするほうが簡単なようにも思うのですが、今のやり方ですと別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/17070)
エクセルのCSVファイルは、データの有る最右列までの最矩形的な範囲を保存するのだと思います。 それより右列にデータがある場合、””も重要(どの列かを示す必要)なデータなので、質問のようなのは仕様ということで、我慢するほか無いのでは。 見難いというなら、CSVファイルは、視覚用のものではない。 エクセルに読み込まして、シートを見ればよい。 最右列の列(フィールド)データで終わるCSVデータを作っても 、以右フィールドを空白化してくれるかどうか確認・注意が必要になったりして、わずらわしい場合がありそう。 VBAででも使えば、質問のようなのは難しくないので、エクセルの保存に頼るからそうなるともいえる。 また質問のことを実現する必要性は何かな。好みの問題では。
お礼
いつもありがとうございます。 やはりそうでしたか、四角くなるのですね 実現する必要性といえば、元々のデータが設備に使用されているデータでして その一部のみを変更して使用したいと考えたからです。
- okormazd
- ベストアンサー率50% (1224/2412)
「不要な箇所」 というのが理解できません。 並びに整合性があるように「,」を入れてあるのでしょう。 それがいやなら、メモ帳で開いて、検索/置換で、不要と思われる「,」を削除して保存すればいいでしょう。 うまく削除できないなんて言うんじゃないよ。
お礼
ありがとうございます。 元々のファイルがカンマ区切りで見ると10行ぐらいまでは1列であり その後の行が13行目ぐらいまであるファイルなので その状態のようにするマクロがあれば、教えていただきたいのです。 うまく削除できないとは、言っていませんが。
お礼
いつもありがとうございます。 ご指導していただいたおかげで、なんとかがんばれそうな気がします また、何かありましたら質問していますので、見かけた時にはご指導よろしくお願いします。