質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

7756閲覧

VBA エクセルCSVデータが勝手に変わる事の対策法

r_o_234

総合スコア15

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/06/16 04:38

前提・実現したいこと

いつもありがとうございます。
VBAで転換マクロツールを作っています。
下記のコードを実行したところ、67-69行目のCSV保存モジュールで、エクセルCSVデータが勝手に変わって保存されてしまいます。

実行前 '2020/04/01(文字列)
実行後 2020/04/01(日付) 

これはエクセルCSVの仕様らしく、試したことの欄にあるように色々と回避しようと試行錯誤した結果、67-69行目のCSV保存モジュールが原因である事を突き止めました。
直前の66行目でEnd Subして、手入力からCSV保存すれば正常に出力されるのですが、
VBAのCSV保存の記述を使ってこのエラーを回避する方法をご存じありませんか。

イメージ説明

イメージ説明

発生している問題・エラーメッセージ

'2020/04/01(文字列)→が、csv保存して出力された後に2020/04/01(日付)と変更されてしまう。

該当のソースコード

Public Sub Converter() '変数定義 Dim ftype As Variant Dim fpath As Variant Dim str As Variant Dim Target As Workbook '読込モジュール ftype = "Microsoft Excelブック,*.xls?" '選択できるファイルはエクセルファイルのみ fpath = Application.GetOpenFilename(ftype, , "") 'ファイル参照ダイアログの表示,ftype=fpath Debug.Print fpath If fpath = False Then Exit Sub 'Endで強制終了はよろしくない。ダイアログでキャンセルボタンが押された場合は処理を終了します。 End If Set Target = Workbooks.Open(fpath) '抽出モジュール Target.Sheets(1).Range("G2").Copy ThisWorkbook.Sheets(2).Range("C2").PasteSpecial xlPasteValues Target.Sheets(1).Range("H2").Copy ThisWorkbook.Sheets(2).Range("C3").PasteSpecial xlPasteValues Target.Close '※開いたブックは閉じておく Set Target = Nothing '念のため、変数開放 Worksheets("Sheet2").Range("C2").Value = "1日" 'に日と標準を入れる Range("C2").NumberFormatLocal = "G/標準" Worksheets("Sheet2").Range("C3").Value = "2日" 'に日と標準を入れる Range("C3").NumberFormatLocal = "G/標準" Dim 日付() As Variant '日付合成モジュール Dim 行数 As Long Dim i As Long 行数 = Cells(Rows.Count, 1).End(xlUp).Row ReDim 日付(行数 - 2) Columns(4).Insert For i = 0 To 行数 - 2 日付(i) = DateValue(Range("A" & i + 2) & Range("B" & i + 2) & Range("C" & i + 2)) Range("D" & i + 2).Value = 日付(i) Next i Columns("A:C").Delete Range("A1").Value = "#勤務日※" Columns(1).AutoFit Dim MyDate As Date MyDate = Range("A2") '値は2020/04/01" Range("A2") = "'" & Format(MyDate, "yyyy/MM/dd") Range("A2").NumberFormatLocal = "@" Dim MyDate1 As Date MyDate1 = Range("A3") '値は2020/04/01" Range("A3") = "'" & Format(MyDate1, "yyyy/MM/dd") Range("A3").NumberFormatLocal = "@" Worksheets("Sheet2").Range("B2").Value = "12352" 'に日と標準を入れる Worksheets("Sheet2").Range("B3").Value = "12352" 'に日と標準を入れる 'Range("A2:B3").NumberFormatLocal = "G/標準" 'ここにA2:B3でを処理する記述を書く. Dim sh As Worksheet 'csv保存モジュール Set sh = Worksheets(2) sh.SaveAs Filename:="C:\Work\出力先\test.csv", FileFormat:=xlCSV End Sub

試したこと

csvに保存する際に、2020/04/01といった日付っぽいデータは、エクセルの仕様で勝手に日付形式に変換される事がある
(エクセルCSVデータが勝手に変わるのを防ぐ 文字列読み込み法)
(https://www.excelspeedup.com/csvmojiretsu/)

ので、対策として以前教わりましたように2020/04/01に"'アポストロフィをつけて書式設定を文字列にする"という手を取らせて頂きました。
この時点(67-69行目のDim sh As Worksheet 'csv"保存モジュールの前)でEnd Subしてから手入力でCSV保存すると、'2020/04/01(文字列)という風に正常に表示されます。

ですが、67-69行目のcsv保存モジュールを実行して"C:\Work\出力先\test.csv"に保存すると、"2020/04/01(日付)"というようにエクエルの仕様?で勝手に変更されてしまいました。
"'アポストロフィをつけて書式設定を文字列にする"としても日付に変更されてしまうので、回避方法がわかりません。

補足情報(FW/ツールのバージョンなど)

Excle2016,Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

VBAのCSV保存の記述を使ってこのエラーを回避する方法をご存じありませんか。

エラーではなくEXCELの仕様なので、自動補完したくないのなら、自前でテキストファイル出力処理を作るしかないのでは?

投稿2020/06/16 04:54

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

r_o_234

2020/06/16 06:06

DreamTheaterさん ご回答ありがとうございます。 自動補完を避けるために、日付→yyyymmddに変換するコードを組むことにしました。ご協力ありがとうございました。
guest

0

ベストアンサー

CSVファイルはあくまでも単なるテキストファイルですから、Excel以外のエディタやメモ帳などで開いてみてください。
おそらく期待通りに保存されているはずです。
CSVファイルをExcelで開くときに期待する表現にならないのはまた別の話なので、別途質問を立ちあげるとよいでしょう。

投稿2020/06/16 04:46

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

r_o_234

2020/06/16 06:03

ttyp03さん いつもご回答誠にありがとうございます。 助かりました。 結論から申し上げますと、方針として日付→yyyymmddに変換するコードを試す方針にしました。 メモ帳でcsvを開いてみたのですが、 2020/04/01,12352,,,,,,,,,,,,,,,,,,,,,,, 2020/04/02,12352,,,,,,,,,,,,,,,,,,,,,,, というように表示されます。シングルクォーテーションが無視されたり、CSVファイルをExcelで開くときに期待する表現にならない(エクセルが気を利かせて仕様として日付形式で読み込む)のだなとわかってきたので、日付→yyyymmddに変換するコードを挟むことで外部のソフトウェアに読み込ませることにしました。 ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問