質問するログイン新規登録

回答編集履歴

4

「代入するデータの型が String 型である場合」に補足を加えました。

2025/11/04 11:13

投稿

sk.exe
sk.exe

スコア1114

answer CHANGED
@@ -69,6 +69,8 @@
69
69
 
70
70
  - 代入時点におけるセルの表示形式が「時刻のみを表示する形式」であり、かつ代入される文字列が「数値データに変換可能なパターン」に該当し、かつその文字列に通貨記号(通常は `"$"` )が含まれている場合、代入後のセルの表示形式は「通貨」に変更され、代入後のセルのデータ型は `Currency` 型となる(特殊ケース)。
71
71
 
72
+ - 代入時点におけるセルの表示形式が「文字列」( `@` )ではなく、かつ代入される文字列が「 Excel の数式として解釈し、計算を実行することが可能な文字列」であった場合は、暗黙的にそのセルの Formula プロパティの設定が行われ、その数式の計算結果が Value プロパティから取得可能となる。代入後のセルの表示形式とデータ型は、代入前の表示形式と数式の戻り値によって異なる。
73
+
72
74
  ### 代入するデータの型が `Boolean` 型である場合
73
75
 
74
76
  - 代入後のセルのデータ型は全て `Boolean` 型となる。代入前の表示形式の影響を受けず、また代入後に表示形式を変更しない。

3

より詳細に検証した結果を踏まえた内容に整理しました。

2025/11/04 10:35

投稿

sk.exe
sk.exe

スコア1114

answer CHANGED
@@ -17,43 +17,71 @@
17
17
 
18
18
  以下、上記 2 の操作に限った一般的な動作について列挙します。
19
19
 
20
- ### 代入するデータの型が数値データを扱うもの( `Integer`, `Long`, `Single`, `Double` など)である場合
20
+ ### 代入するデータの型が `Integer`, `Long`, `Single`, `Double` のいずれかである場合
21
21
 
22
- - 代入時点におけるセルの表示形式が「日付/を表示するための形式」( `yyyy/mm/dd` , `hh:mm:ss` など)であった場合、代入後のセルのデータ型は `Date` 型となる。
22
+ - 代入時点におけるセルの表示形式が「日時また日付のみを表示する形式」( `yyyy/mm/dd hh:mm:ss`, `yyyy/mm/dd` など)であった場合、代入後のセルのデータ型は基本的には `Date` 型となる。
23
23
 
