簡體   English   中英

當我認為 NoMatch 應該是 False 時訪問 VBA NoMatch = True,我哪里出錯了?

[英]Access VBA NoMatch = True when I think NoMatch should be False, Where am I going wrong?

通過各種善良的靈魂@jericho johnson 和其他人。 我有似乎正在工作的 VBA 代碼。 除了一部分。 最后的“其他”條件,“Do While Not StrSQL1.NoMatch”。 它總是等於真。 即使在第一個 Else 語句中引用的值“StrSQL1.FindFirst ([PrimaryKey] = qs.Fields("external_nmad_id"))”

當我將鼠標懸停在“external_nmad_id”上時,它會顯示一個字符串值。 當我將鼠標懸停在 [PrimaryKey] 上時,它會顯示 '[PrimaryKey]="" '。 空引用集是引用值的記錄集 - 還是表示沒有引用任何內容(因此 NoMatch 始終為 True)。 還是我在其他地方遺漏了什么?

Public Sub EditFinalOutput2()

'set variables
Dim i As Long
Dim intCount As Long
Dim qs As DAO.Recordset
Dim ss As DAO.Recordset
Dim StrSQL1 As DAO.Recordset
Dim IRSfileFormatKey As String
Dim external_nmad_id As String
Dim nmad_address_1 As String
Dim nmad_address_2 As String
Dim nmad_address_3 As String
Dim mytestwrite As String
Dim PrimaryKey As String
Dim box13c_Address As String

'open reference set
Set db = CurrentDb
Set qs = db.OpenRecordset("SunstarAccountsInWebir_SarahTest")

'turn popup messages off
'DoCmd.SetWarnings False

With qs.Fields

intCount = qs.RecordCount - 1
For i = 0 To intCount
'===
'=== Condition 1 Test - validate address
'===
If (IsNull(!nmad_address_1) Or (!nmad_address_1 = !nmad_city) Or 
(!nmad_address_1 = !Webir_Country) And IsNull(!nmad_address_2) Or 
(!nmad_address_2 = !nmad_city) Or (!nmad_address_2 = !Webir_Country) And 
IsNull(!nmad_address_3) Or (!nmad_address_3 = !nmad_city) Or 
(!nmad_address_3 = !Webir_Country)) Then
'=== Address Not Valid, insert into Review table
DoCmd.RunSQL "INSERT INTO Addresses_ToBeReviewed SELECT 
SunstarAccountsInWebir_SarahTest.* FROM SunstarAccountsInWebir_SarahTest 
WHERE (((SunstarAccountsInWebir_SarahTest.external_nmad_id)='" & 
qs!external_nmad_id & "'));"

Else
Set StrSQL1 = db.OpenRecordset("SELECT RIGHT(IRSfileFormatKey, 10) As PrimaryKey, box13c_Address FROM 1042s_FinalOutput_7 WHERE 'PrimaryKey' = 'external_nmad_id';", dbOpenDynaset)
StrSQL1.FindFirst ([PrimaryKey] = qs.Fields("external_nmad_id"))
'===
'=== Condition 2 Test
'===
If StrSQL1.NoMatch Then
    '=== ID Not Found, insert into NotUsed table
    DoCmd.RunSQL "INSERT INTO Addresses_NotUsed SELECT SunstarAccountsInWebir_SarahTest.* FROM SunstarAccountsInWebir_SarahTest WHERE (((SunstarAccountsInWebir_SarahTest.external_nmad_id)='" & qs!external_nmad_id & "'));"

Else
    '=== Address Found, update record
    Do While Not StrSQL1.NoMatch
        StrSQL1.Edit
        StrSQL1.Fields("box13c_Address") = (qs.Fields("nmad_address_1") & qs.Fields("nmad_address_2") & qs.Fields("nmad_address_3"))
        StrSQL1.Update
    Loop
End If
....[more code below]

有幾個問題,這可能是主要的一個:

StrSQL1.FindFirst ([PrimaryKey] = qs.Fields("external_nmad_id"))

FindFirst字符串作為參數。 你所擁有的是一個表達式,它可能總是計算為 False 或 Null,因為[PrimaryKey]是一個未定義的變量,因為它在字符串之外。

它應該是

StrSQL1.FindFirst "[PrimaryKey] = " & CSql(qs.Fields("external_nmad_id").Value)

使用CSql()從這里: https : CSql()
它適用於external_nmad_id是數字或字符串。

要捕獲此類錯誤,請將Option Explicit放在每個模塊的頂部。 它強制執行變量聲明並在編譯時報告未聲明或拼寫錯誤的變量/常量。
要在新模塊中自動使用此功能,請在 VBA 編輯器中設置“ 需要變量聲明”選項。 這確實是 VBA 開發的必備條件。

其他事宜:

1) 將記錄集變量命名為StrSQL1非常令人困惑。

2)

Do While Not StrSQL1.NoMatch

只有在循環中執行.FindNext才有意義。 通常你總是需要If.NoMatch

3)

intCount = qs.RecordCount - 1
For i = 0 To intCount
    ' ...
    qs.MoveNext
Next i

不是進行記錄集循環的好方法 - .RecordCount只能在.MoveLast之后可靠地設置。 改用這個:

Do While Not qs.EOF
    ' ...
    qs.MoveNext
Loop

它更簡單可靠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM