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消息.如果我宣布colType为Private 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)
| 归档时间: |
|
| 查看次数: |
30879 次 |
| 最近记录: |