回答編集履歴
4
検査コードをわかりやすいように修正
answer
CHANGED
|
@@ -61,9 +61,12 @@
|
|
|
61
61
|
Public Sub TypeCheck()
|
|
62
62
|
Dim tStr As String
|
|
63
63
|
Dim tStr2 As String
|
|
64
|
+
Dim tAddress As String
|
|
65
|
+
|
|
64
66
|
ActiveCell.NumberFormatLocal = "@"
|
|
67
|
+
tAddress = ActiveCell.Address
|
|
65
68
|
Do While True
|
|
66
|
-
tStr2 = TypeName(
|
|
69
|
+
tStr2 = TypeName(ActiveSheet.Range(tAddress).Value)
|
|
67
70
|
If tStr <> tStr2 Then
|
|
68
71
|
Debug.Print tStr2
|
|
69
72
|
tStr = tStr2
|
3
推測を修正
answer
CHANGED
|
@@ -82,9 +82,9 @@
|
|
|
82
82
|
またEnterを押下するだけでは型は変わりません。
|
|
83
83
|
編集状態(入力状態)にしてからEnterを押下して確定したタイミングでStringに変わります。
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
|
|
86
|
-
入力がなんらかの操作で確定しているはずです。
|
|
87
|
-
|
|
86
|
+
NumberFormatLocal = "@"していると手入力ではDoubleには一瞬たりともならないと思うので
|
|
87
|
+
Doubleに一旦なるというのは、入力前からDoubleの値がセットされていたか
|
|
88
88
|
何か思い違いをしているのでは。と思われます。
|
|
89
89
|
|
|
90
90
|
まぁ。環境の違いによる差異と言う可能性もあり得ますが…
|
2
説明強化
answer
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
|
|
34
34
|
```Range("A1").Formula```と```Range("A1").Text```は文字列だから```Range("A1").Value```に渡すときちんと文字列になると思います。
|
|
35
35
|
|
|
36
|
-
(追記)
|
|
36
|
+
**(追記:u_zuさんの2025/11/03 12:50のコメントに対し)**
|
|
37
37
|
私の回答やEnterキーの入力でも同じなのですが
|
|
38
38
|
日付2023/3/2が3/2/2023となってしまいます。
|
|
39
39
|
hatenaさんの回答にありましたが
|
|
@@ -47,10 +47,13 @@
|
|
|
47
47
|
|
|
48
48
|
>例えばRange("A1")に 100と手入力し、 ←ここで、データ型がDouble
|
|
49
49
|
★ 私のOffice365ではこうはなりません。Enterを押下してカレントセルを変えたりフォーカスを外したりして入力モードから確定させないと値をセットしたことにはなりません。
|
|
50
|
+
入力状態のときにDoubleになるというのであれば、入力前の値がDoubleだったのではないですか?
|
|
51
|
+
入力が確定するまでは、入力前の値で処理されるはずですから。
|
|
50
52
|
|
|
51
53
|
>Enterキーを押すと、 ←ここで、データ型がStringに変わる
|
|
52
54
|
★手入力でEnterキーの場合、ここで初めて値がセットになります。
|
|
53
55
|
|
|
56
|
+
|
|
54
57
|
セルを選択した後、以下のコード(ちょっと乱暴な関数ですが)を実行して
|
|
55
58
|
そして値を入力してエンターを押下してみてください。
|
|
56
59
|
|
1
コメントに対する返答を記載
answer
CHANGED
|
@@ -31,4 +31,57 @@
|
|
|
31
31
|
|
|
32
32
|
なので文字列として設定するには、文字列でvalueに渡さないといけないのでしょう。
|
|
33
33
|
|
|
34
|
-
```Range("A1").Formula```と```Range("A1").Text```は文字列だから```Range("A1").Value```に渡すときちんと文字列になると思います。
|
|
34
|
+
```Range("A1").Formula```と```Range("A1").Text```は文字列だから```Range("A1").Value```に渡すときちんと文字列になると思います。
|
|
35
|
+
|
|
36
|
+
(追記)
|
|
37
|
+
私の回答やEnterキーの入力でも同じなのですが
|
|
38
|
+
日付2023/3/2が3/2/2023となってしまいます。
|
|
39
|
+
hatenaさんの回答にありましたが
|
|
40
|
+
Cstrや型をチェックしてからのFormat関数を使っての文字列化してのセットの方が見た目は違和感はないと思います。
|
|
41
|
+
|
|
42
|
+
あと
|
|
43
|
+
>例えばRange("A1")に 100と手入力し、 ←ここで、データ型がDouble
|
|
44
|
+
>Enterキーを押すと、 ←ここで、データ型がStringに変わる
|
|
45
|
+
|
|
46
|
+
これは私の環境であれば誤りです。
|
|
47
|
+
|
|
48
|
+
>例えばRange("A1")に 100と手入力し、 ←ここで、データ型がDouble
|
|
49
|
+
★ 私のOffice365ではこうはなりません。Enterを押下してカレントセルを変えたりフォーカスを外したりして入力モードから確定させないと値をセットしたことにはなりません。
|
|
50
|
+
|
|
51
|
+
>Enterキーを押すと、 ←ここで、データ型がStringに変わる
|
|
52
|
+
★手入力でEnterキーの場合、ここで初めて値がセットになります。
|
|
53
|
+
|
|
54
|
+
セルを選択した後、以下のコード(ちょっと乱暴な関数ですが)を実行して
|
|
55
|
+
そして値を入力してエンターを押下してみてください。
|
|
56
|
+
|
|
57
|
+
```VBA
|
|
58
|
+
Public Sub TypeCheck()
|
|
59
|
+
Dim tStr As String
|
|
60
|
+
Dim tStr2 As String
|
|
61
|
+
ActiveCell.NumberFormatLocal = "@"
|
|
62
|
+
Do While True
|
|
63
|
+
tStr2 = TypeName(ActiveCell.Value)
|
|
64
|
+
If tStr <> tStr2 Then
|
|
65
|
+
Debug.Print tStr2
|
|
66
|
+
tStr = tStr2
|
|
67
|
+
End If
|
|
68
|
+
DoEvents
|
|
69
|
+
Loop
|
|
70
|
+
End Sub
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
私の環境だと
|
|
74
|
+
Empty
|
|
75
|
+
String
|
|
76
|
+
とログが出ます。
|
|
77
|
+
Doubleは出ません。
|
|
78
|
+
Enterを押下するまでは編集状態で値がセットされていないのでDoubleにはならないです。
|
|
79
|
+
またEnterを押下するだけでは型は変わりません。
|
|
80
|
+
編集状態(入力状態)にしてからEnterを押下して確定したタイミングでStringに変わります。
|
|
81
|
+
|
|
82
|
+
u_zuさんのいうようにDoubleに一旦なるのは
|
|
83
|
+
入力がなんらかの操作で確定しているはずです。
|
|
84
|
+
ただ、NumberFormatLocal = "@"しているとDoubleには一瞬たりともならないと思うので
|
|
85
|
+
何か思い違いをしているのでは。と思われます。
|
|
86
|
+
|
|
87
|
+
まぁ。環境の違いによる差異と言う可能性もあり得ますが…
|