1

像往常一样,在最终屈服并寻求帮助之前,我已经浪费了几个小时来解决问题,所以任何帮助都将不胜感激!

我正在Test1我的数据表上运行一个while循环,以便将数据复制到Test2参数匹配的表上的特定行,但我目前这样做的方式是循环遍历表2的每一行 - 两张表数据超过 50,000 行,因此虽然我的方法非常适合我的 10 行测试,但要花几个小时才能处理完整数据。我想知道是否有人可以简化我的代码,理想情况下它可以搜索匹配的行而不是比较每一行?

我尝试过使用Find,但无法使用多个参数。

这是我当前的代码,我省略了设置参数设置以节省空间的部分,但它们存在于我的工作表中:

While row1 <= lastRow1
    Param1 = Sheets("Test1").Cells.Range("A" & row1).Value
    Param2 = Sheets("Test1").Cells.Range("B" & row1).Value
    Param3 = Sheets("Test1").Cells.Range("D" & row1).Value
    Param4 = Sheets("Test1").Cells.Range("E" & row1).Value
    Param5 = Sheets("Test1").Cells.Range("F" & row1).Value
    Cell_to_copy = Sheets("Test1").Cells.Range("G" & row1).Value
*****THIS IS THE BIT I WANT TO OPTIMISE************
        For row2 = 2 To lastRow2
            KParam1 = Sheets("Test2").Cells.Range("A" & row2).Value
            KParam2 = Sheets("Test2").Cells.Range("B" & row2).Value
            KParam3 = Sheets("Test2").Cells.Range("I" & row2).Value
            KParam5 = Sheets("Test2").Cells.Range("G" & row2).Value
                If (InStr(1, KParam1, Param1) > 0) _
                And ((InStr(1, KParam2, Param2) > 0) Or (InStr(1, Param2, KParam2) > 0)) _
                And ((InStr(1, KParam3, Param3) > 0) Or (InStr(1, KParam3, Param4) > 0)) _
                And (InStr(1, KParam5, Param5) > 0) _
                Then
                    Sheets("Test2").Cells.Range("L" & row2).Value = Cell_to_copy
                End If
        Next row2
****************************************************
        row1 = row1 + 1
Wend

我想更改中间部分以执行搜索功能来查找与If查询匹配的行,然后将其复制Cell_to_copy到该行的单元格 L。

这可能吗?如果绝对必要,我可以将可搜索的值连接Test2到一个单元格中,但如果可以避免,我宁愿不这样做,因为它会匹配一些误报。

提前致谢,

4

1 回答 1

2

好的,所以规则似乎是,如果

Test1.column A is found inside Test2.column A
Test1.column B is found inside Test2.column B
Test1.column D is found inside Test2.column I
Test1.column E is found inside Test2.column I
Test1.column F is found inside Test2.column G

然后将Test1.column G复制Test2.Column L

是对的吗?

为什么不能使用 Sheet2 上的公式来做到这一点?

也许:Test2.Column L 公式 ==IF(FIND(A:A,Sheet1!A:A)>0,Sheet1!G:G)

该公式需要OR与其他条件一起检查其他列 - 午餐后尝试!

如果没有,那么好的,我认为我们需要考虑使用 ADO 并将工作表视为 db 表。

如果你展示你的源数据是什么样的,以及你需要的结果,我可以尝试为你编写一个示例,但到目前为止,最好的选择是让你学习使用下面的链接钓鱼。

请参阅此处:MSDN KB:如何将 ADO 与 Visual Basic 或 VBA 中的 Excel 数据一起使用

另请阅读:在Excel 用户 MVP 网站上将 Excel 视为关系数据源

另请阅读:办公空间:使用 ADO 查询 Excel 电子表格

基本上任务是将您需要的过滤数据读入 ADO 记录集,然后使用 CopyFromRecordset 方法一步将结果转储到 Sheet2

所以你有一些阅读要做,如果你需要一个例子或更多帮助,请告诉我们

菲利普

于 2013-04-05T11:50:39.517 回答