嵌套Dlookup VBA
我试图在消息框中显示供应商名称和一条消息,说明所选采购订单编号(来自表单上的组合框)不需要QA。从PO编号中获取供应商编号的DLookup是有效的,但我似乎无法嵌套它以从单独的表中获取供应商名称字符串。我在这个嵌套的DLookup中遗漏了什么 采购订单编号、供应商编号和供应商名称都是字符串嵌套Dlookup VBA,vba,ms-access,dcount,dlookup,Vba,Ms Access,Dcount,Dlookup,我试图在消息框中显示供应商名称和一条消息,说明所选采购订单编号(来自表单上的组合框)不需要QA。从PO编号中获取供应商编号的DLookup是有效的,但我似乎无法嵌套它以从单独的表中获取供应商名称字符串。我在这个嵌套的DLookup中遗漏了什么 采购订单编号、供应商编号和供应商名称都是字符串 Private Sub VendorName_AfterUpdate() Debug.Print Me.VendorName.Value If DCount("*", "ZeroAudit
Private Sub VendorName_AfterUpdate()
Debug.Print Me.VendorName.Value
If DCount("*", "ZeroAudit", "PONumber='" & Me.PONumber & "' and VendorName='" & Me.VendorName & "'") = 0 Then
MsgBox "Needs QA"
Else
MsgBox "Vendor " & DLookup("Vendor", "Vendors", "VendorNumber = " & (DLookUp("VendorNumber","POHeader","PONumber= [Forms]!QAChecker2!PONumber.Value"))) & " — Does NOT Need QA — DIM and RETAIL CHECK REQUIRED"
End If
Me.PONumber.SetFocus
End Sub
你说:
采购订单编号、供应商编号和供应商名称均为字符串
因此,您需要将DLookup
标准用单引号括起来,例如:
DCount("*", "ZeroAudit", "PONumber='" & Me.PONumber & "' and VendorName='" & Me.VendorName & "'")
这里还需要单引号:
DLookup("Vendor", "Vendors", "VendorNumber = '" & DLookUp("VendorNumber","POHeader","PONumber= [Forms]!QAChecker2!PONumber.Value") & "'")
^ ^
| |
Added single quotes -----+----------------------------------------------------------------------------------------+
但我也要回应@Mathieu Guindon关于使用局部变量代替内联DLookup
表达式的评论
考虑以下代码的易读性-
Private Sub VendorName_AfterUpdate()
Dim strVen As String
Dim strVNo As String
If DCount("*", "ZeroAudit", "PONumber='" & Me.PONumber & "' and VendorName='" & Me.VendorName & "'") = 0 Then
MsgBox "Needs QA"
Else
strVNo = DLookup("VendorNumber", "POHeader", "PONumber = [Forms]!QAChecker2!PONumber")
strVen = DLookup("Vendor", "Vendors", "VendorNumber = '" & strVNo & "'")
MsgBox "Vendor " & strVen & " — Does NOT Need QA — DIM and RETAIL CHECK REQUIRED"
End If
Me.PONumber.SetFocus
End Sub
您还可以使用
Nz
表达式包围DLookup
表达式以捕获空值,并在继续之前测试空字符串。这一点鲜为人知,但您也可以在筛选器中使用SQL:
DLookup("Vendor", "Vendors", "VendorNumber = (Select VendorNumber From POHeader Where PONumber = [Forms]!QAChecker2!PONumber.Value)")
为什么要把所有的东西都放进去?将内部
DLookup
结果捕获到局部变量中,然后在外部变量中使用该变量-将外部结果的结果捕获到其自己的变量中,并将其发送到MsgBox
。如果每个指令一次只做一件事,调试就会容易得多…我对VBA很陌生,但我完全支持使调试变得简单!你能告诉我那是什么样子吗?将vendorNumber变暗为字符串
,然后vendorNumber=DLookup(“vendorNumber”,…)
;然后Dim vendor As String
,以及vendor=DLookup(“vendor”、“Vendors”、“VendorNumber=”&VendorNumber)
——这样,您就可以知道哪一个失败了,也可能更容易看出原因。