VBA宏来比较和增加值
我想要做一个宏来比较一张纸上的值与另一张纸上的值并复制唯一的值。VBA宏来比较和增加值
说明:
我每周都会得到一堆ID(工作表A)。我想看看在过去的几周里,我已经使用了哪些这些ID(该列表位于Worksheet B上),并将Worksheet A中新的所有值复制到Worksheet B中。您可以将想要的结果看作Worksheet B(在运行宏之后)。
,我想出了一些代码,但因为我是新来的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
代码会是这样的。
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
谢谢,它现在可以工作,我会尽我所能学习你的代码并从中学习。但是,仍然存在一个问题,即它将新值与工作表B上的原始范围进行比较,它将粘贴所有重复的新值。例如,值“100”不在工作表B上,因此它在工作表A上粘贴五次,因为它在工作表A上是五次。我只想要一次。我知道我现在可以运行一个简单的宏来删除重复项,但是有没有更优雅的方法不能多次粘贴一些值?无论如何,大THX,你已经解决了我的问题 – Petanek333
@ Petanek333:使用新的Collecton删除重复。并修改我的代码。 –
为什么不使用'WORKSHEETFUNCTION.COUNTIF',然后复制,如果返回的是0。此外,'范围(“A1”)。Select'你应该指的是2和选择时,与张前缀的范围。无需选择,例如'Range(“A1”)。End(xlDown).offset(1,0).pastespecial' –