[[20201117104449]] 『エクセルからCSV出力で時刻の取り扱い』(tora) ページの最後に飛ぶ

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

 

『エクセルからCSV出力で時刻の取り扱い』(tora)

 現在、VBAでCSVファイルを作っています。
 出力するシートには、日付(シリアル値)、時刻、日付付き時刻(日付+時刻としている)があります。
 サンプルデータ
 	[A]	[B]		[C]		[D]
 [1]	文字列	日付		時刻		日付+時刻
 [2]	AA1	2018/5/1	10:00:00	2018/5/1 10:00
 [3]	AA2	2018/5/2	11:00:00	2018/5/2 11:00
 [4]	AA3	2018/5/3	12:00:00	2018/5/3 12:00
 [5]	AA4	2018/5/4	13:00:00	2018/5/4 13:00

 このデータを下記のコードでCSVファイルを作りました。
  
Sub CSV_出力()

    Dim csvName As String   '保存するCSVファイルの名前
    Dim myPath As String    'このブックのパス
    Dim ws As Worksheet     'CSV出力するシート
    Dim lastRow As Long     '出力するデータの最終行
    Dim lastCol As Long     '出力するデータの最終列
    Dim i As Long
    Dim n As Long

    myPath = ThisWorkbook.Path & "\"
    Set ws = Sheets("CSV出力")
    lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
    lastCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column
    csvName = "CSV出力.csv"

    Open myPath & csvName For Output As #1
    For i = 1 To lastRow
        For n = 1 To lastCol
            If n <> lastCol Then
                Print #1, ws.Cells(i, n).Value & ",";
            Else
                Print #1, ws.Cells(i, n).Value
            End If
        Next n
    Next i
    Close #1
      
End Sub

 このCSVファイルを確認してみると、このようになっています。。
 次の表はCSVファイルをメモ帳でひらき、わかりやすくするために間隔をあけたものです。
  
文字列,	日付,		時刻,			日付+時刻
AA1,	2018/05/01,	0.416666666666667,	2018/05/01 10:00:00 
AA2,	2018/05/02,	0.458333333333333,	2018/05/02 11:00:00 
AA3,	2018/05/03,	0.5,			2018/05/03 12:00:00 
AA4,	2018/05/04,	0.541666666666667,	2018/05/04 13:00:00 

 日付や日付+時刻はエクセルと同じ表示になっていますが、時刻のみ小数になりますが何故でしょうか?
 実務上、差しさわりがあるわけではありませんが疑問に思い質問しました。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 >     Print #1, ws.Cells(i, n).Value & ",";
 > Else
 >     Print #1, ws.Cells(i, n).Value

 Valueプロパティにしているからじゃないですか?

 1.Textプロパティにするか

 2.シート上にチャンと表示されていないなら、
   Format関数を使って確実に文字列変換するか

 じゃないですか。

(半平太) 2020/11/17(火) 11:03


 早速のご回答、ありがとうございます。
 Valueプロパティが原因なら、なぜ日付はシリアル値にならないのでしょうか?
(tora) 2020/11/17(火) 11:10

 Valueプロパティの型をチェックすると、

 時刻データは、Double型となっていますが、
 日付データは、DATE型となっているので、その違いかと思います。

(半平太) 2020/11/17(火) 11:17


 もろかぶりしましたが、そのまま書きます

 なぜと理由を聞かれると困ります
 「そういう仕様だから」としか言いようがないので。
 
 VBAには日付型(Date型)はありますが、時刻型(Time型?)はありません。
 セルの書式を日付を含むようにしていれば、セルの値を日付型と認識してくれますが、
 セルの書式を日付時刻のみにしていると、セルの値がDouble型と認識してしますようです。

 C列の書式も yyyy/m/d hh:mm:ss としておくと、日付型と認識されて、
 なぜかCSVファイルには時刻のみが出力されます

 よくわかりません。

 原因はわかりませんが、対処はできるので、ちゃんと書式をコントロールして書き出せばいいのでは?
(´・ω・`) 2020/11/17(火) 11:27

 仕様らしき説明では
  「Value2 プロパティでは、通貨型 (Currency) および日付型 (Date) のデータ型を使用しない点のみが、Value プロパティと異なります。」
 とあるので、

 経験則と照らし合わせると、Valueプロパティが日付型になるには、
 セルの書式に日付ファクタが入っている必要があると言うことなんでしょうね。

(半平太) 2020/11/17(火) 11:49


 最初の質問に書いたようにこれで特別不都合があるわけではありません。
 Value を書き出したのに、エクセルの書式が反映される場合とそうじゃない場合があるのが
 不思議だったので質問させていただきました。

 半平太さん、´・ω・`さん、いろいろとありがとうございました。。

(tora) 2020/11/17(火) 12:24


コメント返信:

[ 一覧(最新更新順) ]


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