- ベストアンサー
VBAで「,」⇒「.」へ置換後、タグ区切りでテキスト保存したい。
- VBAを使用して、「,」を「.」に置換し、タグ区切りのテキストファイルで保存したいです。
- VBAを使用して、テキストを読み込んでエクセル上で編集し、テキストファイルとして保存したいです。
- エクセルのシートをタブ区切りのテキストファイルに保存する際に、小数点の「,」を「.」に置換したいです。VBAを使って実現できる方法を教えてください。
- みんなの回答 (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
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
確認事項をしなければなりません。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のシート上に置く必要はないはずです。
お礼
回答、ありがとうございます。 情報が不足しており、申し訳ございません。 おっしゃられるように、ヨーロッパスタイルです。 桁区切り:. 小数点:, Excelは2003です。 データ自体は常に日本にあり、編集時のみダウンロードし現地環境で編集します。 その後、データをアップロードし日本へもどします。 この際、上記小数点等が日本用にあっていないと、整合性チェックではじかれるので、アップロードされません。 現地の人はあまりPCに詳しくないため、現地設定のままで設定を変更せずに使わせたいという意向があるため、エクセルのVBAになりました。 >しかし、文字列になって存在していますと、これは厄介ですから、VBAで、処理しますが、もうExcelのシート上に置く必要はないはずです。 これは、いったんテキストに出力する途中、つまり一括か1行単位で変数に読み込んだ時にreplaceしていくという事でしょうか? それとも、エクセルVBAとは別で別途VBAを準備する必要があるということでしょうか?
補足
すいません、追記です。 最初にVBA経由でテキストファイルから読み込みを行っているのですが、 そのときに、下記を実行しております。 application.DecimalSeparator="," application.ThousandsSeparator="." application.UseSystemSeparator=False よろしくお願いいたします。
お礼
ありがとうございます。 ご指摘されている問題点については、元のデーターには変換していいものしか乗らないことを確認しました。 提示いただきましたVBAをそのまま使うことはできませんが、置換についてはとても参考になりました。 手を加えさせていただき、利用させて頂きたいと思います。 分かり難い説明の中、詳細なご説明ありがとうございました。 更なる精進をしていきたいと思います。 お忙しい中、ありがとうございました。