• 締切済み

(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 **************************************************************** ご指導お願いします。

みんなの回答

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

追伸: Application.FileSearch は、共有検索プログラムですから、OS (または、Outlookか、OSの依存性)のバージョンによって誤動作があります。OS とExcelのVersion によって、コードの内容は変えなくてはならないかもしれません。 .NewSearch メソッドは入れたほうがよいです。 ActiveWorkbook.SaveAs FileFormat:=xlCSV で保存とするからには、インポートしたテキストファイルの加工があるはずです。その内容が出てきていません。 私の書いたCsvTextImportに関しては、 FileName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv") を抜いて、Sub CsvTextImport(FileName As Variant) で、稼動します。

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

こんにちは。 >この処理でフォルダの中のテキストファイルをとりこむことはできるのですが、 こちらには、こちらの考えの中での組み立てがありますから、こちらの書いたコードを無視して、そちらが作ったコードを持ち出されて、「データがおかしくなる」といわれても、私としては、お答えのしようがありません。単に、データが、不活性のままで、ワークシートに置いたところで、ワークシート内でデータをいじれば、活性化し適正な表示に変化します。そのコードでは、元の質問の書式の問題が解決するとは思えません。 もう一度言いますが、筋道を立てて、質問するべきポイントをよくまとめられたほうがよいかもしれません。

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

こんにちは。 >CSVでなくてxlsで保存したいんでした。。 そうすると、ご質問のコード自体が違っていますね。 だいぶ、ご質問が混乱されているようですが、少し、ポイントをまとめられたほうがよいかもしれませんね。 >(1)テキストファイルを取り込む(←この時点では正常) そうすると、前のご質問の延長ですね。前のご質問と合わせてみないといけないようですが、前のものも、レスの内容からしても、解決していないようですね。 とりあえず、今回のご質問から、プロシージャを考えていかなくてはなりませんね。前のご質問は、次のステップだと思います。 しかし、 ActiveWorkbook.SaveAs FileName:="C:\test.csv", FileFormat:=xlCSV は、いずれにしても違いますね。それは、5シートをCSVで保存できるわけではありません。それに関しては、xls 保存に書き換えればよいと思いますが、5シートを溜めるまで置いたほうが、VBAの場合は、ロスが少ないです。 それと、区切り文字が、コンマ(,)ではなくて、シャープ(#)なのですか?それは、CSV ではありませんね。 もしかしたら、#2で述べたように、見かけ、CSV 様のファイルというのは、単純な、テキスト・インポートではないことがあります。今までの経験で、見えない区切り文字が入っていたりしますから、やはり、ツールを探したほうがよいかもしれません。VBAでは、現物がないと出来ないことが多いのです。ツールの場合は、その見えない区切り文字を探してくれるものがあります。 以下では、区切り文字は、「コンマ(,)」になっています。必要に応じて書き換えてください。 以下では、現在は、すべての数値に対して、「接頭辞(')」が付くようになっています。とりあえず、試してみてください。 標準モジュール '-------------------------------- Sub CsvTextImport()   Dim myArray() As String 'XL2000以上   Dim FileName As String   Dim lngCount As Long   Dim textLine As String   Dim FNum As Integer   'デリミタ(区切り文字)   Const nDELIM As String = ","   FileName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")   '  FileName = Application.GetOpenFilename("テキストファイル(*.txt),*.txt")   If FileName = "False" Then Exit Sub   FNum = FreeFile()   Open FileName For Input As #FNum   Application.ScreenUpdating = False   Do While Not EOF(FNum)    Line Input #FNum, textLine    lngCount = lngCount + 1    myArray = Split(textLine, nDELIM)    AddPrefix myArray    Cells(lngCount, 1).Resize(, UBound(myArray) + 1).Value = myArray   Loop   Close #FNum   Application.ScreenUpdating = True End Sub Private Function AddPrefix(ByRef Ar As Variant) '数字に接頭辞をつける Dim i As Long  For i = LBound(Ar) To UBound(Ar)  If IsNumeric(Ar(i)) Then   Ar(i) = "'" & Ar(i)  End If  Next i End Function >(3)xlsで保存  に関しては、ファイル名の基準とかあるでしょうし、前回の様子では、5ファイルごとの区分けだったはずですから、そういうことを加味したほうがよいかもしれません。

pokekuka
質問者

お礼

本当にありがとうございます。 ↓この処理でフォルダの中のテキストファイルをとりこむことはできるのですが、ここにデータの並べ替えなどの記述を加えるとおかしくなってしまいます。(ファイルが10個あるのに3個を繰り返す) 記述を加える場所がおかしいのでしょうか? Sub test() With Application.FileSearch .LookIn = "C:\aaaa" .Filename = "*.txt" If .Execute > 0 Then For i = 1 To .FoundFiles.Count Workbooks.OpenText Filename:=.FoundFiles(i), Origin:=932, StartRow:=1 _ , DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False, _ Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3 _ , 1), Array(4, 1)), TrailingMinusNumbers:=True ActiveWorkbook.SaveAs FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close False Next i MsgBox "全て終わりました。" Else MsgBox "このフォルダに.txtファイルはありません。" End If End With End Sub

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

