『これはなぜだめなのですか』(ネイラー)
以下のコードはなぜコンパイルエラーが発生するのでしょうか?
Enum D1_COLOR
vbBlack = &H0 '黒 vbWhite = &HFFFF00 '白 End Enum
Enum D2_COLOR
vbBlack = &H0 '黒 vbYellow = &HFFFF '黄 vbWhite = &HFFFF00 '白 End Enum
Private Sub CommandButton1_Click()
Call D1
End Sub
Public Sub D1(Optional color As Long = vbBlack)
End Sub
Public Sub D2(Optional color As Long = vbBlack)
End Sub
< 使用 Excel:Excel2016、使用 OS:Windows11 >
名前がかぶっていて、どっちか不明確だから
Enum D1_COLOR vbBlack = &H0 '黒 vbWhite = &HFFFF00 '白 End Enum
Enum D2_COLOR vbBlack = &H0 '黒 vbYellow = &HFFFF '黄 vbWhite = &HFFFF00 '白 End Enum
Private Sub CommandButton1_Click() Call D1 End Sub
Public Sub D1(Optional color As D1_COLOR = D1_COLOR.vbBlack)
End Sub vbBlackとか、VBA.vbBlackと区別がつかないような名前は使わない方がよろしいかと (´・ω・`) 2025/07/09(水) 13:44:53
MsgBox vbBlack
MsgBox vbWhite
(不思議ちゃん) 2025/07/09(水) 14:41:18
D1,D2の引数で黒を渡す場合
vbBlack, D1_COLOR.vbBlack, D2_COLOR.vbBlackの
どれを入力しても動作するようにしたのですが
おっしゃるとおり、
D1のcolor には D1_COLOR のみ入力するように
D2のcolor には D2_COLOR のみ入力するように
した方がいいですね。
(ネイラー) 2025/07/09(水) 14:50:14
>vbBlack, D1_COLOR.vbBlack, D2_COLOR.vbBlack >それぞれ別物だと思ったのですが 別物です
>コンパイラーにとっては区別ができないもの VBA.vbBlack, D1_COLOR.vbBlack, D2_COLOR.vbBlack で 頭の修飾が省略された vbBlack が何なのかという話で、 D1_COLOR.vbBlack, D2_COLOR.vbBlack の2つの優先度が同じなので、困っている ということです (´・ω・`) 2025/07/09(水) 14:56:58
Public Sub D1(Optional color As Long = VBA.vbBlack)
にすれば問題ないということなんですね。
As の後に Enum の名前を使えるというのをしらなかったので
VBA.vbBlack の long をつかっていましたが。
最終的には
Public Sub D1(Optional color As D1_COLOR = D1_COLOR.vbBlack)
にしていきたいと思います。
もともとは関数呼び出し時に
引数に何を選択できるのかわからず
ネットで調べて入力していたので
ENUMを使って一覧が表示できるようにしたかっただけなので
(ネイラー) 2025/07/09(水) 15:08:18
既に説明がありましたとおりかと思います。蛇足ですけど一言。
オブジェクトブラウザーで vbBlackを検索してみると Const vbBlack = 0 VBA.ColorConstants のメンバー などと表示されます。 これは、VBAが定義した(色に関する)定数なんですね。
その定数を、enum型の名前として使うことは禁止されている、ということでしょう。 それって定数じゃなくなってしまうから。(別の数値を定義出来てしまったら混乱をきたすでしょう。)
例えば、こんな風にすれば問題なく使えるでしょう。 Enum D1_COLOR cBlack = &H0 '黒 cWhite = &HFFFF00 '白 End Enum (xyz) 2025/07/09(水) 15:18:10
ちょっと被りました
こんな風にしておくと
Enum D1_COLOR d1Black = vbBlack d1White = vbWhite End Enum
Enum D2_COLOR d2Black = vbBlack d2Yellow = vbYellow d2White = vbWhite End Enum
Private Sub CommandButton1_Click() Call D1 End Sub
Public Sub D1(Optional color As D1_COLOR = d1Black)
End Sub
Call D1( まで打ち込んだときに、候補がリストにでるでしょ
名前が被らないようにしておけば、頭の修飾もしなくていいし、候補も出るし、便利だと思います vbなんちゃら のvbの部分は、vbじゃなくて、自分でなんかわかりやすい文字をつけるのがよいとおもいます
>その定数を、enum型の名前として使うことは禁止されている、ということでしょう。 定義はできるので、禁止はされてないですよね。 スコープが違うので、定義は出来ます。 でも修飾がないと、同じスコープで名前が被るので解決できないということなのだと推測してます (´・ω・`) 2025/07/09(水) 15:26:23
ご指摘のとおりでした。定義は可能でした。最初に動作確認したときはエラーが出たんですが、 あらためて実行すると定義自体はできました。大変失礼しました。
(xyz) 2025/07/09(水) 16:00:38
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.