メモ帳に ”6/9/2” を入力しておきます。
そこで、文字列をコピーして、クリップボードへ。
Ctrl + [V] で貼り付けると セルには「2006/9/2」と、日付として入力されます。
貼り付け先となるセルのその時点での表示形式が「標準」である場合、
Excel はシステムの地域設定に基づき、セルに入力された文字列 "6/9/2" を
日付データとして解釈して型変換を行った上、更に D1 セルの表示形式を
「日付」に変更します。
例えばシステムの地域設定において、日付(短い形式)の表示形式が「yyyy/MM/dd」、
かつ 2 桁年入力の有効範囲が 1950 ~ 2049 と設定されている場合、
"6" を yyyy パート、"9" を MM パート、"2" を dd パートとみなし、
更に "6" を西暦 2006 年と解釈して 2006/09/02 00:00:00 という日時データ
(シリアル値 38962)に変換します。
また、そのセルの内部上の表示形式はユーザー定義形式「yyyy/m/d」に
相当するものに変更されます。
ここで重要なのは、上記の挙動はあくまで Excel ワークシート上のセルを
ユーザーが直接編集した場合のものである、という点です。
再び、メモ帳の文字列 をクリップボードにコピーした後、マクロを実行
Range("D1").Select
ActiveSheet.Paste
「2002/6/9」となってしまいます。
一方、VBAにおける日付リテラルの既定の書式は m/d/yyyy です。
日付型 (Date) (Visual Basic)
Date リテラルは、シャープ記号 (# #) で囲む必要があります。 日付の値は、#5/31/1993# のように M/d/yyyy の形式で、または #1993-5-31# のように yyyy-MM-dd の形式で指定する必要があります。 最初に年を指定する場合は、スラッシュを使用できます。 この要件は、ロケールやコンピューターの日付と時刻の設定とは無関係です。
そのため、クリップボードにコピーされた "6/9/2" という文字列を
Paste メソッドによって貼り付ける際、"6" が m パート、"9" が d パート、
そして "2" が yyyy パートとみなされ、その結果として
2002/06/09 00:00:00 という日時データに変換されているものと推定されます。
挙動としては、以下のマクロと同じ感じでしょう。
vba
1Sub Macro2()
2
3 With Range("E1")
4 .NumberFormat = "general"
5 .Value = "6/9/2"
6 End With
7
8End Sub
日付が、和暦での y/m/d に表示
西暦に変更して処理するために、エクセルシート上で変換
上記については、日付文字列の先頭に「元号を表す文字列」を付加した上で
日時データに型変換するようにするのが無難です。
vba
1Sub Macro3()
2
3 '[日付]列の列番号
4 Const DateColumn = 1
5
6 Dim wsDestination As Worksheet
7 Dim rngTarget As Range
8 Dim lngRow As Long
9 Dim lngFirstRow As Long
10 Dim lngLastRow As Long
11
12 Application.ScreenUpdating = False
13
14 '新規ワークシートの追加
15 With ThisWorkbook.Worksheets
16 Set wsDestination = .Add(After:=.Item(.Count))
17 End With
18
19 With wsDestination
20
21 '[日付]列全体の表示形式を一時的に「文字列」にする
22 .Columns(DateColumn).NumberFormat = "@"
23
24 '貼り付け先範囲の先頭の行番号の指定
25 lngFirstRow = 1
26
27 '貼り付け先セルの選択
28 .Cells(lngFirstRow, 1).Select
29 '貼り付け実行
30 .PasteSpecial Format:="テキスト", _
31 Link:=False, _
32 DisplayAsIcon:=False
33
34 '[日付]列全体の表示形式を「標準」に戻す
35 .Columns(DateColumn).NumberFormat = "general"
36
37 '最後の行番号の取得
38 lngLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
39
40 '先頭行から最終行までループ
41 For lngRow = lngFirstRow To lngLastRow
42 '[日付]列のセルの操作
43 With .Cells(lngRow, DateColumn)
44 'セルの値が日時データと解釈できる場合
45 If IsDate(.Value) Then
46 '表示形式の設定
47 .NumberFormat = "[$-ja-JP-x-gannen]ggge""年""m""月""d""日"";@"
48 '元号(R)を付加した上で型変換した結果を代入
49 .Value = CDate("R" & .Value)
50 End If
51 End With
52 Next
53
54 '列幅の自動調整
55 .UsedRange.EntireColumn.AutoFit
56
57 End With
58
59 Set wsDestination = Nothing
60
61 Application.ScreenUpdating = True
62
63End Sub