【问题标题】:Excel - How populate a column from another sheet based on unique column header namesExcel - 如何根据唯一的列标题名称从另一个工作表填充列
【发布时间】:2014-01-04 04:59:57
【问题描述】:

这不难,但我就是不知道怎么做。

我有 Sheet 1,即 3 个空列,第一行是数据验证下拉列表,即 Sheet 2 中存在的 50 个唯一标题名称。

在工作表 2 的 50 个标题下,每行都有未知数量的数据。

从表 1 中的 3 个下拉菜单中的每一个,我只想用表 2 中该列标题下的所有数据填充该列。

有 VBA 解决方案吗?

【问题讨论】:

  • 是的,可以使用Worksheet_Change.Find

标签: excel vba


【解决方案1】:

您不需要 VBA,只需使用 INDEX 和 MATCH,以及 ROW()

在 Sheet1 中,例如单元格 A2(如果您的标题在单元格 A1 中)

=IF(INDEX(Sheet2!$A:$M,ROW(),MATCH(Sheet3!A$1,Sheet2!$A$1:$M$1,0))=0,"",INDEX(Sheet2!$A:$M,ROW(),MATCH(Sheet3!B$1,Sheet2!$A$1:$M$1,0)))

您需要调整参考,但您会明白的。 您也可以为此使用数据透视表...

【讨论】:

  • 这部分工作。如何确保 Sheet2 中的所有行都显示在 Sheet1 中?
  • 我是在 Sheet3 而不是 Sheet1 中做的(我的错)。怎么了?您只需要将公式拖放到列中足够低的位置。 (或者像我说的那样使用数据透视表)。
【解决方案2】:

在工作表 2 的 50 个标题下,每行都有未知数量的数据。

我总是更喜欢公式而不是 vba,但是如果你有 unknown 行数和 50 标题,那么我个人将永远不会选择公式。特别是如果我不得不把它拖下来。这是一个 VBA 解决方案。

假设您的 Sheet2 看起来像这样

将此粘贴​​到Sheet1 工作表代码区域。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa

    If Target.Cells.CountLarge > 1 Then Exit Sub

    Dim wsI As Worksheet, wsO As Worksheet
    Dim lRow As Long, nCol As Long
    Dim sSrch As String
    Dim aCell As Range, rng As Range

    Set wsI = ThisWorkbook.Sheets("Sheet2")
    Set wsO = ThisWorkbook.Sheets("Sheet1")

    Application.EnableEvents = False

    If Not Intersect(Target, Range("A1:C1")) Is Nothing Then
        sSrch = Cells(1, Target.Column).Value

        Set aCell = wsI.Rows(1).Find(What:=sSrch, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

        If Not aCell Is Nothing Then
            nCol = aCell.Column

            lRow = wsI.Cells(wsI.Rows.Count, nCol).End(xlUp).Row

            Set rng = wsI.Range(wsI.Cells(2, nCol), wsI.Cells(lRow, nCol))
        End If

        If Not rng Is Nothing Then
            Range(Cells(2, Target.Column), Cells(Rows.Count, Target.Column)).ClearContents
            rng.Copy Cells(2, Target.Column)
        End If
    End If

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub

输出

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多