在excel中匹配和插入记录

时间:2015-03-17 13:34:44

标签: excel vba excel-vba

我有两张数据。一张工作表的主要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

3 个答案:

答案 0 :(得分:2)

是否必须在不使用公式的情况下完成?我不确定我是否遗漏了某些内容,但您肯定可以使用VlookupIndex 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")。

除此之外,已经提到的公式也是一个优雅的解决方案。