Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 比较具有不同标题的两张图纸_Vba_Excel_Compare - Fatal编程技术网

Vba 比较具有不同标题的两张图纸

Vba 比较具有不同标题的两张图纸,vba,excel,compare,Vba,Excel,Compare,我有两个不同的文件,它们有不同的标题,例如: OldfileHeaders | NewFileheaders ID | Test ID Date | New date 等等。我试图比较两张表中的数据,看看它们是否匹配。数据行的顺序可能不同,标题的顺序也可能不同 所以我想做的是: 1) 定义两个文件之间哪些标题与哪些标题匹配 2) 从旧文件中查找ID并查看它是否在新文件中,如果在新文件中,则查看每个标头下的数据是否匹配。如果没有,则将该行数据导出到新工

我有两个不同的文件,它们有不同的标题,例如:

OldfileHeaders | NewFileheaders
ID             | Test ID
Date           | New date
等等。我试图比较两张表中的数据,看看它们是否匹配。数据行的顺序可能不同,标题的顺序也可能不同

所以我想做的是: 1) 定义两个文件之间哪些标题与哪些标题匹配 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
Set testIdData=testIdData.Resize(testIdData.CurrentRegion.Rows.Count)
直到sourceId.Value=“”为止
datacopy=False
'在测试数据中查找ID
Set cellfund=testIdData.Find(What:=sourceId.Value,LookIn:=xlValues,LookAt:=xlWhole,MatchCase:=False)
如果你发现什么都不是
'找不到此条目,因此复制到输出
datacopy=True
outputRange.Resize(ColumnSize:=NUMCOLUMNS)。Interior.Color=vbRed
其他的
'这假定列的顺序相同
对于columnNum=2到NUM\u COLUMNS\u数据
'无需测试ID列
如果sourceId.Cells(ColumnIndex:=columnNum).Value为cellFound.Cells(ColumnIndex:=columnNum).Value,则
outputRange.Cells(ColumnIndex:=columnNum).Interior.Color=vbYellow
datacopy=True
如果结束
下一列
如果结束
如果是数据拷贝,那么
sourceId.Resize(ColumnSize:=NUMCOLUMNS).复制
outputRange.Paste特殊XLPaste值和数字格式
Application.CutCopyMode=False
设置outputRange=outputRange.Offset(行偏移量:=1)
差异=差异+1
如果结束
设置sourceId=sourceId.Offset(行偏移量:=1)
环
这段代码的工作取决于我如何按照正确的顺序格式化工作表,以及如何更改标题名称


我需要帮助定义两个工作表中哪些字段名与哪些字段名匹配,然后在新工作表中搜索每个ID,并查看相应单元格中的数据是否匹配。如果ID不在工作表中,则将该行也输出到其他工作表中。如果id存在,并且单元格中存在差异,则将其放入羞耻表。我想对每列中的差异进行统计。

匹配数据集之间的数据需要您为程序提供一些帮助。在本例中,需要的帮助是哪些列彼此相关。您已经确定了一个小表格,其中列出了标题之间的关系。有了它,您可以执行从数据源1到数据源2的各种转换。它需要大量使用
Application.Match
Application.VLookup

我将提供一个基本示例,它完成了您尝试做的核心工作。在一张纸上看到这一切要容易得多,这就是我所做的

数据图片显示了三个表格:rng_头、rng_源和rng_目的地。一个是头的查找,第二个是“源”数据,第三个是要比较的数据源,我将调用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
Sub-ConfirmHeadersAndMatch()
尺寸rng_标题作为范围
设置rng_头=范围(“B3”)。当前区域
Dim rng_dest As范围
设置rng_dest=范围(“I2”)。当前区域
作为范围的Dim rng_源
设置rng_源=范围(“E2”)。当前区域
标题行下方的“范围”第一列的Dim rng_id
对于Intersect中的每个rng_id(rng_源.列(1).偏移量(1),rng_源)
Dim str_头作为变量
str_header=Application.VLookup(_
Intersect(rng_id.entireclumn,rng_source.Rows(1))_
rng_标题,2,错误)
“获取col编号
Dim int_COLU_id为整数
int\u col\u id=Application.Match(str\u头,rng\u dest.Rows(1),0)
'在新列中查找ID
Dim int_row_id作为变量
int_row_id=Application.Match(rng_id,rng_dest.Columns(int_col_id),0)
如果IsError(int\U row\U id)那么
“我不见了。。。做点什么
rng_id.Interior.Color=255
其他的
Dim rng_检查范围“所有值,同一行
对于每个rng_签入交叉点(rng_源,rng_id.EntireRow)
“获取col编号
str_header=Application.VLookup(_
相交(rng_check.entireclumn,rng_source.Rows(1))_
rng_标题,2,错误)
int\u col\u id=Application.Match(str\u头,rng\u dest.Rows(1),0)
'检查值
如果rng\u check.Value rng\u dest.Cells(int\u row\u id,int\u col\u id).Value则
'值不匹配。。。做点什么
目标单元格(行内标识,列内标识).Interior.Color=255
如果结束
下一次检查
如果结束
下一个
端接头
代码注释

  • 范围建立在选择数据块的
    CurrentRegion
    上。您可以在不同的图纸上为不同的范围交换这些
  • 使用
    Application.VLookup
    完成列标题转换,以检查源标题并返回目标标题。然后使用
    Application.Match
    在目标标题行中找到该
    字符串。您可以将此代码抽象为
    函数
    ,以避免重复两次
  • 找到列后,将使用
    Application.Match
    在目标表中搜索ID。如果找不到ID,这将返回一个错误
  • 如果ID是