Excel VBA - 设置枚举元素的值

che*_*eak 12 excel enums vba excel-vba

在类模块中有

Private Enum colType
    ID = "A"
    SSN = "B"
    lName = "H"
    fName = "G"
End Enum
Run Code Online (Sandbox Code Playgroud)

作为私人会员.每当类初始化时,我都会收到 Compile Error:Type Mismatch消息.如果我宣布colTypePrivate Enum coltype As String.这会突出显示为红色错误,我收到编译错误:预期的语句结束消息.

在excel VBA中指定枚举元素的值是不允许的?

ex-*_*man 12

正如评论中所写,这是不可能的.虽然我过去使用过,但仍有可能的解决方法.有:

Private Enum colType
  ID = 1
  SSN = 2
  lName = 3
  fName = 4
End Enum
Run Code Online (Sandbox Code Playgroud)

然后创建一个单独的String属性,例如:

Public Property Get colType_String(colType) as String
  Dim v as Variant
  v= Array("A","B", ...)
  colType_String = vba.cstr(v(colType))
End Property
Run Code Online (Sandbox Code Playgroud)

这不是最通用的解决方案,但它很容易实现,它可以完成工作......如果你已经在类模块中使用了这个,你甚至可以在私有colType变量上使用属性,并且不需要将colType输入到财产.


Ric*_*ing 10

在某些情况下,我非常喜欢前人的解决方案,因此我赞成了它.更经常提出的解决方案如下:

Enum myEnum
  myName1 = 1
  myName2 = 2
  myName3 = 3
End Enum

Function getEnumName(eValue As myEnum)
  Select Case eValue
  Case 1
    getEnumName = "myName1"
  Case 2
    getEnumName = "myName2"
  Case 3
    getEnumName = "myName3"
  End Select
End Function
Run Code Online (Sandbox Code Playgroud)

Debug.Print getEnumName(2) prints "myName2"


小智 5

我已经寻找这个问题的答案很长时间了。我不想在 Case 语句或数组中重新列出 Enum 的内容。我找不到答案,但在找到代码以更改模块内容后,我设法做到了。对其进行更改后,生成了以下工作代码,并将其放置在 Module1 中:

    Option Explicit

    Enum MensNames
        Fred
        Trev = 5
        Steve
        Bill = 27
        Colin
        Andy
    End Enum

    Sub EnumStringTest()
        MsgBox EnumString(Steve) & " = " & Steve
    End Sub

    Function EnumString(EnumElement As MensNames) As String
        Dim iLineNo As Integer
        Dim iElementNo As Integer

        iElementNo = 0
        EnumString = vbNullString
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
            ' Find the Enum Start
            For iLineNo = 1 To .CountOfLines
                If InStr(.Lines(iLineNo, 1), "Enum MensNames") > 0 Then
                    Exit For
                End If
            Next iLineNo

            ' Find the required Element
            iLineNo = iLineNo + 1
            Do While InStr(.Lines(iLineNo, 1), "End Enum") = 0 And .Lines(iLineNo, 1) <> ""
                If InStr(2, .Lines(iLineNo, 1), "=") > 0 Then
                    iElementNo = CLng(Mid(.Lines(iLineNo, 1), InStr(2, .Lines(iLineNo, 1), "=") + 1))
                End If
                If iElementNo = EnumElement Then
                    EnumString = Left(Trim(.Lines(iLineNo, 1)), IIf(InStr(1, Trim(.Lines(iLineNo, 1)), " ") = 0, 1000, InStr(1, Trim(.Lines(iLineNo, 1)), " ") - 1))
                    Exit Do
                End If
                iElementNo = iElementNo + 1
                iLineNo = iLineNo + 1
            Loop
        End With
    End Function
Run Code Online (Sandbox Code Playgroud)

  • 很棒,但是很疯狂?:) 感谢分享! (4认同)