繁体   English   中英

根据 ID 从不同的工作表中提取数据

[英]Pull data from different sheet based on ID

我有 excel 应用程序,其中包含 3 张(Sheet1、Sheet2 和 Sheet3)。 工作表 1 包含 ID 和名称列,工作表 2 也具有相同的 ID 和名称,而工作表 1 将是 static,工作表 2 是动态的。

我想从 Sheet1 或 Sheet2 中获取数据。 当有人在 sheet3 中输入 ID 时,我应该从 Sheet1 或 Sheet2 中提取相应的名称并将其放入 sheet3 中。

我是 vba 或 excel 公式的新手。 我不知道我需要从哪里开始。

表 1

+-----------+
| ID | Name |
+-----------+
| 1  | AAAA |
+-----------+
| 2  | BBBB |
+-----------+
| 3  | CCCC |
+-----------+

表 2

+-----------+
| ID | Name |
+-----------+
| 7  | SSSS |
+-----------+
| 9  | XXXX |
+-----------+

如果我在 Sheet3,ID 列中输入 3,那么它应该在名称列中填充CCCC

您的问题可以通过使用 Vlookup function 的建议来回答,但我更喜欢 VBA。 所以,请检查下一个代码。 这是一个工作表事件,必须在工作表模块中复制(右键单击工作表名称并选择View Code ):

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Column = 1 Then
        Dim sh1 As Worksheet, sh2 As Worksheet, IDCell As Range
        Dim boolFound As Boolean
        Set sh1 = Worksheets("Sheet1"): Set sh2 = Worksheets("Sheet2")
        Set IDCell = sh1.Range("A:A").Find(What:=Target.Value, LookAt:=xlWhole)
        If Not IDCell Is Nothing Then
            If Target.Value <> "" Then
                Target.Offset(0, 1).Value = IDCell.Offset(0, 1).Value
                Target.Offset(0, 2).Value = IDCell.Offset(0, 2).Value: Exit Sub
            End If
        End If
        Set IDCell = sh2.Range("A:A").Find(What:=Target.Value, LookAt:=xlWhole)
        If Not IDCell Is Nothing Then
            If Target.Value <> "" Then
                Target.Offset(0, 1).Value = IDCell.Offset(0, 1).Value
                Target.Offset(0, 2).Value = IDCell.Offset(0, 2).Value: Exit Sub
            End If
        End If
        If Target.Value <> "" Then
            MsgBox """" & Target.Value & """ ID could not be found...": Target.Activate
        Else
            Target.Offset(0, 1).ClearContents
        End If
   End If
End Sub

它假设ID在三个相关工作表的第一列 (A:A) 中。 如果没有,代码可以很容易地适应......

我喜欢 VBA 但对于这个我认为 VLOOKUP 会简单得多:

=IFERROR(VLOOKUP(A2,Sheet1!$A:$B,2,FALSE),VLOOKUP(A2,Sheet2!$A:$B,2,FALSE))

如果要添加第 3、4、5 列,只需确保绝对引用正确,使用 COLUMN() 代替硬编码数字并将其也填充到右侧=IFERROR(VLOOKUP($A2,Sheet1:$A,$C,COLUMN(),FALSE),VLOOKUP($A2:Sheet2,$A,$C,COLUMN(),FALSE))

要进行“错误捕获”,请将其包装在另一个IFERROR

=IFERROR(IFERROR(VLOOKUP($A2,Sheet1:$A,$C,COLUMN(),FALSE),VLOOKUP($A2:Sheet2,$A,$C,COLUMN(),FALSE)),"Id not found")

如果你真的想使用 VBA 那么表格上没有公式,这个怎么样?

要将另一列添加到查找范围,只需将变量lastCol更改为您想要的任何列!

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Then
        Dim lastCol As String: lastCol = "C"
        Range(Cells(Target.Row, "B"), Cells(Target.Row, lastCol)).Formula = _
        "=IFERROR(IFERROR(VLOOKUP(" & Target.Value2 & ",Sheet1!$A:$" & lastCol & ",COLUMN(),FALSE)," & _
        "VLOOKUP(" & Target.Value2 & ",Sheet2!$A:$" & lastCol & ",COLUMN(),FALSE)), ""Id not found"")"
        Range(Cells(Target.Row, "B"), Cells(Target.Row, lastCol)).Value2 = Range(Cells(Target.Row, "B"), Cells(Target.Row, lastCol)).Value2
    End If
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM