我有两张数据。一张工作表的主要ID包含4个字段,其他工作表的主要ID包含2个字段。
Sheet A Sheet B
ID Name Price Type Category ID Name Price
1 S Normal 2 Aus 500
2 N Default 1 Ind 400
基本上我需要匹配两张纸的ID并在表A表单B中复制相应的名称和价格。我试过以下代码,
Sub Copy()
lastrowA = Worksheets("SheetA").Cells(Rows.Count, "A").End(xlUp).Row + 1
Set rngA = Range("A2" & lastrowA)
lastrowB = Worksheets("SheetB").Cells(Rows.Count, "A").End(xlUp).Row + 1
Set rngB = Range("A2" & lastrowB)
For Each x In rngB
For Each y In rngA
If x.Value() = y.Value Then
' Copy paste name and price form B to A
End If
Next
Next
End Sub
答案 0 :(得分:2)
是否必须在不使用公式的情况下完成?我不确定我是否遗漏了某些内容,但您肯定可以使用Vlookup
或Index
Match
吗?
如果从VBA输入公式:
Cells(2,2).FormulaR1C1 = "=INDEX(Sheet2!R2C2:R3C3,MATCH(RC[-1],Sheet2!RC[-1]:R[1]C[-1],0),1)"
Cells(2,3).FormulaR1C1 = "=INDEX(Sheet2!R2C2:R3C3,MATCH(RC[-2],Sheet2!R2C1:R3C1,0),2)"
然后,您可以在工作表1的ID列中找到最后一行,并在两个列中填充公式。公式填写完毕后,只需复制并粘贴为值。
Dim lstRow As Long
lstRow = Sheets("Sheet 1").Cells(Rows.Count, 1).End(xlUp).Row '' find last row
Range(Cells(2, 2), Cells(lstRow, 3)).FillDown
Range(Cells(2, 2), Cells(lstRow, 3)).Copy
Cells(2, 2).PasteSpecial Paste:=xlPasteValues
编辑:您可以在VBA公式中使用lstRow
变量,以确保每次运行自动化时公式都涵盖整个范围。您可以使用“录制宏”' excel中的按钮可以获取公式的代码,如果您不习惯自己创建它们。
答案 1 :(得分:2)
使用保留字作为宏的名称绝不是一个好主意。特别是如果您打算在宏中使用.Copy
操作。
Sub MyCopy()
Dim lastrowA As Long
With Worksheets("SheetA")
lastrowA = .Cells(Rows.Count, "A").End(xlUp).Row
With .Range("B2:C" & lastrowA)
.Formula = "=IFERROR(VLOOKUP($A2, 'SheetB'!$A:$C, COLUMN(B:B), FALSE), """")"
.Value = .Value
End With
End With
End Sub
该批量使用适当的公式填充整个区域而不进行循环,然后将返回的值转换为原始值。任何不匹配都是空白而不是#N/A
错误。
答案 2 :(得分:0)
您的代码存在问题
Set rngA = Range("A2" & lastrowA)
对于lastRowA = 5,评估范围(" A25") 如果要处理多个单元格,请使用
Set rngA = Range("A2:A" & lastrowA)
获取lastRowA = 5的范围(" A2:A5")。
除此之外,已经提到的公式也是一个优雅的解决方案。