[[20230601160242]] 『CSVでの保存の仕方』(たけちゃん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『CSVでの保存の仕方』(たけちゃん)

 いつも勉強させていただいております。
 CSVでの保存(VBAの記述の仕方)について教えてください。

 以下のようなテキストファイルがあります。

 コード
 120101474599
 120101481435
 120101489424

 これを「test1.csv」として保存た後、オープンすると
 表示は次のようになりますが、
 コード
 1.20101E+11
 1.20101E+11
 1.20101E+11
 それぞれのセルの値は正しく残っています。

 ここでこれを「test2.csv」として保存した後、オープンすると
 表示は次のようになり、
 コード
 1.20E+11
 1.20E+11
 1.20E+11
 セルの値は全て、120101000000 になってしまいます。

 このように値が変わってしまうことなく、元の値のままの「test2.csv」として保存するには、どのようにVBAで記述すればよいでしょうか?
 なお、例は1列だけですが、このような12桁以上の数値の列はどこの列とかは決まってなく、場合場合によって不定なので、この辺りも汎用性を持たせたコードにしたいです。
 達人の方々のお知恵をお貸しください。よろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


やってみてください。
https://excel-ubara.com/excelvba5/EXCEL120.html

(tkit) 2023/06/01(木) 16:30:58


 tkitさん

 ご返信有難うございます。
 教えていただいたリンクのサンプルコードを試してみましたが、値が変わってしまってダメでした。

(たけちゃん) 2023/06/01(木) 17:14:16


コードナンバーは数値じゃないんだから文字列で保存すればいいんでない。
(007は数値か?) 2023/06/01(木) 18:14:41

 せめてファイルの内容だけでも「Comma Separated Value」ではなく「Comma Separated Formula」で運用していくとか...
 (無茶な事言ってるのは自分でも分かってます。半分以上冗談のつもりです ^^;)

    Sub Test()
        [A1] = "123456789012345"
        [A2] = "=""123456789012345"""
        [A3] = "=""2023/6/1"""
        [A4] = "AAAAA"
        [A1:A4].Copy [B1:C1]
        ActiveWindow.DisplayFormulas = True
        Sheet1.SaveAs "test.csv", xlCSV
        ActiveWindow.DisplayFormulas = False
        ThisWorkbook.Saved = True
    End Sub

 ●保存された[test.csv]の内容

 123456789012345,123456789012345,123456789012345
 "=""123456789012345""","=""123456789012345""","=""123456789012345"""
 "=""2023/6/1""","=""2023/6/1""","=""2023/6/1"""
 AAAAA,AAAAA,AAAAA

 ●ダブルクリックで開いたらこんな感じ
 [___]|_______A_______|_______B_______|_______C_______|
 [  1]|       1.23E+14|       1.23E+14|       1.23E+14|
 [  2]|123456789012345|123456789012345|123456789012345|
 [  3]|2023/6/1       |2023/6/1       |2023/6/1       |
 [  4]|AAAAA          |AAAAA          |AAAAA          |

 [A2] ="123456789012345"
 [A3] ="2023/6/1"

 ●そのままcsv形式で保存したファイルの内容(指数化した数値が指数のまま保存される)
 1.23457E+14,1.23457E+14,1.23457E+14
 123456789012345,123456789012345,123456789012345
 2023/6/1,2023/6/1,2023/6/1
 AAAAA,AAAAA,AAAAA

 ●[Ctrl+Shift+`]で[数式の表示]状態にしてからcsv形式で保存したファイルの内容
 123456789012345,123456789012345,123456789012345
 "=""123456789012345""","=""123456789012345""","=""123456789012345"""
 "=""2023/6/1""","=""2023/6/1""","=""2023/6/1"""
 AAAAA,AAAAA,AAAAA

 当然、保存されたcsvファイルの中身は単純なcsvではなく、Excelで開く事だけを想定した、
 もはやExcel以外には使えない代物になってしまいます。
                                                    ...だったらcsvである必要が無いですね!
                                                       普通にxlsxとかでイイですやんね!
 こういうお話を伺うと、
 csvがデフォルトでExcelに関連付けられてるのって、結構罪深い事だなぁ思ってしまいます。

(白茶) 2023/06/01(木) 18:24:59


対策は、(007は数値か?)さんの通りかと。

私の場合、面倒ですが、Openステートメントで読み書きしてます。
http://officetanaka.net/excel/vba/file/file08c.htm

UTF-8なら、
http://officetanaka.net/excel/vba/file/file11.htm

貼り付けるExcelは文字列にしてますね。

(tkit) 2023/06/02(金) 08:16:26


白茶さん
色々とテストしていただき、有難うございます。
一筋縄ではいきませんね。

tkitさん
ご提案有難うございます。
一筋縄ではいかないのは分かったのですが、ご提案いただいた方法は結構面倒なので、以下で対応しようかと思っています。

●全ての列分の2行目を、数値かつ12桁以上かどうかチェックし、その列の書式設定を「数値」にしてCSVで保存する。

これであれば、値を変えることなくCSVファイルとして保存できるかなと。
ただし、2行目が5桁の数値で10行目が12桁の数値であるような場合は対象から抜け落ちてしまいますが、幸い扱っているデータの問題の数値列は、2行目以下全て同じ桁数なので、対応可能かなと思います。
決してスマートではありませんが、簡単なのでこんなのもアリかなって感じです。

他にいいアイデアやご意見等あれば教えてください。よろしくお願いいたします。

(たけちゃん) 2023/06/02(金) 09:56:11


数値だと桁に制限があります。
文字列は関係ありません。文字なので。
なので、文字列形式、としています。
(tkit) 2023/06/02(金) 10:56:41

 まあ、保存はいくらでも工夫の余地があるでしょう。

 先にも申しましたが、
 イチバンの問題はcsvがデフォルトでExcelに関連付けられてる事により、
 ダブルクリックで開けてしまう事。
 Workbooks.Openで開けてしまう事。
 何も考えずに開けたら、ゼロ始まりの数値文字列なんかはその時点で試合終了な事です。

 >これを「test1.csv」として保存た後、オープンすると
 >ここでこれを「test2.csv」として保存した後、オープンすると

 保存方法だけ熟慮したところで↑のせいで無駄になっちゃいます。

 >一筋縄ではいきませんね
 というのは、確かにそうなんですけども、
 先のレスに書かせてもらったテスト結果は
 「開く時は普通にオープンする」という制約下でのお話と解釈しての案です。

 前提として「VBAで」という事なのだし、
 だったら「如何に読み込むか」も考えないといけないですね。
                                                      ...という事も言いたかった訳です。
 >>結構罪深い事だな
 ってのはそういう事です。
 csvをExcelのファイル形式のひとつだと信じている事務員がウチの社内にもイッパイいます。^^;

(白茶) 2023/06/02(金) 11:21:06


tkitさん、白茶さん

ご意見・アドバイス有難うございます。

確かにオープン時に注意が必要ですもんね。
開けてみて前0がなくなっているのに気が付いて、テキストで再度読み込みっていう作業は今まで何回繰り返してきたか分かりません。

ご意見参考にしながらコード書いてみます。

(たけちゃん) 2023/06/02(金) 12:17:23


なるほどね。
知っている人と知らない人の温度差ですか?

知っている人は、CSVファイルの中身を確認するのに
メモ帳やらテキストエディタ等で開いて確認しますが
知らない人は、Wクリックしてエクセルで開いて確認するですか…。
白茶さんの書き込みもなんのこっちゃ状態でした。

質問者が本当に解っているのか少し疑問ですが。
最初話が通じていなかったので。
これで終わりですね、では。
(007は数値か?) 2023/06/02(金) 14:32:23


>最初話が通じていなかったので
スルーしていただけ。気が悪かった? これで終わり。
(たけちゃん) 2023/06/02(金) 14:55:25

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.