【问题标题】:Access VBA recordset string comparison not working with wildcard访问 VBA 记录集字符串比较不适用于通配符
【发布时间】:2015-03-03 21:40:39
【问题描述】:

我有大量在 Excel 中使用 VBA 的经验,但在 Access 2010 中使用 VBA 的经验很少。我正在尝试从其中一个字段以“_X”结尾的记录集中删除记录。当我使用通配符时,比较失败。当我使用特定字符串时,比较按预期工作。这是我正在使用的代码。

Dim db As Database: Set db = CurrentDb
Dim tbl As Recordset: Set tbl = db.OpenRecordset("WRITEON")
With tbl
    Do Until .EOF
        If ![ACOD] = "*_X" Then '"$ICP_X" works
            Debug.Print ![ACOD] 'For testing
            '.Delete
        End If
    .MoveNext
    Loop
End With
tbl.Close 

【问题讨论】:

    标签: string ms-access vba recordset


    【解决方案1】:

    在将文本值与模式进行比较时,请使用 Like 而不是 =

    If ![ACOD] Like "*_X" Then
        Debug.Print ![ACOD]
    End If
    

    这应该可以满足您的要求,但我不确定评估记录集中的每条记录以删除匹配项是最好的方法。您可以通过执行 DELETE 查询来实现相同的结果,该查询使用相同的模式来确定应删除哪些行。

    DELETE FROM WRITEON
    WHERE [ACOD] Like "*_X";
    

    【讨论】:

    • 使用“赞”就像一种魅力。我发布这个问题主要是出于沮丧。我已经走了“DELETE”查询路线。这是我改用的:Dim SQL As String SQL = "DELETE * FROM WRITEON WHERE WRITEON.ACOD Like '*_X'" DoCmd.SetWarnings False DoCmd.RunSQL SQL DoCmd.SetWarnings True
    • 好的,我现在明白了。谢谢。考虑使用CurrentDb.Execute SQL, dbFailOnError 而不是DoCmd.RunSQL。使用该方法,您无需关闭SetWarnings。关闭SetWarnings 时,您可以隐藏可能有助于故障排除的信息。
    • 很好的建议!谢谢你。使用SetWarnings off/on 解决方法我绝对不舒服。你的方法好多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多