Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


16931 / 76732 ←次へ | 前へ→

【65263】Re:VBA実行時の日付データ化けについて
発言  りん E-MAIL  - 10/5/2(日) 18:01 -

引用なし
パスワード
   オキシドール さん、こんにちわ。

>実行後A45に入力されいてる日付データが下記のようになります。
>CSV元データ 2010/4/20 14:34:01 (表示形式 ユーザ定義にてyyyy/m/d h:mm)
>実行後    2020/10/4 14:34:01 (表示形式 ユーザ定義にてyyyy/m/d h:mm)

元データが、
2010/4/20 14:34:01 ではなくて
 10/4/20 14:34:01 となっていませんか?

マクロでは、年の部分が4桁で入っていない場合は、MDY順で読み込まれるみたいです(日付への変換が失敗したら文字列のままで読み込まれます)。
英語表記で日付は May 2, 2010 というのがデフォだからだと思いますが。

なので、マクロ実行前にテキストファイルの年を4桁に直すか、一旦配列に入れて処理をしてからセルに書き出すかしたほうがよいです。
私は以前、後者で対応しました。

(追記:参考)
ちなみにこんな感じです。
Option Explicit
Sub Macro1()
  Dim S As Variant, II As Long, NN As Long, A$ 'A As String
  Open ファイル名(GetOpenFileNameで取得したもの) For Input As #1
   Do Until EOF(1)
     '1行ずつ読み込んで処理
     Line Input #1, A$
     'ダブルクォーテーションを除いて、カンマでちぎる
     S = Split(Replace(A$, """", ""), ",")
     '下準備:西暦年と思われるところに20をつける
     For II = LBound(S) To UBound(S)
      If Len(S(II)) - Len(Replace(S(II), "/", "")) = 2 Then
        If Mid(S(II), 3, 1) = "/" Then S(II) = "20" & S(II) '20をつける
      End If
     Next
     '
     NN = NN + 1
     'マクロのあるブックのシート1の1行目から順に転記
     With ThisWorkbook.Worksheets(1)
      With .Range(.Cells(NN, 1), .Cells(NN, 1 + UBound(S)))
        .Value = S '値をセルに送る
        .Value = .Value '魔法の呪文
      End With
     End With
   Loop
  Close #1
End Sub

1行ずつ処理をする例です。
読み込むテキストデータがものすごく多い場合は1行ずつではなく、まとめて読み込んで処理すると速くなります。
もちろん、改行、再計算、改ページ更新を切るだけでもそれなりにはやくなります。

1 hits

【65262】VBA実行時の日付データ化けについて オキシドール 10/5/2(日) 16:26 質問
【65263】Re:VBA実行時の日付データ化けについて りん 10/5/2(日) 18:01 発言
【65265】Re:VBA実行時の日付データ化けについて オキシドール 10/5/2(日) 19:49 お礼
【65264】Re:VBA実行時の日付データ化けについて よろずや 10/5/2(日) 18:55 発言
【65266】Re:VBA実行時の日付データ化けについて オキシドール 10/5/2(日) 19:58 お礼
【65267】Re:VBA実行時の日付データ化けについて kanabun 10/5/2(日) 20:15 発言
【65268】Re:VBA実行時の日付データ化けについて オキシドール 10/5/2(日) 20:25 お礼

16931 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free