【问题标题】:Pull data from different sheet based on ID根据 ID 从不同的工作表中提取数据
【发布时间】:2020-10-15 17:59:55
【问题描述】:

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

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

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

Sheet1

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

Sheet2

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

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

【问题讨论】:

  • ID 每张纸(1 和 2)是否唯一?
  • 当然可以。 ID 始终是唯一的。
  • 我知道应该是这样,但是人们在 Excel 中“创造奇迹”,我想知道是否必须检查这一点... :)。我会在一两分钟内发布答案...
  • 双 VLOOKUP 有什么问题? =IFERROR(VLOOKUP(A2,Sheet1!$A:$B,2,FALSE),VLOOKUP(A2,Sheet2!$A:$B,2,FALSE))
  • @jamheadart 如果我想为所有单元格执行这些操作,那么我需要为所有单元格编写公式吗?

标签: excel vba excel-formula


【解决方案1】:

您的问题可以通过使用 Vlookup 功能的建议来回答,但我更喜欢 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 的建议。这似乎很好,而不是为每个单元格编写公式。我还想再复制一个名为 Age 的单元格,如果我删除 ID,那么它应该清空该值。你能帮忙吗
  • @Vignesh Kumar A:在删除 ID 的情况下清空值,很清楚,我可以做到,但也返回“Age”,我需要知道从哪里......如果它与找到的 ID 在同一行,我需要知道它的列(字母或数字)。我应该明白它在以下列 (C:C) 上吗?修改了上面的代码以在 ID 删除的情况下清除值。请在复制代码之前刷新页面(此)...
  • 就像两张表都有 ID、姓名和年龄。同样在将来如果他们提供更多信息手段,我该如何配置它
  • @Vignesh Kumar 答:好的。为了也从下一列返回,您必须使用Offset。由于现在Target.Offset(0, 1).Value = IDCell.Offset(0, 1).Value 带来了以Target(更改的单元格)作为参考的第一列的值,使用Target.Offset(0, 2).Value = IDCell.Offset(0, 2).Value 将从以下一个(C:C)返回。我应该修改代码,还是您想尝试一下?
  • 你能更新代码吗?我是这个 vba 的新手。
【解决方案2】:

我喜欢 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")

【讨论】:

  • 刚刚发布了相同的内容,但为时已晚。我在函数周围包裹了另一个IFERROR,以防找不到ID。
  • 大声笑,当您的评论弹出时,我刚刚在答案的底部添加了这一点,伟大的思想都一样!
【解决方案3】:

如果你真的想使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多