[[20250709132539]] 『これはなぜだめなのですか』(ネイラー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『これはなぜだめなのですか』(ネイラー)

以下のコードはなぜコンパイルエラーが発生するのでしょうか?

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


vbBlack, D1_COLOR.vbBlack, D2_COLOR.vbBlack
それぞれ別物だと思ったのですが
コンパイラーにとっては区別ができないもの
ということですね。

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

vbBlack は VBA.vbBlack のことなんですね。
理解しました。

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.