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

回答編集履歴

4

検査コードをわかりやすいように修正

2025/11/03 07:22

投稿

xail2222
xail2222

スコア1534

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(ActiveCell.Value)
69
+ tStr2 = TypeName(ActiveSheet.Range(tAddress).Value)
67
70
  If tStr <> tStr2 Then
68
71
  Debug.Print tStr2
69
72
  tStr = tStr2

3

推測を修正

2025/11/03 07:14

投稿

xail2222
xail2222

スコア1534

answer CHANGED
@@ -82,9 +82,9 @@
82
82
  またEnterを押下するだけでは型は変わりません。
83
83
  編集状態(入力状態)にしてからEnterを押下して確定したタイミングでStringに変わります。
84
84
 
85
- u_zuさんのいうようにDoubleに一旦なるのは
85
+
86
- 入力がなんらかの操作で確定しているはずです。
87
- ただ、NumberFormatLocal = "@"しているとDoubleには一瞬たりともならないと思うので
86
+ NumberFormatLocal = "@"していると手入力ではDoubleには一瞬たりともならないと思うので
87
+ Doubleに一旦なるというのは、入力前からDoubleの値がセットされていたか
88
88
  何か思い違いをしているのでは。と思われます。
89
89
 
90
90
  まぁ。環境の違いによる差異と言う可能性もあり得ますが…

2

説明強化

2025/11/03 07:10

投稿

xail2222
xail2222

スコア1534

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

コメントに対する返答を記載

2025/11/03 07:04

投稿

xail2222
xail2222

スコア1534

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
+ まぁ。環境の違いによる差異と言う可能性もあり得ますが…