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
Excel VBA-将一个工作表中的两列与另一个工作表中的两列进行比较_Excel_Vba - Fatal编程技术网

Excel VBA-将一个工作表中的两列与另一个工作表中的两列进行比较

Excel VBA-将一个工作表中的两列与另一个工作表中的两列进行比较,excel,vba,Excel,Vba,将一个工作表中的两列与另一个工作表中的两列进行比较,并从列匹配的其他列中获取相应的值 我在第一张工作表中有一个唯一的id和行id。在我的第二张工作表中,我以随机顺序拥有相同的唯一id和行id。我想将第一张图纸中的唯一id和行id与第二张图纸匹配。如果唯一id和行id匹配,则第二张图纸中的一些日期将复制到第一张图纸。如果存在匹配项,则应从第二张图纸复制相应的日期,并粘贴到第一张图纸上匹配的唯一id和行id附近 我不能上传文件,因为它是保密的 我不擅长VBA,非常感谢您对我的帮助。非VBA方法 如果

将一个工作表中的两列与另一个工作表中的两列进行比较,并从列匹配的其他列中获取相应的值

我在第一张工作表中有一个唯一的id和行id。在我的第二张工作表中,我以随机顺序拥有相同的唯一id和行id。我想将第一张图纸中的唯一id和行id与第二张图纸匹配。如果唯一id和行id匹配,则第二张图纸中的一些日期将复制到第一张图纸。如果存在匹配项,则应从第二张图纸复制相应的日期,并粘贴到第一张图纸上匹配的唯一id和行id附近

我不能上传文件,因为它是保密的


我不擅长VBA,非常感谢您对我的帮助。

非VBA方法

如果可以的话,我倾向于避免使用VBA,所以如果这不需要自动化,并且您可以向工作表中添加列,那么最简单的解决方案就是根本不使用VBA

在两个电子表格中插入一个新列,该列是唯一id和连接在一起的行id的键,然后只需使用vlookup回调值

  • 如果不希望它保持动态链接,请复制并粘贴值以删除公式
  • 如果在某些情况下ID和行不匹配,只需将vloopup封装在IFERROR函数中,当它不匹配时,就可以使用默认值(例如,空白)
表1

ID  line  +Key+  Pseudo formula
X    13   X13   vlookup X13 in Key column of sheet 2  
Y    27   Y27   vlookup Y27 in Key column of sheet 2
第2页

ID  line  +Key+  Value
X    13   X13   "The value to get"
Y    27   Y27   "Another value to get"

+键+=要插入的新字段,它只是=ID和行

VBA方法

下面是获取值的一个非常简单的方法。我很确定还有很多其他更有效的方法,但我只会在速度太慢的情况下才考虑这些方法

要使用-根据注释配置前几个设置,希望您可以离开

Sub RetrieveValues()

    Set ws1 = Sheets("Sheet1")      'Sheet we are going to copy results into
    Set ws2 = Sheets("Sheet2")      'Sheet we are going to copy results from

    'Identify the columns to use in the sheet we are copying into
    ws1UniqueIDCol = "B"         'Is the column with the first part of our lookup key - the unique id
    ws1LineIdCol = "C"           'Is the column with the second part of our lookup key - the line id
    ws1ValToWriteCol = "D"       'Is the column we want to put the found value into
    
    ws1StartRow = 3              'The row we want to start processing first, we can calc the last row automatically
    ws1EndRow = ws1.UsedRange.Rows(ws1.UsedRange.Rows.Count).Row
    
    
    'Identify the columns to use in the sheet we are copying from
    ws2UniqueIDCol = "B"         'Is the column with the first part of our lookup key - the unique id
    ws2LineIdCol = "C"           'Is the column with the second part of our lookup key - the line id
    ws2ValToCopyCol = "D"        'Is the column we want to copy the value from
    
    ws2StartRow = 3              'The row we want to start search first, we can calc the last row automatically
    ws2EndRow = ws2.UsedRange.Rows(ws2.UsedRange.Rows.Count).Row
    
    'iterate through search terms
    For i = ws1StartRow To ws1EndRow        '
        searchKey = ws1.Range(ws1UniqueIDCol & i) & ws1.Range(ws1LineIdCol & i)
        
         'if we have a non blank search term then iterate through possible matches
        If (searchKey <> "") Then
            For j = ws2StartRow To ws2EndRow
                 foundKey = ws2.Range(ws2UniqueIDCol & j) & ws2.Range(ws2LineIdCol & j)
                  
                  'if we have a match then copy the result and end this search (so we will take the first match found only)
                 If (searchKey = foundKey) Then
                    ws1.Range(ws1ValToWriteCol & i).Value2 = ws2.Range(ws2ValToCopyCol & j).Value2
                    Exit For
                 End If
            Next
        End If
    Next

End Sub
子检索值()
设置ws1=Sheets(“Sheet1”)“我们要将结果复制到的工作表
设置ws2=Sheets(“Sheet2”)'我们将从中复制结果的工作表
'标识要在复制到的工作表中使用的列
ws1UniqueIDCol=“B”是包含查找键第一部分的列—唯一id
ws1LineIdCol=“C”是包含查找键第二部分的列—行id
ws1ValToWriteCol=“D”是我们要将找到的值放入的列
ws1StartRow=3'要首先开始处理的行,可以自动计算最后一行
ws1EndRow=ws1.UsedRange.Rows(ws1.UsedRange.Rows.Count).Row
'标识要在我们从中复制的工作表中使用的列
ws2UniqueIDCol=“B”是包含查找键第一部分的列—唯一id
ws2LineIdCol=“C”是包含查找键第二部分的列—行id
ws2ValToCopyCol=“D”是我们要从中复制值的列
ws2StartRow=3'要首先开始搜索的行,可以自动计算最后一行
ws2EndRow=ws2.UsedRange.Rows(ws2.UsedRange.Rows.Count).Row
'遍历搜索词
对于i=ws1StartRow到ws1EndRow'
searchKey=ws1.Range(ws1UniqueIDCol&i)和ws1.Range(ws1LineIdCol&i)
'如果我们有一个非空的搜索项,则遍历可能的匹配项
如果(搜索键“”),则
对于j=ws2StartRow到ws2EndRow
foundKey=ws2.Range(ws2UniqueIDCol&j)和ws2.Range(ws2LineIdCol&j)
'如果我们有匹配项,则复制结果并结束此搜索(因此我们将只获取找到的第一个匹配项)
如果(searchKey=foundKey),则
ws1.Range(ws1ValToWriteCol&i).Value2=ws2.Range(ws2ValToCopyCol&j).Value2
退出
如果结束
下一个
如果结束
下一个
端接头

谢谢您的回复,但我必须在VBA上完成。我们想自动化这个过程。公平的说,我会添加一个VBA的答案来感谢你!这工作做得很好!