枚举中的数组

时间:2014-08-22 10:57:51

标签: vba ms-access enums access-vba ms-access-2007

我想知道是否可以进行动态枚举。

说明:我有一个函数可以在ms访问中向错误日志添加错误。我的Enum变量中的类别都在表格中。如果我使用如下所示的函数和枚举,它的工作正常。但问题是,类别可能会随着时间而变化。

Enum category
    Category1 = 1
    Category2 = 2
    etc...    = n
End Enum

Public Function AddError(Current_order_ID As Long, Optional Error_Category As category)
'Add the error to the log
End Function

我注意到使用DLookups和记录集,实际上一切都行不通。在编译时,会抛出“内部枚举无效”。咨询MSDN为我提供了以下信息:您试图将字符串或其他一些无效类型指定为Enum成员的值。用于指定Enum成员的常量表达式必须求值为Long或其他枚举类型。

这告诉我,枚举只能包含长类型,因此数字,以及其他枚举类型。

我在寻找:是否有一些解决方法或方法来循环记录集或查询并将值传递给数组,并动态地将这些值分配给枚举。或者也许可以通过更改源代码/ vba文本本身来完成?

注意:我知道还有很多其他方法可以将我的错误添加到日志中我能够这样做,但是知道我只是想知道这是否可能做。

我期待你的反应。

2 个答案:

答案 0 :(得分:3)

Recordset遍历包含Enum类型的表。基本上这是编辑模块VBA代码。

Public Function CreateEnum()
    Dim db As Database
    Dim rs As Recordset

    Set db = CurrentDb
    Set rs = db.OpenRecordset("MYENUMS", dbOpenSnapshot)

    Dim m As Module
    Dim s As String
    Set m = Modules("myEnumsModule")

    s = "Option Compare Database"
    s = s & vbNewLine & "Option Explicit"
    s = s & vbNewLine
    s = s & vbNewLine & "Public Enum MyEnums"
    With rs
        Do Until .EOF
            s = s & vbNewLine & vbTab & .Fields("MYENUM") & " = " & rs.Fields("MYENUM_ID")
            .MoveNext
        Loop
    End With
    s = s & vbNewLine & "End Enum"

    Call m.DeleteLines(1, m.CountOfLines)
    Call m.AddFromString(s)
End Function

答案 1 :(得分:2)

虽然在运行时无法更改Enum类型,但该类型的变量实际上可以存储任何Long值。

Enum category
    Category1 = 1
    Category2 = 2
End Enum


Sub error(err As category)
    Debug.Print err
End Sub

Sub test()
    Dim category3 As Long: category3 = 3
    Call error(category3) ' prints "3"
End Sub

但不,你不能在运行时声明或更新Enum,也不能将数组转换为Enum