如何根据另一张纸上的非静态单元格值在一张纸上创建一个下拉框?

时间:2014-11-21 17:34:37

标签: excel vba excel-vba

如何根据另一张纸上的非静态单元格值在一张纸上制作一个下拉框!?

我正在尝试创建工作簿,我可以从各种科学工具中复制CSV数据文件以获取不同的参数,并将数据放在Sheet2上。在sheet1上,我将有几个列来覆盖我想要绘制的数据,并将图形内置到Sheet1中。我的问题是获取下拉列表以显示Sheet2中复制数据的标题作为选项。工作表2上的格式不是静态的,因为所有CSV文件的格式都不同。

我使用了下面列出的文章中的宏来根据标题拉出列。我没有'了解我正在研究的所有工具的所有潜在标题。我是否可以设置下拉框以列出单元格Sheet2!A1:P1的值作为选项而不设置Sheet2!A1:P1作为表格? (此文件的用户无法掌握每次复制/粘贴CSV数据的新表格)

由于教师可能实时犯错,我无法将Sheet2上的数据转换为表格。 (我正在为培训计划创建这个工作簿。这是为了数据的重要性,而不是excel类,因为教师不熟练使用excel)。

Excel - How populate a column from another sheet based on unique column header names

2 个答案:

答案 0 :(得分:0)

在Excel中,创建一个命名范围:

  • 在Excel 2003或更低版本中 - >插入 - >名称 - >定义
  • 在Excel 2007及更高版本中 - >公式 - >定义名称

您可以随意命名,我会将其命名为listHeaders

使用此公式定义它:

=Sheet2!$A$1:INDEX(Sheet2!$1:$1,,COUNTA(Sheet2!$1:$1))

然后,对于下拉列表,请使用数据验证 - >列出并将Source设置为:

=listHeaders

答案 1 :(得分:0)

回答我的问题。我有我的标题我导入到Sheet 2.我去了Sheet 3并且有Sheet3!A1 = Sheet2!A1然后Sheet3!B1 = Sheet2!B2等我使用了那个范围并创建了一个命名范围。然后我去了Sheet1!A1并从我在Sheet3上创建的命名范围中分配了下拉列表。我对Sheet1!B1和Sheet1!C1做了同样的事情。然后我添加了以下代码。

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

现在当我使用Sheet1!A1下拉时,它从Sheet3上的Dynamic列表中拉出,VBA编码拉入Sheet2上与Sheet1!A1选择匹配的列的数据。此宏允许将列拉入Sheet1的前3行,具体取决于从下拉列表中选择的内容。