我有2个不同的文件,它们有不同的标题,例如:
OldfileHeaders | NewFileheaders
ID | Test ID
Date | New date
等等。我试图比较两张纸上的数据,看看它们是否匹配。数据行可以按不同的顺序排列,标题也可以按不同的顺序排列。
所以我想做的是: 1)定义哪些标头匹配2个文件之间的哪些标头 2)从oldfile中查找ID并查看它是否在新文件中,如果是,则查看每个头下的数据是否匹配。如果没有,则将该行数据导出到新工作表中,添加一个列并将其标记为“Missing”。
到目前为止的守则:
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张中的哪些字段名称匹配,然后在新工作表中搜索每个ID并查看相应单元格中的数据是否匹配。如果ID不在工作表中,则输出该行也是另一个工作表。如果id存在并且单元格中存在差异,则将这些内容放入羞耻表。我想在每一栏中产生一些差异。
答案 0 :(得分:0)
在数据集之间匹配数据需要您为程序提供一些帮助。在这种情况下,所需的帮助是哪些列彼此相关。您已经确定了一个关于标头如何相关的小表。有了这个,您可以执行从数据源1到数据源2的各种转换。它需要大量使用Application.Match
和Application.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
有关代码的说明
CurrentRegion
上,用于挑选数据块。您可以在不同的纸张上将它们换成不同的范围。Application.VLookup
完成列标题转换,以检查源标头并返回目标标头。然后,使用String
在目标标题行中找到此Application.Match
。您可以将此代码抽象为Function
,以避免重复两次。Application.Match
在目标表中搜索ID。如果找不到ID,这将返回错误。VLookup
或列Match
上添加其他检查以进行检查。Intersect
,Rows
和Columns
来处理数据中的正确位置。结果显示未找到ID的红色值和不匹配的值。