Excel 将行从一个表复制到另一个表,而不创建重复项
我有一个Excel工作簿,其中有一个记录项目及其当前位置的主控表,还有一个记录项目过去位置或存放位置的表。当前,当主工作表中的记录发生更改时,该行将被手动复制并粘贴到第二张工作表中。我想创建一个宏,在主工作表中查找不在第二个工作表中的项目,并在记录更改时将其复制到第二个工作表中 下面是我找到并修改的一个示例宏,它很接近,但它复制并粘贴了所有行,而不是新的或不同的行。行只需要在列A、B和D上进行比较Excel 将行从一个表复制到另一个表,而不创建重复项,excel,vba,Excel,Vba,我有一个Excel工作簿,其中有一个记录项目及其当前位置的主控表,还有一个记录项目过去位置或存放位置的表。当前,当主工作表中的记录发生更改时,该行将被手动复制并粘贴到第二张工作表中。我想创建一个宏,在主工作表中查找不在第二个工作表中的项目,并在记录更改时将其复制到第二个工作表中 下面是我找到并修改的一个示例宏,它很接近,但它复制并粘贴了所有行,而不是新的或不同的行。行只需要在列A、B和D上进行比较 Public Sub Sample() Dim shM As Worksheet, sh2 As
Public Sub Sample()
Dim shM As Worksheet, sh2 As Worksheet
Dim shMData As Variant
Dim sh2DataA As Variant
Dim sh2Data As Variant
Dim iM As Long, os2 As Long, i2 As Variant
Dim DoSearch As Boolean
Set shM = Sheets(1)
Set sh2 = Sheets(2)
With shM
shMData = .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 4)
End With
DoSearch = False
For iM = 2 To UBound(shMData, 1)
With sh2
sh2DataA = .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 1)
sh2Data = .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 4)
End With
os2 = 0
Do
If UBound(shMData, 1) > 1 Then
i2 = Application.Match(shMData(iM, 1), sh2DataA, 0)
Else
If shMData(iM, 1) = sh2DataA Then
i2 = 1
Else
i2 = CVErr(xlErrNA)
End If
End If
If Not IsError(i2) Then
If (shMData(iM, 2) = sh2Data(i2, 2)) And (shMData(iM, 4) = sh2Data(i2, 4)) Then
MsgBox "Match found Master = " & iM & ", sheet2 = " & i2 + os2
Else
shM.Activate
shM.Range(Cells(iM, 1), Cells(iM, 7)).Select
Selection.Copy
sh2.Select
FinalRow = Range("A65536").End(xlUp).Row
NextRow = Range("A65536").End(xlUp).Row + 1
Range("A" & NextRow).Select
ActiveSheet.Paste
End If
os2 = os2 + i2
If os2 < UBound(sh2Data, 1) Then
With sh2
sh2DataA = .Range(.Cells(i2 + os2, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 1)
sh2Data = .Range(.Cells(i2 + os2, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 4)
End With
DoSearch = True
Else
DoSearch = False
End If
Else
shM.Activate
shM.Range(Cells(iM, 1), Cells(iM, 7)).Select
Selection.Copy
sh2.Select
FinalRow = Range("A65536").End(xlUp).Row
NextRow = Range("A65536").End(xlUp).Row + 1
Range("A" & NextRow).Select
ActiveSheet.Paste
DoSearch = False
End If
Loop Until Not DoSearch
Next
End Sub
Public子示例()
尺寸shM作为工作表,sh2作为工作表
Dim shMData作为变体
Dim sh2DataA作为变体
Dim sh2Data作为变体
Dim iM为长,os2为长,i2为变体
Dim DoSearch为布尔型
设置shM=图纸(1)
设置sh2=图纸(2)
与shM
shMData=.Range([A1],.Cells(.Rows.Count,1).End(xlUp)).Resize(,4)
以
DoSearch=False
对于iM=2到UBound(shMData,1)
含sh2
sh2DataA=.Range([A1],.Cells(.Rows.Count,1).End(xlUp)).Resize(,1)
sh2Data=.Range([A1],.Cells(.Rows.Count,1).End(xlUp)).Resize(,4)
以
os2=0
做
如果UBound(shMData,1)>1,则
i2=Application.Match(shMData(iM,1),sh2DataA,0)
其他的
如果shMData(iM,1)=sh2DataA,则
i2=1
其他的
i2=CVErr(xlErrNA)
如果结束
如果结束
如果不是iError(i2),则
如果(shMData(iM,2)=sh2Data(i2,2))和(shMData(iM,4)=sh2Data(i2,4)),那么
MsgBox“匹配找到主控=“&iM&”,sheet2=“&i2+os2
其他的
嘘,启动
shM.范围(单元格(iM,1),单元格(iM,7))。选择
选择,复制
sh2.选择
FinalRow=范围(“A65536”)。结束(xlUp)。行
NextRow=范围(“A65536”)。结束(xlUp)。行+1
范围(“A”&NextRow)。选择
活动表。粘贴
如果结束
os2=os2+i2
如果os2
添加消息框只是为了验证代码是否正常工作-它不是必需的组件。再次感谢您提供的建议。如果您的主列表中没有两行完全相同的内容,您可以使用内置的Excel功能删除重复项(至少在2010年的数据选项卡上)。如果有x个重复行,则所有重复行都将被删除,其中x-1行将被删除。因此,您可以复制整个其他表,将其粘贴到主列表下面,然后在主列表上运行删除重复项。您只需要知道用于删除重复项的VBA
ActiveSheet.Range("$A$40:$D$43").RemoveDuplicates Columns:=Array(1, 3, 4), Header:=xlNo
根据需要进行调整谢谢大家的帮助,我找到了一个解决方案,但是它在Excel 2003中不起作用。如果有人能从他们的头脑中知道为什么那会很好,我想我已经明白了。这是代码 [HTML]公共子NewEntWhole() Dim loM作为ListObject,lo2作为ListObject Dim TblMData作为变量 我和你一样长 日期 作为字符串的Dim strDate 迟钝 变暗rng As范围 作为变体的Dim-ct Dim shM As工作表 Dim sh2 As工作表 将hdM设置为整数
hdM = 0 'rows above table M
Set shM = Sheets(1)
Set sh2 = Sheets(2)
Set loM = Sheets(1).ListObjects(1)
Set lo2 = Sheets(2).ListObjects(1)
With loM
TblMData = .DataBodyRange
End With
For iM = 2 To UBound(TblMData, 1) + 1
sh2.Activate
With lo2
.Range.AutoFilter Field:=1, Criteria1:=loM.Range(iM, 1).Value
.Range.AutoFilter Field:=2, Criteria1:=loM.Range(iM, 2).Value
If IsDate(loM.Range(iM, 4)) Then
sDate = loM.Range(iM, 4)
dDate = DateSerial(Year(sDate), Month(sDate), Day(sDate))
lDate = dDate
.Range.AutoFilter Field:=4, Criteria1:=">=" & lDate, Operator:=xlAnd, Criteria2:="<" & lDate + 1
Else
.Range.AutoFilter Field:=4, Criteria1:=loM.Range(iM, 4).Value
End If
End With
Set rng = lo2.AutoFilter.Range
ct = rng.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1
If ct = 0 And loM.Range(iM, 1).Value > 0 Then
shM.Activate
shM.Range(Cells((iM + hdM), 1), Cells((iM + hdM), 7)).Copy
sh2.Activate
FinalRow = Range("B65536").End(xlUp).Row
NextRow = Range("B65536").End(xlUp).Row + 1
Range("A" & NextRow).Select
ActiveSheet.Paste
End If
With lo2
.Range.AutoFilter Field:=1
.Range.AutoFilter Field:=2
.Range.AutoFilter Field:=4
End With
Next
shM.Activate
hdM=0'表M上方的行
设置shM=图纸(1)
设置sh2=图纸(2)
设置loM=图纸(1)。列表对象(1)
设置lo2=图纸(2)。列表对象(1)
与洛美
TblMData=.DataBodyRange
以
对于iM=2至UBound(TblMData,1)+1
sh2.激活
含lo2
.Range.AutoFilter字段:=1,Criteria1:=loM.Range(iM,1).Value
.Range.AutoFilter字段:=2,准则1:=loM.Range(iM,2).Value
如果IsDate(loM.范围(iM,4)),则
sDate=loM.范围(iM,4)
dDate=日期序列(年、月、日)
lDate=dDate
.Range.AutoFilter字段:=4,准则1:=“>=”&lDate,运算符:=xlAnd,准则2:=”