VBA Excel比较两个匹配的列表,单独工作表上的输出结果

情况如下:

我正在validation数据库中的机构数据。 每个机构都有一个相关的代码。 我想确保我们的数据库中的代码是正确的,并检查数据库中的名称是否包含错误。 我会手动这样做,但有1200个logging要检查。

我所有的数据都包含在一个工作簿中。

  • 第一张是我们的数据库中的信息。 机构名称在B列,代码在K列。代码存储为一个数字。
  • 第二张是最新的信息。 机构名称在列A中,代码在列D中。代码也以数字forms存储。
  • 第三张纸是为结果设置的

我想在第一张表中的代码与第二张表中的代码相匹配,然后在第三张表上输出结果。 我希望每个代码都有一行,其中包含:来自工作表1的机构名称,代码和来自第二个工作表的机构名称。 我想这样做,以便我可以检查代码是否有效,我们的数据库中的代码对应于正确的机构,最后,我可以检查机构名称格式和其他差异。

这是我的问题:

  1. 我创build了一个副本来testing代码,而不是使用原始工作簿,并以某种方式损坏数据。 我编写了一个在testing文件中工作的程序,但是当我将它复制到原始文件中进行任何适当的更改时,代码不再有效。 为什么会这样?
  2. 由于复制代码似乎产生了一些问题,我逐字地将代码重新input到原始文件中。 有效。 但是,只有一点。 代码运行,但只会执行条件中包含的部分代码。 它会执行块中的第一行,但是跳过其余部分,然后再次不input条件。 由于一切正常缩进,可能会导致这种情况发生?
  3. 为了检测为什么会出现所有这些问题,我尝试了使用F8单步执行程序。 它通过,但从来没有进入条件。 它只是遍历循环。 使用Step Into(F8)命令时,是否不评估IF语句?
  4. 为了testing我的循环是否正常工作,而不是遍历所有logging,并且必须等待,我将把FOR循环条件从1170改为11.除了循环运行的次数外,没有任何变化。 然而,程序不再执行。 当我改变数字,它的作品。 为什么会这样?

这是我的代码。 它可能不是最优的,但我只需要运行比较ONCE。 即使花费了2个小时,也不如手动检查全部。 我知道这个代码的作品,因为我得到它在testing文件中工作。 但是,为什么它不能在原来的工作,我能做些什么来使其工作?

Sub FindMatches() Dim oldRow As Integer Dim newRow As Integer Dim i As Integer i = 2 For oldRow = 2 To 1170 For newRow = 2 To 1170 If Worksheets("Sheet1").Cells(oldRow, 9) = Worksheets("Sheet2").Cells(newRow, 4) Then Worksheets("Sheet3").Cells(i, 1) = Worksheets("Sheet1").Cells(oldRow, 2) Worksheets("Sheet3").Cells(i, 2) = Worksheets("Sheet1").Cells(oldRow, 9) Worksheets("Sheet3").Cells(i, 3) = Worksheets("Sheet2").Cells(newRow, 1) i = i + 1 Exit For End If Next newRow Next oldRow End Sub 

我想你正在引用错误的列。 K列是11而不是9

也许使用Find()而不是内部循环:

 Sub FindMatches() Dim shtOld As Worksheet, shtNew As Worksheet, shtMatch As Worksheet Dim oldRow As Integer Dim newRow As Integer Dim i As Integer, id, f As Range i = 2 Set shtOld = ThisWorkbook.Sheets("Sheet1") Set shtNew = ThisWorkbook.Sheets("Sheet2") Set shtMatch = ThisWorkbook.Sheets("Sheet3") For oldRow = 2 To 1170 id = shtOld.Cells(oldRow, 9) Set f = shtNew.Range("D2:D1170").Find(id, , xlValues, xlWhole) If Not f Is Nothing Then With shtMatch.Rows(i) .Cells(1).Value = shtOld.Cells(oldRow, 2) .Cells(2).Value = id .Cells(3).Value = f.EntireRow.Cells(1) End With i = i + 1 End If Next oldRow End Sub