回答編集履歴
4
インデントがずれている箇所を修正しました。
test
CHANGED
@@ -90,10 +90,10 @@
|
|
90
90
|
.Cells(lngFirstRow, 1).Select
|
91
91
|
'貼り付け実行
|
92
92
|
.PasteSpecial Format:="テキスト", _
|
93
|
-
|
93
|
+
Link:=False, _
|
94
|
-
|
94
|
+
DisplayAsIcon:=False
|
95
95
|
|
96
|
-
'[日付]列全体の表示形式を
|
96
|
+
'[日付]列全体の表示形式を「標準」に戻す
|
97
97
|
.Columns(DateColumn).NumberFormat = "general"
|
98
98
|
|
99
99
|
'最後の行番号の取得
|
3
回答コメントを踏まえ、Macro3のコードを全面的に修正しました。
test
CHANGED
@@ -62,10 +62,65 @@
|
|
62
62
|
```vba
|
63
63
|
Sub Macro3()
|
64
64
|
|
65
|
+
'[日付]列の列番号
|
66
|
+
Const DateColumn = 1
|
67
|
+
|
68
|
+
Dim wsDestination As Worksheet
|
69
|
+
Dim rngTarget As Range
|
70
|
+
Dim lngRow As Long
|
71
|
+
Dim lngFirstRow As Long
|
72
|
+
Dim lngLastRow As Long
|
73
|
+
|
74
|
+
Application.ScreenUpdating = False
|
75
|
+
|
76
|
+
'新規ワークシートの追加
|
65
|
-
With
|
77
|
+
With ThisWorkbook.Worksheets
|
66
|
-
.NumberFormat = "[$-ja-JP-x-gannen]ggge""年""m""月""d""日"";@"
|
67
|
-
|
78
|
+
Set wsDestination = .Add(After:=.Item(.Count))
|
68
79
|
End With
|
80
|
+
|
81
|
+
With wsDestination
|
82
|
+
|
83
|
+
'[日付]列全体の表示形式を一時的に「文字列」にする
|
84
|
+
.Columns(DateColumn).NumberFormat = "@"
|
85
|
+
|
86
|
+
'貼り付け先範囲の先頭の行番号の指定
|
87
|
+
lngFirstRow = 1
|
88
|
+
|
89
|
+
'貼り付け先セルの選択
|
90
|
+
.Cells(lngFirstRow, 1).Select
|
91
|
+
'貼り付け実行
|
92
|
+
.PasteSpecial Format:="テキスト", _
|
93
|
+
Link:=False, _
|
94
|
+
DisplayAsIcon:=False
|
95
|
+
|
96
|
+
'[日付]列全体の表示形式を一時的に「標準」に戻す
|
97
|
+
.Columns(DateColumn).NumberFormat = "general"
|
98
|
+
|
99
|
+
'最後の行番号の取得
|
100
|
+
lngLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
|
101
|
+
|
102
|
+
'先頭行から最終行までループ
|
103
|
+
For lngRow = lngFirstRow To lngLastRow
|
104
|
+
'[日付]列のセルの操作
|
105
|
+
With .Cells(lngRow, DateColumn)
|
106
|
+
'セルの値が日時データと解釈できる場合
|
107
|
+
If IsDate(.Value) Then
|
108
|
+
'表示形式の設定
|
109
|
+
.NumberFormat = "[$-ja-JP-x-gannen]ggge""年""m""月""d""日"";@"
|
110
|
+
'元号(R)を付加した上で型変換した結果を代入
|
111
|
+
.Value = CDate("R" & .Value)
|
112
|
+
End If
|
113
|
+
End With
|
114
|
+
Next
|
115
|
+
|
116
|
+
'列幅の自動調整
|
117
|
+
.UsedRange.EntireColumn.AutoFit
|
118
|
+
|
119
|
+
End With
|
120
|
+
|
121
|
+
Set wsDestination = Nothing
|
122
|
+
|
123
|
+
Application.ScreenUpdating = True
|
69
124
|
|
70
125
|
End Sub
|
71
126
|
```
|
2
公式リファレンスより Date 型に関するトピックのリンクを追加しました。
test
CHANGED
@@ -29,6 +29,10 @@
|
|
29
29
|
> 「2002/6/9」となってしまいます。
|
30
30
|
|
31
31
|
一方、**VBAにおける**日付リテラルの既定の書式は m/d/yyyy です。
|
32
|
+
|
33
|
+
[日付型 (Date) (Visual Basic)](https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/data-types/date-data-type)
|
34
|
+
|
35
|
+
> Date リテラルは、シャープ記号 (# #) で囲む必要があります。 日付の値は、#5/31/1993# のように M/d/yyyy の形式で、または #1993-5-31# のように yyyy-MM-dd の形式で指定する必要があります。 最初に年を指定する場合は、スラッシュを使用できます。 この要件は、ロケールやコンピューターの日付と時刻の設定とは無関係です。
|
32
36
|
|
33
37
|
そのため、クリップボードにコピーされた "6/9/2" という文字列を
|
34
38
|
Paste メソッドによって貼り付ける際、"6" が m パート、"9" が d パート、
|
1
VBAにおける日付リテラル周りの解説を修正しました。
test
CHANGED
@@ -26,12 +26,14 @@
|
|
26
26
|
> Range("D1").Select
|
27
27
|
> ActiveSheet.Paste
|
28
28
|
|
29
|
+
> 「2002/6/9」となってしまいます。
|
30
|
+
|
29
|
-
一方、**VBAにおける**日付リテラルの既定の書式は d/
|
31
|
+
一方、**VBAにおける**日付リテラルの既定の書式は m/d/yyyy です。
|
30
32
|
|
31
33
|
そのため、クリップボードにコピーされた "6/9/2" という文字列を
|
32
|
-
Paste メソッドによって貼り付ける際、"6" が
|
34
|
+
Paste メソッドによって貼り付ける際、"6" が m パート、"9" が d パート、
|
33
35
|
そして "2" が yyyy パートとみなされ、その結果として
|
34
|
-
2002/0
|
36
|
+
2002/06/09 00:00:00 という日時データに変換されているものと推定されます。
|
35
37
|
|
36
38
|
挙動としては、以下のマクロと同じ感じでしょう。
|
37
39
|
|