VBA宏来比较和增加值

问题描述:

我想要做一个宏来比较一张纸上的值与另一张纸上的值并复制唯一的值。VBA宏来比较和增加值

说明:
我每周都会得到一堆ID(工作表A)。我想看看在过去的几周里,我已经使用了哪些这些ID(该列表位于Worksheet B上),并将Worksheet A中新的所有值复制到Worksheet B中。您可以将想要的结果看作Worksheet B(在运行宏之后)。

sample

,我想出了一些代码,但因为我是新来的VBA,这是行不通的,我现在很绝望。感谢任何人的帮助。

Sub Mymacro() 
    Dim lastRowC As Long 
    Dim foundTrue As Boolean 
    Dim Data As Worksheet 
    Dim GivenValues As Worksheet 
    Dim IDs As Long 
    Dim fVal As Range 

    Set Data = Sheets("Worksheet B") 
    Set GivenValues = Sheets("Worksheet A") 
    lastRowC = Data.Cells(Rows.Count, 1).End(xlUp).Row 
    IDs = GivenValues.Cells(Rows.Count, 1).End(xlUp).Row 
    'imagine data in Worksheet B are in the first column 

    For i = 1 To IDs 
     Set fVal = Data.Range("A1:A" & lastRowC).Find(GivenValues.Cells(i, 1).Value, LookIn:=xlValues, LookAt:=xlWhole) 
     If fVal Is Nothing Then 
      GivenValues.Cells(i, 1).Copy 
      Sheets(Data).Select 
      Range("A1").Select 
      Selection.End(xlDown).Select 
      ActiveCell.Offset(1, 0).Select 
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
       :=False, Transpose:=False 
     Else: End If 
    Next i 
End Sub 
+1

为什么不使用'WORKSHEETFUNCTION.COUNTIF',然后复制,如果返回的是0。此外,'范围(“A1”)。Select'你应该指的是2和选择时,与张前缀的范围。无需选择,例如'Range(“A1”)。End(xlDown).offset(1,0).pastespecial' –

代码会是这样的。

Sub Mymacro() 

    Dim lastRowC As Long 
    Dim foundTrue As Boolean 
    Dim Data As Worksheet 
    Dim GivenValues As Worksheet 
    Dim IDs As Long 
    Dim fVal As Range 
    Dim rngDB As Range, vDB, rngT As Range 
    Dim vR(), n As Long 

     Set Data = Sheets("Worksheet B") 
     Set GivenValues = Sheets("Worksheet A") 

     lastRowC = Data.Cells(Rows.Count, 1).End(xlUp).Row 
     IDs = GivenValues.Cells(Rows.Count, 1).End(xlUp).Row 
     Set rngDB = Data.Range("a1", "a" & lastRowC) 

     With GivenValues 
      vDB = .Range("a1", "a" & IDs) 
     End With 
'imagine data in Worksheet B are in the first column 
      For i = 1 To IDs 
       Set fVal = rngDB.Find(vDB(i, 1), LookIn:=xlValues, LookAt:=xlWhole) 
        If fVal Is Nothing Then 
         n = n + 1 
         ReDim Preserve vR(1 To n) 
         vR(n) = vDB(i, 1) 
        End If 
      Next i 
      Set rngT = Data.Range("a" & Rows.Count).End(xlUp)(2) 
      If n > 0 Then 
       rngT.Resize(n) = WorksheetFunction.Transpose(vR) 
      End If 
    End Sub 

如果你想除了重复,请看下一个代码。

Sub Mymacro() 

    Dim lastRowC As Long 
    Dim foundTrue As Boolean 
    Dim Data As Worksheet 
    Dim GivenValues As Worksheet 
    Dim IDs As Long 
    Dim fVal As Range 
    Dim rngDB As Range, vDB, rngT As Range 
    Dim vR(), n As Long 
    Dim X As New Collection 

     Set Data = Sheets("Worksheet B") 
     Set GivenValues = Sheets("Worksheet A") 

     lastRowC = Data.Cells(Rows.Count, 1).End(xlUp).Row 
     IDs = GivenValues.Cells(Rows.Count, 1).End(xlUp).Row 
     Set rngDB = Data.Range("a1", "a" & lastRowC) 

     With GivenValues 
      vDB = .Range("a1", "a" & IDs) 
     End With 
'imagine data in Worksheet B are in the first column 
     On Error Resume Next 
      For i = 1 To IDs 
       Set fVal = rngDB.Find(vDB(i, 1), LookIn:=xlValues, LookAt:=xlWhole) 
        If fVal Is Nothing Then 
         Err.Clear 
         X.Add vDB(i, 1), CStr(vDB(i, 1)) 
         If Err.Number = 0 Then 
          n = n + 1 
          ReDim Preserve vR(1 To n) 
          vR(n) = vDB(i, 1) 
         End If 
        End If 
      Next i 
      Set rngT = Data.Range("a" & Rows.Count).End(xlUp)(2) 
      If n > 0 Then 
       rngT.Resize(n) = WorksheetFunction.Transpose(vR) 
      End If 
End Sub 
+0

谢谢,它现在可以工作,我会尽我所能学习你的代码并从中学习。但是,仍然存在一个问题,即它将新值与工作表B上的原始范围进行比较,它将粘贴所有重复的新值。例如,值“100”不在工作表B上,因此它在工作表A上粘贴五次,因为它在工作表A上是五次。我只想要一次。我知道我现在可以运行一个简单的宏来删除重复项,但是有没有更优雅的方法不能多次粘贴一些值?无论如何,大THX,你已经解决了我的问题 – Petanek333

+0

@ Petanek333:使用新的Collecton删除重复。并修改我的代码。 –