根据先前工作表中包含的产品列表填写行(/产品)信息

时间:2013-04-22 13:32:36

标签: excel vba excel-vba

我有一个包含多个不同工作表的Excel电子表格。第一个工作表包含第二列中具有唯一ID的产品列表。其余列包含产品的其他信息,如名称,价格,折扣等。

在其余工作表中,我通过添加其唯一ID然后复制并粘贴第一个工作表的行来添加产品。我基本上要做的是创建一个宏,当在第n个工作表的第二列中输入唯一ID时(例如在第5个工作表中)将执行该宏。它应该使用第一个工作表中具有相同ID的产品中的信息自动填充其余列。

1 个答案:

答案 0 :(得分:0)

您是否尝试过VLOOKUP()公式?

给出一个表格(从您的描述中简化),如下所示:

    A:     B:   C:
1:  ID1    A    Spec
2:  ID2    B    Spec
3:  ID3    C    Spec
4:  ID4    D    Spec
5:  ID5    E    Spec

您可以在以下表格中使用这样的公式:

=VLOOKUP(B2,Sheet1!A1:C5,2,FALSE)

其中B2是包含您输入的产品编号的单元格。要让VBA自动执行此过程,请创建一个在更改单元格时触发的宏:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lChangedRow As Long
If Target.Column = 2 Then
    lChangedRow = Target.Row
    Range("D" & lChangedRow).Formula = "=VLOOKUP(B" & lChangedRow & ",Sheet1!A1:C5,2,FALSE)"
    'Fill in additional columns (change "D") as necessary...
End If

End Sub

If Target.Column = 2 Then检查更改的值是否仅在第二列中,以便在没有必要时没有多次运行更新。

Range("D" & lChangedRow).Formula...设置此帖子顶部突出显示的VLOOKUP功能。

Sheet1!A1:C5需要更改以匹配您的第一个工作表的名称/数据。


为了避免在每张工作表上输入此代码,您可以通过在其自己的模块中放入类似的代码来简化(这不是必需的,但如果您想要更改Sub,则会很有用,因为您将只需要改变一次):

Public Sub FillData(ByVal Target As Range)
Dim lChangedRow As Long
    lChangedRow = Target.Row
    Range("D" & lChangedRow).Formula = "=VLOOKUP(B" & lChangedRow & ",Sheet1!A1:C5,2,FALSE)"
    'Fill in additional columns (change "D") as necessary...
End Sub

每张表都有相同的简化代码,调用Sub:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        FillData(Target)
    End If
End Sub

另一个非必需品,但可能会有所帮助,具体取决于您的使用/此工作簿的大小,一旦更新,公式将更改为静态值。如果您经常更改数据,或者数据集相当小,那么您可能不应该这样做。

但是,如果您发现更新所有这些VLOOKUP需要花费大量时间,并且一旦输入了您的唯一ID,您的数据就不会更改,那么这将有助于加快速度:

Public Sub FillData(ByVal Target As Range)
Dim lChangedRow As Long
    lChangedRow = Target.Row
    Range("D" & lChangedRow).Formula = "=VLOOKUP(B" & lChangedRow & ",Sheet1!A1:C5,2,FALSE)"
    Range("D" & lChangedRow).Value = Range("D" & lChangedRow).Value
    'Fill in additional columns (change "D") as necessary...
End Sub