dポイントプレゼントキャンペーン実施中!

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

お世話になっております。
VBAで下記を行いたいと考えております。

全体の流れとしては、テキストを読み込み⇒エクセル上で編集⇒テキスト保存です。
そのエクセル上で編集⇒テキスト保存で悩んでおります。


編集した複数のシートを、個別にタブ区切りのテキストファイルに保存したいと考えております。
出力する際に、小数点の「,」⇒「.」に変換します。
※小数点を「,」として利用しています(海外対応)

編集するシートは全てのセルが文字列形式になっており、列も行も読み込むテキストによって可変なので、統一されているわけではありません。
最終行はA列ではなくB列でカウントします。
全てのセルに値が入っているわけではなく、空白もあります。
また、各セルには「0.00000」や「02.24」等の数値も入っており、数値形式にしてしまうと0が消えてしまうので、全てのセルを文字列形式として編集しています。
なお、小数点以下の桁数も可変です。

つまり、小数点が「,」となっているのを「.」になおし、タブ区切りのテキストファイルとして保存したいのです。


出力する際に、いったん別ブックに保存⇒不要なシートを削除⇒タブ区切りで保存はできたのですが、自分があまりVBAに詳しくないせいか、これでは文字列形式で保存されなかったため、シートを新規ブックにコピー⇒タグ区切りで保存に変更しました。
しかし、これではcells.replace ~で置換すると、「00,000」が「0」になってしまいました。
※「22,222」等は問題ないのですが……何故かは分かりませんでした。


ファイルとしては20000万行~25000行程度です。
列としては40列前後になります。

あまりVBAには詳しくないので、まとはずれな事を言っているかもしれません。
何か良い方法はありますでしょうか?
宜しくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます。

ご指摘されている問題点については、元のデーターには変換していいものしか乗らないことを確認しました。

提示いただきましたVBAをそのまま使うことはできませんが、置換についてはとても参考になりました。
手を加えさせていただき、利用させて頂きたいと思います。

分かり難い説明の中、詳細なご説明ありがとうございました。
更なる精進をしていきたいと思います。

お忙しい中、ありがとうございました。

お礼日時:2010/10/11 17:12

確認事項をしなければなりません。

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のシート上に置く必要はないはずです。

この回答への補足

すいません、追記です。

最初にVBA経由でテキストファイルから読み込みを行っているのですが、
そのときに、下記を実行しております。

application.DecimalSeparator=","
application.ThousandsSeparator="."
application.UseSystemSeparator=False

よろしくお願いいたします。

補足日時:2010/10/11 11:23
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
情報が不足しており、申し訳ございません。

おっしゃられるように、ヨーロッパスタイルです。

桁区切り:.
小数点:,

Excelは2003です。


データ自体は常に日本にあり、編集時のみダウンロードし現地環境で編集します。
その後、データをアップロードし日本へもどします。
この際、上記小数点等が日本用にあっていないと、整合性チェックではじかれるので、アップロードされません。

現地の人はあまりPCに詳しくないため、現地設定のままで設定を変更せずに使わせたいという意向があるため、エクセルのVBAになりました。

>しかし、文字列になって存在していますと、これは厄介ですから、VBAで、処理しますが、もうExcelのシート上に置く必要はないはずです。
これは、いったんテキストに出力する途中、つまり一括か1行単位で変数に読み込んだ時にreplaceしていくという事でしょうか?

それとも、エクセルVBAとは別で別途VBAを準備する必要があるということでしょうか?

お礼日時:2010/10/11 11:08

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