比较2张不同的标题

我有两个不同的文件,头文件不同,例如:

OldfileHeaders | NewFileheaders ID | Test ID Date | New date 

等等。 我试图比较两张表中的数据,看看它们是否匹配。 数据行可能以不同的顺序,并且标题也可能以不同的顺序。

所以我想要做的是:1)定义哪些头匹配2个文件之间的哪个头2)从旧文件中查找ID,看看它是否在新文件中,如果是,那么看看每个头下的数据火柴。 如果不存在,则将该行数据导出到新工作表中,添加一列并将其标记为“丢失”。

守则迄今为止:

 Set testIdData = testIdData.Resize(testIdData.CurrentRegion.Rows.Count) Do Until sourceId.Value = "" datacopy = False ' Look for ID in test data Set cellFound = testIdData.Find(What:=sourceId.Value, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False) If cellFound Is Nothing Then ' This entry not found, so copy to output datacopy = True outputRange.Resize(ColumnSize:=NUMCOLUMNS).Interior.Color = vbRed Else ' This assumes that columns are in same order For columnNum = 2 To NUM_COLUMNS_DATA ' No need to test the ID column If sourceId.Cells(ColumnIndex:=columnNum).Value <> cellFound.Cells(ColumnIndex:=columnNum).Value Then outputRange.Cells(ColumnIndex:=columnNum).Interior.Color = vbYellow datacopy = True End If Next columnNum End If If datacopy Then sourceId.Resize(ColumnSize:=NUMCOLUMNS).Copy outputRange.PasteSpecial xlPasteValuesAndNumberFormats Application.CutCopyMode = False Set outputRange = outputRange.Offset(RowOffset:=1) difference = difference + 1 End If Set sourceId = sourceId.Offset(RowOffset:=1) Loop 

这段代码的工作取决于我以正确的顺序格式化工作表并更改标题名称。

我需要帮助定义哪些字段名称匹配2张表中的哪些字段名称,然后在新的表格中search每个ID并查看相应单元格中的数据是否匹配。 如果ID不在表格中,那么输出该行也是不同的表格。 如果身份证是存在的,并在细胞的差异,然后出这些无耻的表。 我想在每一列中产生一个差异的统计。

匹配数据集之间的数据需要你给程序一些帮助。 在这种情况下,所需的帮助是哪些列是相互关联的。 你已经确定了一个如何标题相关的小表。 有了这个,你可以做从数据源1到数据源2的各种翻译。它需要大量使用Application.MatchApplication.VLookup

我将提供一个基本的例子,它是你所要做的核心。 在一张纸上看到这一切就更容易了,而这正是我所做的。

数据的图片显示了三个表:rng_headers,rng_source和rng_dest。 一个是头文件的查找,第二个是“源”数据,第三个是我要调用destination =“dest”的数据源。

开始数据

代码包括以下步骤:遍历源数据中的所有ID,检查它们是否存在于dest数据中,如果是,则检查所有单个值是否相等。 这段代码检查每一步(这是缓慢的)的标题,但是允许数据乱序。

 Sub ConfirmHeadersAndMatch() Dim rng_headers As Range Set rng_headers = Range("B3").CurrentRegion Dim rng_dest As Range Set rng_dest = Range("I2").CurrentRegion Dim rng_source As Range Set rng_source = Range("E2").CurrentRegion Dim rng_id As Range 'first column, below header row For Each rng_id In Intersect(rng_source.Columns(1).Offset(1), rng_source) Dim str_header As Variant str_header = Application.VLookup( _ Intersect(rng_id.EntireColumn, rng_source.Rows(1)), _ rng_headers, 2, False) 'get col number Dim int_col_id As Integer int_col_id = Application.Match(str_header, rng_dest.Rows(1), 0) 'find ID in the new column Dim int_row_id As Variant int_row_id = Application.Match(rng_id, rng_dest.Columns(int_col_id), 0) If IsError(int_row_id) Then 'ID missing... do something rng_id.Interior.Color = 255 Else Dim rng_check As Range 'all values, same row For Each rng_check In Intersect(rng_source, rng_id.EntireRow) 'get col number str_header = Application.VLookup( _ Intersect(rng_check.EntireColumn, rng_source.Rows(1)), _ rng_headers, 2, False) int_col_id = Application.Match(str_header, rng_dest.Rows(1), 0) 'check value If rng_check.Value <> rng_dest.Cells(int_row_id, int_col_id).Value Then 'values did not match... do something rng_dest.Cells(int_row_id, int_col_id).Interior.Color = 255 End If Next rng_check End If Next End Sub 

关于代码的说明

  • 范围build立在挑选出数据块的CurrentRegion上。 你可以在不同的纸张上换出不同的范围。
  • 使用Application.VLookup完成列标题转换,以检查源标题并返回目标标题。 然后使用Application.Match在目标标题行中find此String 。 你可以把这个代码抽象成一个Function来避免重复两次。
  • find列后,使用Application.Match在目标表中searchID。 这将返回一个错误,如果没有findID。
  • 如果findID,则会检查同一行中的所有其他值,并将它们与目标表中的正确列进行比较。 不匹配的结果是红色的。
  • 如果所有列都没有配对,则可以在VLookup或列Match上添加额外的检查来检查。
  • 绝大多数代码只是使用IntersectRowsColumns来处理数据中的正确位置。

结果显示ID未find的一些红色值和不匹配的值。

结果