DLookup如何在这种情况下工作?

时间:2017-09-18 10:02:13

标签: vba access-vba

新用户:)

我在下面的代码中遇到了关于DLookup的问题。该代码假设仅允许所选用户打开表单。用户在tbl中,并且On Error Resume Next代码正在运行,允许用户访问应用程序,但是当我注释On Error时,我得到运行时错误' 13':类型不匹配。我希望有人解释为什么它会因On Error注释而失败。我理解If语句需要一个条件来评估,那么如何获取用户名允许应用程序打开表单?

Private Sub Form_Open(Cancel As Integer)

On Error Resume Next

If DLookup("[CitrixID]", "tbl_UserAccess", "[CitrixID] = " & "'" & Environ("username") & "'") Then

Else

MsgBox "You do not have permission to access the application"

DoCmd.Close

End If

End Sub

2 个答案:

答案 0 :(得分:2)

这真的不是这样做的方法,但我会解释它的作用。

DLookUp从表中查找值。在您的情况下,它会从表CitrixID中查找CitrixID CitrixID,其中If等于用户名。然后它返回该用户名作为If语句的条件。

True语句要求条件为FalseNullOn Error Resume Next或数值(0 =假,所有其他数字为truthy)计为错误,而不是Windows用户名,这就是错误发生的原因。

如果您使用If,如果DLookup返回字符串,您实际上会跳转到Null语句,因为这是下一件事。但是,如果它返回Null,因为它无法找到该用户名,但不会触发错误,因为Public Sub TestIfResumeNext() If Null Then Debug.Print Null End If On Error Resume Next If "A" Then Debug.Print "A" End If If 1 Then Debug.Print 1 End If If 0 Then Debug.Print 0 End If If -1 Then Debug.Print -1 End If End Sub 是一个有效的值,会被转换为false。

一些示例代码可帮助您理解这一点:

"A"

由于错误捕获,1-1会返回Null,因为它们是真实的,但不是0,因为这是有效的假法价值,而不是DLookUp出于同样的原因。

如果您不想依赖此错误捕获行为,但希望保留其余逻辑,则只需将DCount替换为0即可。由于0是假的,你甚至不需要检查它是否If DCount("[CitrixID]", "tbl_UserAccess", "[CitrixID] = " & "'" & Environ("username") & "'") Then (但这样做是一种很好的做法)。

If DCount("[CitrixID]", "tbl_UserAccess", "[CitrixID] = " & "'" & Environ("username") & "'") <> 0 Then

或者,与比较

If Not

请注意,您现在可以使用If DCount = 0Else缩短它并移除 public RequestCreator requestCreatorFromUrl(String picUrl) { return Picasso.with(mCtx).load(picUrl); }

答案 1 :(得分:1)

DLookup返回 Null 表示&#34;未找到&#34;所以你需要的只是检查:

Private Sub Form_Open(Cancel As Integer)

    If IsNull(DLookup("[CitrixID]", "tbl_UserAccess", "[CitrixID] = '" & Environ("username") & "'")) Then
        MsgBox "You do not have permission to access the application."
        DoCmd.Close
    End If

End Sub