

VBAで「,」⇒「.」へ置換後、タグ区切りでテキスト保存したい。
お世話になっております。
VBAで下記を行いたいと考えております。
全体の流れとしては、テキストを読み込み⇒エクセル上で編集⇒テキスト保存です。
そのエクセル上で編集⇒テキスト保存で悩んでおります。
編集した複数のシートを、個別にタブ区切りのテキストファイルに保存したいと考えております。
出力する際に、小数点の「,」⇒「.」に変換します。
※小数点を「,」として利用しています(海外対応)
編集するシートは全てのセルが文字列形式になっており、列も行も読み込むテキストによって可変なので、統一されているわけではありません。
最終行はA列ではなくB列でカウントします。
全てのセルに値が入っているわけではなく、空白もあります。
また、各セルには「0.00000」や「02.24」等の数値も入っており、数値形式にしてしまうと0が消えてしまうので、全てのセルを文字列形式として編集しています。
なお、小数点以下の桁数も可変です。
つまり、小数点が「,」となっているのを「.」になおし、タブ区切りのテキストファイルとして保存したいのです。
出力する際に、いったん別ブックに保存⇒不要なシートを削除⇒タブ区切りで保存はできたのですが、自分があまりVBAに詳しくないせいか、これでは文字列形式で保存されなかったため、シートを新規ブックにコピー⇒タグ区切りで保存に変更しました。
しかし、これではcells.replace ~で置換すると、「00,000」が「0」になってしまいました。
※「22,222」等は問題ないのですが……何故かは分かりませんでした。
ファイルとしては20000万行~25000行程度です。
列としては40列前後になります。
あまりVBAには詳しくないので、まとはずれな事を言っているかもしれません。
何か良い方法はありますでしょうか?
宜しくお願いいたします。
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
ありがとうございます。
ご指摘されている問題点については、元のデーターには変換していいものしか乗らないことを確認しました。
提示いただきましたVBAをそのまま使うことはできませんが、置換についてはとても参考になりました。
手を加えさせていただき、利用させて頂きたいと思います。
分かり難い説明の中、詳細なご説明ありがとうございました。
更なる精進をしていきたいと思います。
お忙しい中、ありがとうございました。
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のシート上に置く必要はないはずです。
この回答への補足
すいません、追記です。
最初にVBA経由でテキストファイルから読み込みを行っているのですが、
そのときに、下記を実行しております。
application.DecimalSeparator=","
application.ThousandsSeparator="."
application.UseSystemSeparator=False
よろしくお願いいたします。
回答、ありがとうございます。
情報が不足しており、申し訳ございません。
おっしゃられるように、ヨーロッパスタイルです。
桁区切り:.
小数点:,
Excelは2003です。
データ自体は常に日本にあり、編集時のみダウンロードし現地環境で編集します。
その後、データをアップロードし日本へもどします。
この際、上記小数点等が日本用にあっていないと、整合性チェックではじかれるので、アップロードされません。
現地の人はあまりPCに詳しくないため、現地設定のままで設定を変更せずに使わせたいという意向があるため、エクセルのVBAになりました。
>しかし、文字列になって存在していますと、これは厄介ですから、VBAで、処理しますが、もうExcelのシート上に置く必要はないはずです。
これは、いったんテキストに出力する途中、つまり一括か1行単位で変数に読み込んだ時にreplaceしていくという事でしょうか?
それとも、エクセルVBAとは別で別途VBAを準備する必要があるということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) A列にある値をB列・C列にVBAで切り出し 3 2022/04/09 19:20
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- Excel(エクセル) countif関数について質問 4 2022/06/14 12:11
- Excel(エクセル) エクセルでシート保護のかかり方の違いとセルの非保護の設定 3 2022/08/09 10:02
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
Excelについて質問です。 セル...
-
EXCELからCSVにすると余計なカ...
-
プログラミングの問題です。
-
マクロを使ってフォルダー内に...
-
C#で、テキストボックスの入力...
-
メモ帳からエクセルにセル区切...
-
CSVの定義
-
[.NET2.0] メニューに区切り線
-
ひとつの命令を複数行に記述
-
区切り文字をTABにしたい
-
データにカンマが入ったCSVデー...
-
Excel 住所の分割(文字数制限...
-
カンマ区切りの数字をCSVフ...
-
WORDで改ページすると時々グレ...
-
カンマ区切り
-
メールのcsv添付ファイルの種類...
-
perlでのSTDINについて
-
3桁ごと?4桁ごと?コンマの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
マクロを使ってフォルダー内に...
-
EXCELからCSVにすると余計なカ...
-
Excelについて質問です。 セル...
-
CSVの定義
-
[VBA][Excel]クリップボードか...
-
WORDで改ページすると時々グレ...
-
カンマ区切りの数字をCSVフ...
-
C#で、テキストボックスの入力...
-
データにカンマが入ったCSVデー...
-
VBAでtxtファイルを読み込む際...
-
カンマ区切り
-
VB2005のTextBoxでカン...
-
メモ帳からエクセルにセル区切...
-
JPY ¥1,500.00は日本円でお幾ら?
-
テキストファイルからReadLine...
-
カンマ区切りでないテキストをc...
-
エクセルにペーストする際にカ...
-
パス区切りの文字について
おすすめ情報