回答編集履歴

4

インデントがずれている箇所を修正しました。

2024/10/04 09:23

投稿

sk.exe
sk.exe

スコア1014

test CHANGED
@@ -90,10 +90,10 @@
90
90
  .Cells(lngFirstRow, 1).Select
91
91
  '貼り付け実行
92
92
  .PasteSpecial Format:="テキスト", _
93
- Link:=False, _
93
+ Link:=False, _
94
- DisplayAsIcon:=False
94
+ DisplayAsIcon:=False
95
95
 
96
- '[日付]列全体の表示形式を一時的に「標準」に戻す
96
+ '[日付]列全体の表示形式を「標準」に戻す
97
97
  .Columns(DateColumn).NumberFormat = "general"
98
98
 
99
99
  '最後の行番号の取得

3

回答コメントを踏まえ、Macro3のコードを全面的に修正しました。

2024/10/04 09:16

投稿

sk.exe
sk.exe

スコア1014

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 Range("F1")
77
+ With ThisWorkbook.Worksheets
66
- .NumberFormat = "[$-ja-JP-x-gannen]ggge""年""m""月""d""日"";@"
67
- .Value = CDate("R6/9/2")
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 型に関するトピックのリンクを追加しました。

2024/10/04 07:08

投稿

sk.exe
sk.exe

スコア1014

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における日付リテラル周りの解説を修正しました。

2024/10/04 07:02

投稿

sk.exe
sk.exe

スコア1014

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/m/yyyy です。
31
+ 一方、**VBAにおける**日付リテラルの既定の書式は m/d/yyyy です。
30
32
 
31
33
  そのため、クリップボードにコピーされた "6/9/2" という文字列を
32
- Paste メソッドによって貼り付ける際、"6" が d パート、"9" が m パート、
34
+ Paste メソッドによって貼り付ける際、"6" が m パート、"9" が d パート、
33
35
  そして "2" が yyyy パートとみなされ、その結果として
34
- 2002/09/06 00:00:00 という日時データに変換されているものと推定されます。
36
+ 2002/06/09 00:00:00 という日時データに変換されているものと推定されます。
35
37
 
36
38
  挙動としては、以下のマクロと同じ感じでしょう。
37
39