プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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) で、稼動します。
    • good
    • 0

こんにちは。



>この処理でフォルダの中のテキストファイルをとりこむことはできるのですが、

こちらには、こちらの考えの中での組み立てがありますから、こちらの書いたコードを無視して、そちらが作ったコードを持ち出されて、「データがおかしくなる」といわれても、私としては、お答えのしようがありません。単に、データが、不活性のままで、ワークシートに置いたところで、ワークシート内でデータをいじれば、活性化し適正な表示に変化します。そのコードでは、元の質問の書式の問題が解決するとは思えません。

もう一度言いますが、筋道を立てて、質問するべきポイントをよくまとめられたほうがよいかもしれません。
    • good
    • 0

こんにちは。



>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ファイルごとの区分けだったはずですから、そういうことを加味したほうがよいかもしれません。
    • good
    • 0
この回答へのお礼

本当にありがとうございます。


↓この処理でフォルダの中のテキストファイルをとりこむことはできるのですが、ここにデータの並べ替えなどの記述を加えるとおかしくなってしまいます。(ファイルが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

お礼日時:2008/08/20 13:56

こんにちは。



もう少し具体的に聞かないと分かりませんが、考えている方針は分かります。(「具体的」というのは、出力した後のステップのことです。)
それは、「書式」ではなく、見た目そのものを出力したいとおっしゃっているわけですね。
簡単な方法としては、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のレベルの技術が必要になることが多いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
CSVでなくてxlsで保存したいんでした。。

(1)テキストファイルを取り込む(←この時点では正常)
(2)並び替え等の処理(←並び替えが終わった所で120000161120004が1.2E+14に)
(3)xlsで保存
 (1)~(3)の繰り返し

テキストファイルを取り込む時に文字列にする処理を記述しています。
でも120000161120004は文字列になってくれません。違う列の00023は大丈夫なのに。。。これってどうしたらいいですか?

お礼日時:2008/08/20 11:20

う~ん?冗談で、質問なのでしょうか?



CSV形式は、ただのテキストです
書式は、保存できません

で、回避策って・・・
表示形式であって、書式ではないのは、見れば判ると思うけど・・・

CSV形式では、回避策は無いと思います
もう少し具体的に、何をどうしたいか?
記載ください
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!