• 締切済み

(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