24
- - 代入時点におけるセルの表示形式が「日付/時刻を表示するための形式」ではなかった場合( `@` を含む)、代入後のセルのデータ型は Double 型に変換される。**但し後述する「唯一の例外ケース」は除く。**
24
+ - 代入時点におけるセルの表示形式が「時刻のみを表示する形式」( `h:mm:ss` などである場合、代入後のセルのデータ型は `Double`となる。
25
25
 
26
+ - 代入時点におけるセルの表示形式が「通貨を表示する形式」だった場合、代入後のセルのデータ型は `Currency` 型に変換される。
27
+
28
+ - 代入時点におけるセルの表示形式が上記以外のものであった場合(「文字列」を含む)、代入後のセルのデータ型は原則的に `Double` 型となる( `Integer`, `Long`, `Single` のいずれかの型として格納されることはない)。
29
+
30
+ ### 代入するデータの型が `Currency` 型である場合
31
+
32
+ - 代入時点におけるセルの表示形式が「通貨を表示する形式」であった場合、代入後のセルのデータ型は `Currency` 型のままである。
33
+
34
+ - 代入時点におけるセルの表示形式が「数値を表示する形式」であった場合、代入後のセルのデータ型は `Double` 型となる。
35
+
36
+ - 代入時点におけるセルの表示形式が「日時または日付のみを表示する形式」であった場合、代入後のセルのデータ型は基本的に `Date` 型となる。
37
+
38
+ - 代入時点におけるセルの表示形式が「時刻のみを表示する形式」である場合、代入後のセルの表示形式は「通貨」に変更され、代入後のセルのデータ型は `Currency` 型となる。
39
+
40
+ - 代入時点におけるセルの表示形式が「文字列」( `@` )であった場合、代入後のセルの表示形式は「通貨」に変更され、代入後のセルのデータ型は**何故か `String` 型に変換される**(特殊ケース)。
41
+
26
42
  ### 代入するデータの型が `Date` 型である場合
27
43
 
28
- - 代入時点におけるセルの表示形式が「日付/時刻を表示するための形式」であった場合、代入後のセルのデータ型は `Date` 型となる。
44
+ - 代入時点におけるセルの表示形式が「日付/時刻を表示する形式」であった場合、代入後のセルのデータ型は基本的に `Date` 型となる。
29
45
 
30
- - 代入時点におけるセルの表示形式が「数値を表示するための形式」であった場合、代入後のセルのデータ型は `Double` 型となる。
46
+ - 代入時点におけるセルの表示形式が「時刻のみを表示する形式」であり、かつ代入する値が時刻成分のみを持つ場合、代入後のセルのデータ型は `Double` 型となる。
31
47
 
32
- - 代入時点におけるセルの表示形式が「文字列」であった場合、代入後のセルのデータ型は `String` 型となる。
48
+ - 代入時点におけるセルの表示形式が「通貨を表示する形式」であり、かつ代入する値が日付成分と時刻成分の両方を含む場合、代入後のセルの表示形式は「日時を表示する形式」に変更され、代入後のセルのデータ型は `Date` 型となる。
33
49
 
34
- ### 代入するデータ `String` 型であ場合
50
+ - 代入時点におけるセルの表示形式が「通貨を表示する形式」であり、かつ代入する値が日付成分のみを含む場合、代入後のセルの表示形式は「日付のみを表示する形式」に変更され、代入後のセルのデータ型 `Date` 型とな
35
51
 
36
- - 代入時点におけるセルの表示形式が「日付/時刻を表示するための形式」であり、かつ代入され文字列が「数データまたデータに変換可能なパターン」であった場合、代入後のセルのデータ型は `Date` 型となる。
52
+ - 代入時点におけるセルの表示形式が「通貨を表示する形式」であり、かつ代入る値が時刻成分のみを含む場合、代入後のセルの表示形式刻のみを表示する形式」に変更され、代入後のセルのデータ型は `Double` 型となる。
37
53
 
38
- - 代入時点におけるセル表示形式が「数値を表示するための形式」でありかつ代入され文字列が「数値データまたは日時タに変換可能なパタン」あった場合、代入後セルのデータ型は `Double` 型となる。
54
+ - 以上動作は、代入 Date 型データ付/刻が Excel ワクシト上扱うことの出来る日付範囲に含まれる場合のみ有効である。
39
55
 
56
+ - 代入時点におけるセルの表示形式が「数値を表示する形式」であった場合、代入後のセルのデータ型は `Double` 型となる。
57
+
40
58
  - 代入時点におけるセルの表示形式が「文字列」( `@` )であった場合、代入後のセルのデータ型は `String` 型となる。
41
59
 
42
- - 上記のいずれにも該当しない場合は、後述の「代入時点におけセル表示形式『標準』であった場合」に準拠する。
60
+ ### 代入データ `String` 型であ場合
43
61
 
62
+ - 代入時点におけるセルの表示形式が「文字列」( `@` )であった場合、代入後のセルのデータ型は必ず `String` 型となる。
63
+
64
+ - 代入時点におけるセルの表示形式が「数値を表示する形式」であり、かつ代入される文字列が「数値データまたは日時データに変換可能なパターン」であった場合、代入後のセルのデータ型は基本的に `Double` 型となる。
65
+
66
+ - 代入時点におけるセルの表示形式が「日時または日付のみを表示する形式」であり、かつ代入される文字列が「数値データまたは日時データに変換可能なパターン」に該当する場合、代入後のセルのデータ型は基本的に `Date` 型となる。
67
+
68
+ - 代入時点におけるセルの表示形式が「時刻のみを表示する形式」であり、かつ代入される文字列が「数値データまたは日時データに変換可能なパターン」に該当する場合、代入後のセルのデータ型は基本的に `Double` 型となる。
69
+
70
+ - 代入時点におけるセルの表示形式が「時刻のみを表示する形式」であり、かつ代入される文字列が「数値データに変換可能なパターン」に該当し、かつその文字列に通貨記号(通常は `"$"` )が含まれている場合、代入後のセルの表示形式は「通貨」に変更され、代入後のセルのデータ型は `Currency` 型となる(特殊ケース)。
71
+
44
72
  ### 代入するデータの型が `Boolean` 型である場合
45
73
 
46
74
  - 代入後のセルのデータ型は全て `Boolean` 型となる。代入前の表示形式の影響を受けず、また代入後に表示形式を変更しない。
47
75
 
48
76
  ### 代入時点におけるセルの表示形式が「標準」であった場合
49
77
 
50
- - 代入するデータが「 Excel の数式として解釈可能な文字列」であった場合、暗黙的に Formula プロパティの設定が行われ、代入後のセルの表示形式はその数式の戻り値のデータ型に沿った形式に変換される(本来は Value プロパティではなく Formula プロパティを直接設定すべきである)。
78
+ - 代入するデータが「 Excel の数式として解釈し、計算を実行することが可能な文字列」であった場合、暗黙的に Formula プロパティの設定が行われ、代入後のセルの表示形式はその数式の戻り値のデータ型や値に沿った形式に変換される(本来は Value プロパティではなく Formula プロパティを直接設定すべきである。また、代入する式の構文に問題がある場合は実行時エラーが発生する)。
51
79
 
52
- - 代入するデータが数値データまたは「数値データに変換可能な文字列( `"5E04"` のような指数形式なども含む)」であった場合、代入後のセルの表示形式はそのパターンに沿った「数値を表示するための形式に変され、代入後のセルのデータ型は `Double` 型となる。
80
+ - 代入するデータが数値データまたは「数値データに変換可能な文字列( `"5E04"` のような指数形式なども含む)」であった場合、代入後のセルの表示形式は必要に応じてその文字列パターンに沿った形式に変され(必要がなければ「標準」のままとし)、代入後のセルのデータ型は基本的に `Double` 型となる。また、その文字列に通貨記号が含まれていることによって `Currency` 型となる場合もある。
53
81
 
54
- - 代入するデータが日時データまたは「日時データに変換可能な文字列」であった場合、代入後のセルの表示形式はそのパターンに沿った「日付/時刻を表示するための形式」に変換され、代入後のセルのデータ型は `Date` 型となる
82
+ - 代入するデータが日時データまたは「日時データに変換可能な文字列」であった場合、代入後のセルの表示形式は基本的にその文字列パターンに沿った「日時/日付/時刻を表示する形式」に変換され、代入後のセルのデータ型は `Date` 型(日時または日付) `Double` 型(時刻)のいずれかとなる
55
83
 
56
- - 代入するデータが `Currency` 型である場合、代入後のセルの表示形式は「通貨」に変され、代入後のセルのデータ型は `Currency` 型のままとなる(**唯一の例外ケース**)
84
+ - 代入するデータが `Currency` 型である場合、代入後のセルの表示形式は「通貨」に変され、代入後のセルのデータ型は `Currency` 型のままとなる。
57
85
 
58
86
  - 代入するデータが上記のいずれのケースにも該当しない文字列である( `String` 以外の型への変換が不可能である)場合、代入後のセルの表示形式は「標準」のまま、代入後のセルのデータ型は `String` 型となる。
59
87
 
@@ -85,11 +113,11 @@
85
113
 
86
114
  Dim aryValues As Variant
87
115
 
88
- aryValues = Array(#11/4/2025#, #12:00:00 PM#, "2025/11/04", "2025-11-04", 100, "100", 45965, "45965", CSng(1000.5), CDbl(1000.5), CCur(1000.5), CDec(1000.5), "1000.5", "01234", "5E04", "ABC", True, "=NOW()", "=ROW()")
116
+ aryValues = Array(#11/4/2025 12:00:00 PM#, #11/4/2025#, #12:00:00 PM#, "2025/11/04 ", "1-1", "12:00", 0, 0.5, 100, "100", 45965, "45965", CSng(1000.5), CDbl(1000.5), CCur(0), CCur(0.5), CCur(1000), CCur(1000.5), CDec(1000.5), "1000.5", "01234", "5E04", "$1000", "$1,000", "ABC", True, "=NOW()", "=TODAY()", "=TIME(HOUR(NOW()),MINUTE(NOW()),SECOND(NOW()))", "=ROW()")
89
117
 
90
118
  Dim aryFormats As Variant
91
119
 
92
- aryFormats = Array("yyyy/mm/dd hh:mm:ss", "0", "#,##0.00", "$#,##0.00_);($#,##0.00)", "0.E+00", "@", "General")
120
+ aryFormats = Array("yyyy/m/d", "h:mm:ss", "yyyy/mm/dd hh:mm:ss", "0", "#,##0.00", "$#,##0.00_);($#,##0.00)", "0.E+00", "@", "General")
93
121
 
94
122
  Dim varValue As Variant
95
123
  Dim varFormat As Variant
@@ -120,12 +148,13 @@
120
148
  .NumberFormat = "@"
121
149
  .Columns(3).NumberFormat = NumberFormat
122
150
 
123
- .Columns(1).Value = Value
151
+ .Columns(1).Value = CStr(Value)
124
152
  .Columns(2).Value = TypeName(Value)
125
153
  .Columns(4).Value = .Columns(3).NumberFormat
126
154
  .Columns(5).Value = .Columns(3).NumberFormatLocal
127
155
 
128
156
  .Columns(3).Value = Value
157
+ Application.Calculate
129
158
  .Columns(6).Value = .Columns(3).NumberFormat
130
159
  .Columns(7).Value = .Columns(3).NumberFormatLocal
131
160
  .Columns(8).Value = TypeName(.Columns(3).Value)
@@ -135,4 +164,4 @@
135
164
  End Sub
136
165
  ```
137
166
 
138
- 今回の場合はあまり関係がないでしょうが、代入時点でのセルの表示形式を「通貨」にした場合はやや結果が読みづらい挙動となります。
167
+ 今回の場合はあまり関係がないでしょうが、代入時点でのセルの表示形式を「通貨を表示する形式や「時刻のみを表示する形式」にした場合はやや結果が読みづらい挙動となります。

2

検証パターンを若干増やしました。

2025/11/04 04:32

投稿

sk.exe
sk.exe

スコア1114

answer CHANGED
@@ -85,11 +85,11 @@
85
85
 
86
86
  Dim aryValues As Variant
87
87
 
88
- aryValues = Array(#11/4/2025#, "2025/11/04", "2025-11-04", 100, "100", 45965, "45965", CSng(1000.5), CDbl(1000.5), CCur(1000.5), CDec(1000.5), "1000.5", "01234", "5E04", "ABC", True, "=NOW()", "=ROW()")
88
+ aryValues = Array(#11/4/2025#, #12:00:00 PM#, "2025/11/04", "2025-11-04", 100, "100", 45965, "45965", CSng(1000.5), CDbl(1000.5), CCur(1000.5), CDec(1000.5), "1000.5", "01234", "5E04", "ABC", True, "=NOW()", "=ROW()")
89
89
 
90
90
  Dim aryFormats As Variant
91
91
 
92
- aryFormats = Array("yyyy/mm/dd hh:mm:ss", "0", "#,##0.00", "0.E+00", "@", "General")
92
+ aryFormats = Array("yyyy/mm/dd hh:mm:ss", "0", "#,##0.00", "$#,##0.00_);($#,##0.00)", "0.E+00", "@", "General")
93
93
 
94
94
  Dim varValue As Variant
95
95
  Dim varFormat As Variant
@@ -134,3 +134,5 @@
134
134
 
135
135
  End Sub
136
136
  ```
137
+
138
+ 今回の場合はあまり関係がないでしょうが、代入時点でのセルの表示形式を「通貨」にした場合はやや結果が読みづらい挙動となります。

1

「暗黙的に Formula プロパティの設定が行われ、」を追記。

2025/11/04 03:55

投稿

sk.exe
sk.exe

スコア1114

answer CHANGED
@@ -47,7 +47,7 @@
47
47
 
48
48
  ### 代入時点におけるセルの表示形式が「標準」であった場合
49
49
 
50
- - 代入するデータが「 Excel の数式として解釈可能な文字列」であった場合、代入後のセルの表示形式はその数式の戻り値のデータ型に沿った形式に変換される(本来は Value プロパティではなく Formula プロパティを設定すべきである)。
50
+ - 代入するデータが「 Excel の数式として解釈可能な文字列」であった場合、暗黙的に Formula プロパティの設定が行われ、代入後のセルの表示形式はその数式の戻り値のデータ型に沿った形式に変換される(本来は Value プロパティではなく Formula プロパティを直接設定すべきである)。
51
51
 
52
52
  - 代入するデータが数値データまたは「数値データに変換可能な文字列( `"5E04"` のような指数形式なども含む)」であった場合、代入後のセルの表示形式はそのパターンに沿った「数値を表示するための形式」に変換され、代入後のセルのデータ型は `Double` 型となる。
53
53