• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAで「,」⇒「.」へ置換後、タグ区切りでテキスト保存したい。)

VBAで「,」⇒「.」へ置換後、タグ区切りでテキスト保存したい。

このQ&Aのポイント
  • VBAを使用して、「,」を「.」に置換し、タグ区切りのテキストファイルで保存したいです。
  • VBAを使用して、テキストを読み込んでエクセル上で編集し、テキストファイルとして保存したいです。
  • エクセルのシートをタブ区切りのテキストファイルに保存する際に、小数点の「,」を「.」に置換したいです。VBAを使って実現できる方法を教えてください。

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

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

>最初にVBA経由でテキストファイルから読み込みを行っているのですが、 >そのときに、下記を実行しております。 >application.DecimalSeparator=","   中略 ということは、インポートするときに、VBA経由で処理して読み込んでいるわけですね。 本来なら、出力の際に、逆にして挙げればできるはずなのですが……ただし、オプションの設定をマクロに換えても、Excelはキャッシュを使っていますから、そのまま保存すると、うまくいっていないような気がします。また、ファイル保存する方法には、少しコツが必要です。 以上は想像の範囲ですから、とりあえず、現状案からリクエストの内容を表現してみました。 (A)>いったんテキストに出力する途中、つまり一括か1行単位で変数に読み込んだ時にreplaceしていくという事でしょうか? (B)>エクセルVBAとは別で別途VBAを準備する必要があるということでしょうか? (この意味はテキスト・ファイルを選んで、数字を探し出して、フォーマットを替えるというプログラムです。こちらのほうが上です。) 結局、想像するのに、すでに、Textファイルとして存在するものと、出力時に加工する場合と、両方があると想像するわけです。汎用性があるなら、(B)ではないのか、と思った次第なのです。今回は、Aの形式のものです。 ただ、問題点があります。 数字と数値は違うということです。例えば、12.12.12 は、本来、置換してはならないはずです。12.345,01 という数値が、置換させて良いものですが、以下は区分けはされていません。文章の中にある、コンマとドットは置換させてしまいます。それを対処する方法はありますが、スピードが遅くなります。 '// 標準モジュール Sub ExportTSVFile() Dim fn As Variant Dim rng As Range Dim TextLine As String Dim fNum As Integer   fn = Application.GetSaveAsFilename("", "テキスト ファイル (*.txt), *.txt")   If VarType(fn) = vbBoolean Then Exit Sub   fNum = FreeFile()   Open fn For Output As #fNum   Set rng = ActiveSheet.UsedRange   For i = 1 To rng.Rows.Count   TextLine = ConvertDecimal(rng.Rows(i))   Print #fNum, TextLine   Next   Close #fNum End Sub Private Function ConvertDecimal(arg As Variant) As String  Const SEP As String = vbTab  Dim ret As String  Dim buf As String  If TypeName(arg) = "Range" Then   For Each c In arg.Cells     If c.Value Like "*#[,.]*" Then    buf = Replace(c.Text, ",", "\", , , 1)    buf = Replace(buf, ".", ",", , , 1)    buf = Replace(buf, "\", ".", , , 1)     Else    buf = c.Text   End If   If ret = "" Then   ret = buf    Else   ret = ret & SEP & buf   End If   Next  ElseIf VarType(arg) = vbArray Then   For Each v In arg   If arg Like "*#[,.]*" Then   buf = Replace(v, ",", "\", , , 1)   buf = Replace(buf, ".", ",", , , 1)   buf = Replace(buf, "\", ".", , , 1)   Else    buf = v   End If   If ret = "" Then    ret = buf    Else     ret = ret & SEP & buf   End If   Next  End If  ConvertDecimal = ret End Function

zamzam777
質問者

お礼

ありがとうございます。 ご指摘されている問題点については、元のデーターには変換していいものしか乗らないことを確認しました。 提示いただきましたVBAをそのまま使うことはできませんが、置換についてはとても参考になりました。 手を加えさせていただき、利用させて頂きたいと思います。 分かり難い説明の中、詳細なご説明ありがとうございました。 更なる精進をしていきたいと思います。 お忙しい中、ありがとうございました。

その他の回答 (1)

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

確認事項をしなければなりません。Excelのバージョンが書かれていませんので、この処理方法は分かれるかもしれません。 ご質問は、VBA自体の質問なら、VBAのコードを示していただきいたのですが、問題は、タブ切りファイルの内容です。ご質問者さんの思惑と合うか合わないか、分からないのでは、話になりません。 「海外対応」では分かりません。以下のリストをみてください。 私が読み違えているかもしれません。フランススタイルか、ヨーロピアンスタイルというはずです。 大事なことは、以下のようなどのスタイルになるのではないか、ということです。 English    Europe    France    1.23     1,23    1,23 4,000   4.000     4 000 5,000,000 5.000.000   5 000 000  English ;comma for thousands, dot for decimal France ;space for thousands, comma for decimal Europe ;dot for thousands, comma for decimal ヨーロッパスタイルは、カンマ(,)とドット(.)の意味が逆になり、千桁区切りがドットで、小数点区切りは、カンマになります。フレンチスタイルは、桁の区切りは、スペースが入り、デシマル(小数点区切り)はカンマになります。 これが正しければ、Excel上は、文字列ではなく数字で扱わなくてはなりませんが、Excel2003?以上でしたら、オプションにインターナショナル・モードがあるはずですから、 数値の表示方法で、 システムの桁区切りを使用する のチェックを外して、 小数点の記号 と桁区切り記号を 任意のものにすればよいです。 しかし、文字列になって存在していますと、これは厄介ですから、VBAで、処理しますが、もうExcelのシート上に置く必要はないはずです。

zamzam777
質問者

お礼

回答、ありがとうございます。 情報が不足しており、申し訳ございません。 おっしゃられるように、ヨーロッパスタイルです。 桁区切り:. 小数点:, Excelは2003です。 データ自体は常に日本にあり、編集時のみダウンロードし現地環境で編集します。 その後、データをアップロードし日本へもどします。 この際、上記小数点等が日本用にあっていないと、整合性チェックではじかれるので、アップロードされません。 現地の人はあまりPCに詳しくないため、現地設定のままで設定を変更せずに使わせたいという意向があるため、エクセルのVBAになりました。 >しかし、文字列になって存在していますと、これは厄介ですから、VBAで、処理しますが、もうExcelのシート上に置く必要はないはずです。 これは、いったんテキストに出力する途中、つまり一括か1行単位で変数に読み込んだ時にreplaceしていくという事でしょうか? それとも、エクセルVBAとは別で別途VBAを準備する必要があるということでしょうか?

zamzam777
質問者

補足

すいません、追記です。 最初にVBA経由でテキストファイルから読み込みを行っているのですが、 そのときに、下記を実行しております。 application.DecimalSeparator="," application.ThousandsSeparator="." application.UseSystemSeparator=False よろしくお願いいたします。