使用序列1,2,4,8,16,32,64.124等解码错误代码。在Access VBA中

时间:2017-09-17 19:56:35

标签: vba ms-access access-vba

要验证用户输入,我在Access VBA中使用不同的功能,这些功能都可能产生错误代码。主函数创建所有错误代码的总和并将其返回给请求过程。作为错误代码,我使用二进制序列来创建唯一的返回码(1,2,4,8,16,32,64,128等) 任何人都可以帮我一个简单的VBA代码来解码返回代码,看看发生了哪些错误,例如提供数组中的所有错误代码? 例如:错误274是2,16和256的结果 看了几个小时,但我能找到的任何东西都写在另一个代码中,如C#,Perl等(我无法改为VBA) THX!

4 个答案:

答案 0 :(得分:3)

这是一个典型的greedy algorithm。这样的事情可以帮助你开始:

Public Sub TestMe()

    Dim lngInput        As Long
    Dim lngTry          As Long
    Dim lngReduce       As Long: lngReduce = 10

    lngInput = 274

    While lngInput > 0
        lngTry = 2 ^ lngReduce
        lngReduce = lngReduce - 1
        If lngInput \ lngTry > 0 Then
            lngInput = lngInput - lngTry
            Debug.Print lngTry
        End If
    Wend

End Sub

您将在控制台中打印256,16,2。

答案 1 :(得分:3)

我使用此函数来确定标志枚举是否具有给定标志 - 似乎适用于您的情况:

Public Function HasFlag(ByVal value As Long, ByVal flag As Long) As Boolean
    HasFlag = (value And flag) = flag
End Function

它基本上只是一点点抽象的小抽象。

这样您就可以使用自定义错误代码定义枚举:

Public Enum CustomErrors
    ERR_None = 0
    ERR_Foo = 2 ^ 0
    ERR_Bar = 2 ^ 1
    ERR_Fizz = 2 ^ 2
    ERR_Buzz = 2 ^ 3
    ERR_Something = 2 ^ 4
    ERR_SomethingElse = 2 ^ 5
    ERR_AnotherThing = 2 ^ 6
    ERR_SomethingWrong = 2 ^ 7
    '...
End Enum

然后如果你得到274并且需要知道它是否包含ERR_Something,你可以这样做:

If HasFlag(Err.Number, ERR_Something) Then
   ' handle ERR_Something
End If
If HasFlag(Err.Number, ERR_Bar) Then
   ' handle ERR_Bar
End If

或者你的船上的任何岩石/适合你的需求。您可以创建一个迭代所有可能错误代码的函数,并返回一个数组或集合,其中包含HasFlag返回True的所有代码。

注意:应将自定义错误代码添加到vbObjectError,以确保您不会遮挡/重叠内置错误编号,这可能非常令人困惑。因此,如果您打算将它们与Err.Raise一起使用,我建议您执行Err.Raise vbObjectError + theCustomErrorCode,并在检查其标记时从错误代码中减去vbObjectError。这样,当您收到错误13时,您知道它是类型不匹配,而不是自定义标记错误。

答案 2 :(得分:1)

这样的事情?

Option Explicit

Sub errDecode()

    Dim errCode As Integer:   errCode = 13
    Dim errText As Variant:   errText = Array("error0", "error1", "error2", "error3", "error4", "error5", "error6", "error7")

    Dim i As Integer
    For i = 7 To 0 Step -1
        If (errCode And (2 ^ i)) > 0 Then Debug.Print errText(i),
    Next i

    Debug.Print

End Sub

答案 3 :(得分:0)

对此感兴趣。基于你的例子,我提出了以下函数,它起作用。所有错误代码现在都放入数组AppErrCodes

Public Function AppErrCodes(lngRetCode As Long)
    On Error Resume Next
    Dim lngResult As Long
    Dim lngReduce As Long
    Dim lngTempResult() As Long
    Dim i As Integer

    lngReduce = 50 'increase this number when > 50 error codes are expected
    While lngRetCode > 0
        lngResult = 2 ^ lngReduce
        lngReduce = lngReduce - 1
        If lngRetCode \ lngResult > 0 Then
            lngRetCode = lngRetCode - lngResult
            'Debug.Print lngResult
            If lngResult > 0 Then
                ReDim Preserve lngTempResult(i)
                lngTempResult(i) = lngResult
                i = i + 1
                'Debug.Print lngTempResult(i)
            End If
        End If
    Wend
    AppErrCodes = lngTempResult
End Function