访问VBA搜索循环

时间:2015-07-10 18:15:19

标签: vba ms-access access-vba

我目前正在VBA中为我的数据库进行搜索循环。在这个数据库中,我有2个表,一个包含名为Main的客户记录,另一个包含名为Sparr的搜索词。我们的想法是使用过滤器过滤掉与Sparr表中任何搜索词匹配的客户。任何与任何搜索词都不匹配的客户都会被添加到另一个名为filteredCustomerT的表中。

例如:

table "Main"
Field "Mail"
mike@coolmail.com
john@hotmail.com
dave@mail.com
jonny@mailx.com

table "Sparr"
Field "sparrord"
hotmail
jonny

table "Testtable"
Field "testMail"
mike@coolmail.com
dave@mail.com

因此,如果我运行此VBA代码,我希望过滤掉john@hotmail.comjonny@mailx.comMain表包含200k条记录,Sparr表包含2k条搜索词。我已经编写了一些应该遍历Main表的VBA代码。对于Main表中的每个记录,都有一个循环遍历Sparr表的另一个嵌套循环,所以看看是否有匹配。如果没有匹配项,则VBA代码会将该条目复制到名为Testtable的其他表中。我使用inStr函数进行匹配。

下面我发布了似乎不起作用的VBA代码。任何人都可以帮助我蚂蚁可能指出代码中的错误。我对VBA编程很陌生。

Option Compare Database
Option Explicit

Sub filter()

Dim mainMail As Recordset
Dim sparrSokord As Recordset
Dim testtableTestmail As Recordset
Dim mainTemp As String
Dim sparrTemp As String
Dim match As Integer

Set mainMail = CurrentDb.OpenRecordset("Main")
Set sparrSokord = CurrentDb.OpenRecordset("Sparr")
Set testtableTestmail = CurrentDb.OpenRecordset("Testtable")

Do Until mainMail.EOF

        mainTemp = mainMail![Mail]
        match = 0
        sparrSokord.MoveFirst
        Do Until sparrSokord.EOF
            sparrTemp = sparrSokord![sparrord]

            If (InStr(mainTemp, sparrTemp) <> 0) Then
                match = 1
                Exit Do
            End If


            sparrSokord.MoveNext
        Loop

        If (match = 0) Then
            testtableTestmail.AddNew
            testtableTestmail![testMail] = mainTemp
            testtableTestmail.Update
        End If

mainMail.MoveNext

Loop

End Sub

2 个答案:

答案 0 :(得分:1)

InStr可以以意想不到的方式运行,如果涉及空值/空字符串/等。

我注意到,一旦你到达目的地,你没有将<p>的位置重置回记录集的开头。

当然,你会在SearchwordWord之前做SearchwordWord.MoveFirst之类的事情。在Do Until SearchwordWord.EOF

之前做一个没有坏处

我还会注意到Do Until customerMail.EOF总是执行循环的内容,然后检查最后的条件(这可能会给你意想不到的结果,特别是Do Until在EOF之后第一次成功通过循环。

您可能希望使用SearchwordWord / while代替wend(我几乎从不使用它们)。这可能是你悲痛的最大原因。

答案 1 :(得分:-1)

问题现在解决了。我只需要关闭一些程序,然后再使用上面的更新代码再试一次。工作得很好!