こんにちは。 もう少し具体的に聞かないと分かりませんが、考えている方針は分かります。(「具体的」というのは、出力した後のステップのことです。) それは、「書式」ではなく、見た目そのものを出力したいとおっしゃっているわけですね。 簡単な方法としては、prn 出力した後に、スペースを、カンマ(,)に変えればよいのですが、ただ、スペースの長さが固定幅でないと、横の位置関係がめちゃくちゃになってしまいます。 もともと、CSV は、Excelのテキスト型の入出力ファイルではなく、原始データベースのデータの、ファイル形式ですから、そういった出力は、非常に変則的なものになります。 >'テキスト文字列に変更します。 >rng.Value = "'" & rng.Text  '←Value値に入った時点で、型のキャスティングされてしまいます。 ということなら、そのコードは違います。 論理的な考え方は正しいのですが、受ける側が、rng.Value ではなく、CSV の場合は、直接、出力用のテキストバッファでないといけません。したがって、標準的な出力ではありません。 >ActiveWorkbook.SaveAs FileName:="C:\test.csv", FileFormat:=xlCSV おそらく、これでは無理だと思います。 実際の問題として、そのような変則的な出力ではなく、Excel上なら、Excelに再インポートするときには、書式情報を付け加えるようにしてください。 ただし、エクスポートし、別のアプリケーションに使用する場合に、CSV 様のものは、いくつかのアプリケーション(半分近く)は、Unix 形式のファイルを要求されます。その場合、どうやっても、標準的な出力では無理です。 VBAの技術力に不足を感じているなら、あまり、この件を深追いしないで、別の加工するソフトウェアを探したほうがよいかもしれません(Excelからの出力は別)。この種のものは、VBAというよりも、VBのレベルの技術が必要になることが多いです。

pokekuka
質問者

お礼

ありがとうございます。 CSVでなくてxlsで保存したいんでした。。 (1)テキストファイルを取り込む(←この時点では正常) (2)並び替え等の処理(←並び替えが終わった所で120000161120004が1.2E+14に) (3)xlsで保存  (1)~(3)の繰り返し テキストファイルを取り込む時に文字列にする処理を記述しています。 でも120000161120004は文字列になってくれません。違う列の00023は大丈夫なのに。。。これってどうしたらいいですか?

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

う~ん?冗談で、質問なのでしょうか? CSV形式は、ただのテキストです 書式は、保存できません で、回避策って・・・ 表示形式であって、書式ではないのは、見れば判ると思うけど・・・ CSV形式では、回避策は無いと思います もう少し具体的に、何をどうしたいか? 記載ください

関連するQ&A

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

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

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

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

  • エクセル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 一応これで保存できるのですが、自動記録でやったためファイルの名前が出てしまいました。 この部分をわたし以外の誰でも任意の名前をつけ、任意のフォルダーに保存できるように書き換えたいのです。 どのように記述すれば良いかお教えください。お願いします。

  • 「変更を保存しますか?」と聞かれたくない。

    現在のファイルと同名のCSVファイルを作成したいのですが、 Sub CSV作成() Dim MyFileName As String MyFileName = ActiveWorkbook.FullName MyFileName = Left(MyFileName, Len(MyFileName) - 5) Workbooks.Add ActiveWorkbook.SaveAs Filename:=MyFileName & ".csv", FileFormat:=xlCSV ActiveWorkbook.Save ActiveWindow.Close End Sub をしたときに、「変更を保存しますか?」と聞かれます。 保存しますか?と聞かれても、無条件で保存したいし、そもそも変更してないのに、 なんで聞かれてるのかわかりません。 保存する方法を教えてください。ご回答よろしくお願いします。

  • 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 VBAでカンマ区切りテキストファイルに変換する方法

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

  • エクセル マクロの記述(フォルダーの移動、削除)

    現在開いているエクセルのファイルにマクロを記述し、 1 「処理済」というフォルダーに、開いているエクセルファイルを移動して、同じ名前でエクセルを保存する。 2 「CSV」というフォルダーに、開いているエクセルファイルをCSVファイルに変換して名前を「処理.csv」とし保存する。 3 現在開いているエクセルファイルは削除する。 以上の三つの処理をさせようと、以下のようにしましたが、1,2の処理は出来ましたが、3の開いているエクセルファイルが残ってしまいます。 以上三つの処理が一度に出来るマクロの記述を教えて下さい。 よろしくお願いします Sub マクロ() ActiveWorkbook.SaveAs Filename:="C:\処理済\" & ActiveWorkbook.Name ChDir"C:\CSV" ActiveWorkbook.SaveAs Filename:= "C:\CSV\処理.csv" _ , FileFormat:=xlCSV, CreateBackup:=False Application.DisplayAlerts = False If Workbooks.Count = 1 Then Application.Quit Else ActiveWorkbook.Close End If Application.DisplayAlerts = False End Sub

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

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

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

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

  • 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

専門家に質問してみよう