下記コードは実行可能です。  
約10年ほど前、私がVBAの勉強し始めたばかりのころ、経験のあった他言語(C#,VB.net)のように  
Enumのメンバ名を文字列で取得したく思い、知恵を絞って作ったToStrting()です。  
質問は、この時に定義したEnumの使い方になります。

```

    Option Explicit
    
    Enum System
        TypeA = 0
        TypeB
        TypeC
        [_END] = -1
    End Enum
    
    Enum Area
        West = 0
        East
        [_END] = -1
    End Enum
    
    Enum Time
        [09:00] = 0
        [10:00]
        [11:00]
        [12:00]
        [13:00]
        [_END] = -1
    End Enum
    
    Function ToString(Optional ByVal s As System = System.[_END], Optional ByVal A As Area = Area.[_END], Optional ByVal T As Time = Time.[_END]) As String
        Dim w As String
        w = ""
        If Not s = System.[_END] Then
            Select Case s
            Case System.TypeA
                w = "TypeA"
            Case System.TypeB
                w = "TypeB"
            Case System.TypeC
                w = "TypeC"
            End Select
        End If
        If Not A = Area.[_END] Then
            If Not w = "" Then w = w & " "
            Select Case A
            Case Area.East
                w = w & "East"
            Case Area.West
                w = w & "West"
            End Select
        End If
        If Not T = Time.[_END] Then
            If Not w = "" Then w = w & " "
            Select Case T
            Case Time.[09:00]
                w = w & "09:00"
            Case Time.[10:00]
                w = w & "10:00"
            Case Time.[11:00]
                w = w & "11:00"
            Case Time.[12:00]
                w = w & "12:00"
            Case Time.[13:00]
                w = w & "13:00"
            End Select
        End If
       
        ToString = w
    End Function
    
    Sub test()
    
       Dim E1 As System
       Dim E2 As Area
       Dim E3 As Time
       
       For E1 = System.TypeA To System.TypeC
        For E2 = Area.West To Area.East
            For E3 = Time.[09:00] To Time.[13:00]
                 Debug.Print ToString(E1, E2, E3)
            Next E3
        Next E2
       Next E1
    
    End Sub
    
    
    
```

●質問１  
本コードでEnum定義時に[]（角カッコ）を使うとコンパイルエラーを回避できるのは、予約語のエスケープが効いているからでしょうか？  
類似と思われる理由をＭＳのサイト（*1）から見つけましたが、とくにTimeでの使い方 [09:00]が、記載内容の趣旨と異なると感じ、疑問に思っています。

*1:  
<https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-
reference/keywords/>

> 次のキーワードは 予約済み であり、プログラミングの要素 (変数やプロシージャなど) の名前として  
>  使用できません。  
>  ただし、名前を角かっこ ([]) で囲むと、この制約を回避できます。 詳細については、  
>  「宣言された要素の名前」の「エスケープされた名前」を参照してください。

●質問２ MSからの注意喚起(*2)のように、あまり使わないほうが良いのでしょうか？

*2:  
<https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-
guide/language-features/declared-elements/declared-element-names>

> エスケープされた名前  
>  一般に、要素名は、Visual Basic によって予約されているキーワード (Case や Friend など)  
>  と一致しないようにする必要があります。 ただし、エスケープされた名前 を定義できます。これは、  
>  角かっこ ([ ]) で囲まれています。 エスケープされた名前は、角かっこによってあいまいさが解消されるため、  
>  どの Visual Basic キーワードとも一致させることができます。  
>  また、コード内で後で名前を参照するときにも、角かっこを使用します。  
>  通常、エスケープされた名前は、次の場合にのみ使用してください。  
>  コードが、名前として使用されるキーワードを予約しなかった以前のバージョンの  
>  Visual Basic から移行された。または、指定されたキーワードが予約されていない別の言語で  
>  記述されたコードを操作している。  
>  それ以外の場合、名前がキーワードと競合する場合は、要素の名前を変更することを検討してください。  
>  統合開発環境 (IDE) を使用すると、この操作を簡単に 実行できます。  
>  詳細については、リファクタリングに関するページを参照してください。

参考：Enumステートメントの説明文書  
<https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-
interface-help/enum-statement>

このコードを作成した当時は、VBA初心者でしたので、コードが動くことに感動し、理由（知識）を深めず終わっていました。（お恥ずかしい限りです。）  
最近になって自分のコードを見直した時、なぜ角かっこ ([ ]) が有効だったのか、これでよかったのかを知りたくなりました。  
ご存じの方いらっしゃれば教えていただけると幸いです。
CC BY-SA 4.0
2021-09-11T14:15:01.540
82428
2022-11-30T09:02:25.363
48161
question
vba
VBAのEnumステートメントでメンバー名を角かっこ ([ ]) でくくった場合、エスケープされた名前として扱われているのか？この手法は使わない方がよいのか？
質問はVBAですが、参照されているドキュメントはあくまでVBのものです。あくまでVBにおける見解を説明します。

**エスケープされた名前は、角かっこによってあいまいさが解消される**

が基本です。あいまいさが解消されるため、予約済みキーワードも名前として使用できる、これは使用方法の一例でしかないです。  
逆に言えば、予約済みキーワードだけを名前として扱えるようにする専用機能だとは書かれていません。

> あまり使わないほうが良いのでしょうか？

同ページによれば、名前はアルファベット・数字・`_`のみとされています。変数名に日本語を使用した時点でルールから逸脱しています…が、このルールには従わず、日本語が使用されている例をそこそこ見かける気がします。  
ですので、どこまでルールに従うか、かなり曖昧かと思われます。

ただし、`ToString`実現のために`Enum`に特殊な名称を使うのは微妙です。配列等、別の手段も検討すべきです。

* * *

VBA側のドキュメントを確認しましたが、エスケープされた名前についての説明は見つけられませんでした。一応、
[同じ名前のプロシージャを呼び出す](https://docs.microsoft.com/ja-
jp/office/vba/language/concepts/getting-started/calling-procedures-with-the-
same-name) に使用例はありましたから、有効な機能だとは思いますが。

>
```

>     Sub Main()
>         [MyProject.vbp].[MyModule].Main
>     End Sub
>  
```
CC BY-SA 4.0
2021-09-12T00:34:02.137
82435
2021-09-12T00:34:02.137
4236
82428
answer