通过下拉列表将数据从一个工作表导出到另一个工作表 - VBA Excel宏

时间:2017-02-22 09:21:00

标签: excel vba list excel-vba

我有一个包含两个工作表的Excel工作簿。 工作表1是一个填写的表单,它有一个提交按钮(使用VBA创建),该按钮获取数据并将其添加到工作表2上的下一个空行。 因此,表2中填充了先前提交的表单信息,并且可以清除表单1(再次通过使用VBA创建的按钮)以准备下一批信息。

每个条目都有一个唯一的编号用于参考目的,但我想要做的是在表1(表格)上有一个所有唯一编号的下拉列表,我可以选择一个并将其带到所有将相关信息返回到表单中,以便进行任何编辑,并使用一个按钮来保存/覆盖数据,而不是将其保存为新行。

所以希望能够将数据带回第1页进行编辑/修改/保存/覆盖。

我的VBA知识有限,因为这是我处理过的第一个项目,因此我仍然在学习基础知识。

非常感谢任何意见或建议。

非常感谢

瑞秋。

2 个答案:

答案 0 :(得分:2)

您可以打开“过滤器”并在唯一数字列中过滤/搜索要更改其数据的数字,而不是将数据返回到第1页的第1页。然后它将仅显示与该数字对应的数据的输入。然后在表2上进行编辑。

希望这很有用。

答案 1 :(得分:2)

我已经汇总了一个快速示例,演示了您所要求的内容,可以下载here

我做了以下事情:

  1. 添加了表单(包含一些数据编辑字段)和数据(包含示例数据)工作表。
  2. 在数据表中添加了验证下拉列表,其中显示了数据工作表中的ID +名称数据。
  3. 当更改验证下拉列表中的选定选项时,它会触发Worksheet_Change事件,运行以下代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
        'check that the Target cell is our dropdown
        If Target.Address = "$C$2" Then
            'get the value of the dropdown using the range method
            Dim dropDownValue As String
            dropDownValue = CStr(wsForm.Range(Target.Address).Value)
    
            'if that dropdown value exists (has a length of more than zero)
            If Len(dropDownValue) > 0 Then
                'get the corresponding record from the data sheet
                Dim index As Integer
                index = Left(dropDownValue, 1)
    
                wsForm.Range("C3").Value = index
                wsForm.Range("C4").Value = Application.WorksheetFunction.VLookup(index, wsData.Range("A:E"), 2, False)
                wsForm.Range("C5").Value = Application.WorksheetFunction.VLookup(index, wsData.Range("A:E"), 3, False)
                wsForm.Range("C6").Value = Application.WorksheetFunction.VLookup(index, wsData.Range("A:E"), 4, False)
            End If
     End If
    End Sub
    

    使用vlookups从数据表中检索信息以填充编辑表单。

  4. 单击保存按钮时,将运行以下代码:

    Sub Button4_Click()
        Dim index As Integer
        index = wsForm.Range("C3")
    
        If index > 0 Then
            Dim foundIndexRange As Range
            Set foundIndexRange = wsData.Range("A:A").Find(index)
    
            If (Len(foundIndexRange.Value) > 0) Then
                foundIndexRange.Offset(0, 1).Value = wsForm.Range("C4").Value
                foundIndexRange.Offset(0, 2).Value = wsForm.Range("C5").Value
                foundIndexRange.Offset(0, 3).Value = wsForm.Range("C6").Value
            End If
            MsgBox "Record saved"
        Else
            MsgBox "Please choose from the dropdown"
        End If
    End Sub
    

    使用range.Find方法定位索引在数据表上的范围,然后使用offset来覆盖我们的新值。

  5. 我希望这是有道理的,请问你是否有任何问题。