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