0

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

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

4

1 回答 1

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

另一个不必要但可能会有所帮助的方法是,根据您的用途/本工作簿的大小,在更新后将公式更改为静态值。如果您将经常更改数据,或者如果数据集相当小,那么您可能不应该这样做。

但是,如果您发现更新所有这些VLOOKUPs 需要花费大量时间,并且您的数据在输入唯一 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
于 2013-04-22T14:41:31.403 回答