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

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

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

Q&A

解決済

2回答

2773閲覧

Excel csvファイル取込時、文字列が日付に自動変換されるのを防ぐ方法

D0NKAMA

総合スコア28

0グッド

1クリップ

投稿2022/01/14 03:10

前提・実現したいこと

VBAで作成したcsvファイルを別Excelに取込む際、すべてのデータを文字列として表示したい。

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

文字列データが日付形式で表示される。

試したこと

・データをで囲む
例)"01-01" → 1月1日

・各データの先頭にをつける
例)'01-01 → '01-01 (まで表示されてしまう)
を置換&削除すると日付で表示される

・取込む際に各列の表示形式を「文字列」に設定すると解決するが、取込む度に設定するのは面倒なので不採用

csv出力のソースコード

VBA

1Sub CSV出力_Click() 2 Dim filePath As String ' 保存先のパス 3 Dim firstRow As Long ' 開始行 4 Dim firstCol As Long ' 開始列 5 Dim lastRow As Long ' 終了行 6 Dim lastCol As Long ' 終了列6 7 Dim i As Long ' For文用 8 Dim j As Long ' For文用 9 Dim line As String ' 1行分のデータ 10 11 ' 保存先のパスを取得 12 filePath = ActiveWorkbook.Path & Format(Now(), "yymmdd") & ".csv" 13 14 ' 作成するファイルを開く 15 Open filePath For Output As #1 16 17 ' CSV作成 18 With Sheets("csv出力シート") 19 '「データ」シートの開始行を取得 20 firstRow = .ListObjects(1).Range.Cells(1, 1).row 21 ' 〃 開始列を取得 22 firstCol = .ListObjects(1).Range.Cells(1, 1).Column 23 ' 〃 終了行を取得 24 lastRow = .Cells(Rows.Count, 1).End(xlUp).row 25 ' 〃 終了列を取得 26 lastCol = .Cells(6, Columns.Count).End(xlToLeft).Column 27 28 For i = firstRow To lastRow 29 line = "" 30 ' 非表示と1列目が空白のデータは出力しない 31 If .Rows(i).Hidden = False And .Range(.Cells(i, 1).Address).value <> "" Then 32 For j = firstCol To lastCol 33 line = line & """" & .Range(.Cells(i, j).Address).value & """" & "," 34 Next 35 Print #1, line 36 End If 37 Next 38 End With 39 40 ' 作成するファイルを閉じる 41 Close #1 42 43 MsgBox "本マクロを起動したフォルダに、CSVファイルを作成しました。", vbInformation, "出力完了" 44 45End Sub

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

csvファイルを右クリック→プログラムから開く→Excel
でcsvファイルを取込むのでcsv出力する際のVBAの修正で解決したいのですが、方法はございますでしょうか。

Win 10
Excel 2019

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/01/14 03:30

VBA は触ったこともないので大ハズレかもしれませんが、schema.ini は試してみましたか? JET / ACE プロバイダはデフォルトで最初の 8 行のデータをスキャンして各列のデータ型を推測しますが、その際、予期しない型に推測されてしまうことがあるのですが、それと同様なことが起こっていて「文字列データが日付形式で表示される」のかもしれません。 VB.NET + ADO.NET の話ですが、schema.ini というファイルを作り、それに文字コードや各列の型を指定して CSV ファイルと同じディレクトリに配置することにより、Shift_JIS 以外の文字コードへの対応や、上に書いた予期しない型への変換が避けられます。
D0NKAMA

2022/01/14 04:46

schema.ini の存在を知らなかったので調べて試してみましたがなにも変化がありませんでした。 [220114.csv] ColNameHeader=True Format=CSVDelimited Col1=番号 Text With 10 Col2=氏名 Text With 10 Col3=市町村 Text With 10 上記をメモ帳で作成→csvファイルと同じフォルダ内に保存→csvファイルをExcelで開く としました。間違っている個所がありますでしょうか?
guest

回答2

0

ベストアンサー

セルの見た目が01-01となるようにしたいということであれば、該当セルの値を
="01-01"
とすればCSV開いた際に文字列として読み込まれます。
データをダブルクォーテーションで囲むのはできるようなので、先頭に=足すだけ、お試しください。

なお、数式バーには、そのまま「="01-01"」と表示されますので悪しからず…

投稿2022/01/18 05:51

Oaroana

総合スコア57

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

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

D0NKAMA

2022/01/18 09:50

まさに求めていた解決方法です! 印刷する際も正しく表示されました。確かに数式バーには「="01-01"」と表示されますが全く問題ありません! ためになる知識を教えていただきありがとうございました。
guest

0

変換は読み込む時に起こるので、書く側での対処は不可能でしょう。

読み込む際になんとかします。
案1:txtファイルとして読み込んで、「データ」→「区切り位置」で分割する時に文字列と指定する
案2:「データ」→「テキストまたはCSVから」でテーブルとして読み込む。その際に「データ型を検出しない」を指定。その後必要に応じて「テーブルデザイン」→「範囲に変換」する
案3:VBAで、読み込んで分割して順番にセルに突っ込むようなコードを書く

投稿2022/01/14 15:50

otn

総合スコア84423

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問