是否可以比较excel中的两列并使用VBA更新主列?

是否可以比较excel中的两列并使用VBA更新主列?,excel,vba,loops,Excel,Vba,Loops,我的excel工作簿中有两张工作表。 这些表中包含我的主键列。 我想使用VBA循环将第一列(主列)与第二列(源列)进行比较。 原因是源通常包含新的主键。 请任何人帮助我找出一个逻辑来比较这些列,并将唯一的值添加到主列。 多谢各位 下面的代码显示了到目前为止我所拥有的 Sub PullUniques() Dim rngCell As Range For Each rngCell In Sheet1.Range("W3:W40") If WorksheetFunction.CountIf

我的excel工作簿中有两张工作表。 这些表中包含我的主键列。 我想使用VBA循环将第一列(主列)与第二列(源列)进行比较。 原因是源通常包含新的主键。 请任何人帮助我找出一个逻辑来比较这些列,并将唯一的值添加到主列。 多谢各位


下面的代码显示了到目前为止我所拥有的

Sub PullUniques()
Dim rngCell As Range
For Each rngCell In Sheet1.Range("W3:W40")
    If WorksheetFunction.CountIf(Range("D3:D40"), rngCell) = 0 Then
        Range("C" & Rows.Count).End(xlUp).Offset(1) = rngCell
    End If
Next
For Each rngCell In Sheet6.Range("D3:D40")
    If WorksheetFunction.CountIf(Range("W3:W40"), rngCell) = 0 Then
        Range("W" & Rows.Count).End(xlUp).Offset(1) = rngCell
    End If
Next

结束Sub

请尝试此代码。它基于这样一种假设,即在源工作表中,可能存在“主”工作表中不存在的键,这些键将添加到主工作表的第一个空行中

Sub testMasterUpdate()
  Dim shM As Worksheet, shS As Worksheet, s As Long, boolF As Boolean
  Dim lastRM As Long, lastRS As Long, m As Long
  Dim arrM As Variant, arrS As Variant, arrDif As Variant, d As Long

  Set shM = Worksheets("Master") 'please, use here your sheet name
  Set shS = Worksheets("Source") 'please, use here your sheet name
   lastRM = shM.Range("A" & Cells.Rows.Count).End(xlUp).Row
   lastRS = shS.Range("A" & Cells.Rows.Count).End(xlUp).Row
   arrM = shM.Range("A2:A" & lastRM).value
   arrS = shS.Range("A2:A" & lastRS).value
   ReDim arrDif(1 To 1, 1 To UBound(arrM) + UBound(arrS)): d = 1

   For s = 1 To UBound(arrS)
        For m = 1 To UBound(arrM)
            If arrS(s, 1) = arrM(m, 1) Then
                boolF = True
                Exit For
            End If
        Next m
        If Not boolF Then
            arrDif(1, d) = arrS(s, 1)
            d = d + 1
        End If
        boolF = False
   Next s
   If d > 1 Then
     ReDim Preserve arrDif(1 To 1, 1 To d - 1)
     'shM.Range("A" & lastRM + 1).Resize(UBound(arrDif, 2), 1).value = _
                                    WorksheetFunction.Transpose(arrDif)
     shM.Range("A" & lastRM).Resize(UBound(arrDif, 2), 1).value = _
                                WorksheetFunction.Transpose(arrDif)
     lastRM = shM.Range("A" & Cells.Rows.Count).End(xlUp).Row
     shM.Range("A" & lastRM + 1).Formula = "=CountA(A2:A" & lastRM & ")"
   End If
End Sub

请用真实的表名替换通用表名。

如果您能提供数据样本并向我们展示您迄今为止尝试过的VBA代码,我们可以更好地回答您的问题。我们是否理解您需要在主表(a列:a)中添加仅存在于源表(a列:a)中的值,但是他们在师父身上找不到?是的@FaneDuru这正是我想要的,我会准备一个答案。但是,如果你不做一些研究和编辑你的问题张贴一段代码,你的问题可以关闭,直到我将张贴…好的,谢谢。我正在编辑它now@Philip阿吉诺:我要离开办公室了。如果您需要澄清,我将能够在大约两小时后回答…首先,我要感谢您的帮助。当我运行代码并更改值时,它会给出一个运行时错误:“下标超出范围”,当我调试它时,它会突出显示带有“arrDif(1,d)=arrS(s,1)”的行。您认为是什么导致了此错误。您应该将
arrDif
初始化为
arrS
的大小,而不是
arrM
。这可能是OPs错误的原因,它会更好,但我不认为这是问题所在。arrDiff的大小似乎不太可能不足以满足差异……QPhilip Ajino:我从下一个假设开始准备代码:您有一个保存所有“主键”的主表,另一个是人们输入新键的主表。除了新代码外,还有旧代码。但是,情况可能会有所不同。。。我将调整代码,使其独立于上述假设工作。解决了的。你现在能查一下吗?