vba - 通过下拉列表将数据从一张表导出到另一张表 - VBA Excel 宏

标签 vba list excel

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

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

因此希望能够将数据带回工作表 1 以进行编辑/修改/保存/覆盖。

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

任何意见或建议将不胜感激。

非常感谢

瑞秋。

最佳答案

我已经整理了一个简单的示例来演示您的要求,可以下载 here .

我做了以下事情:

  • 添加了表单(带有一些数据编辑字段)和数据(带有示例数据)工作表。
  • 向数据表添加了一个验证下拉菜单,显示数据工作表中的 ID + 名称数据。
  • 当验证下拉列表中的选定选项发生更改时,它会触发 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 从数据表中检索信息以填充编辑表单。
  • 单击保存按钮时,将运行以下代码:
    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 方法来定位我们的索引在数据表上的范围,然后偏移以覆盖我们的新值。

  • 我希望这是有道理的,请询问您是否有任何问题。

    关于vba - 通过下拉列表将数据从一张表导出到另一张表 - VBA Excel 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42387332/

    相关文章:

    vba - 为变量赋值(nameOfVariable)

    vba - 使用 VBA 在给定范围内以不同方式移动每一行

    excel - 我可以编写哪些 VBA 代码来保证出现 "Microsoft Excel has stopped working"错误消息?

    sql - 如何删除Microsoft Access中多个表的内容?

    python - 在 pandas 中,如何从字典列表创建数据框?

    jquery - 动态生成的 <li> 中未触发单击事件

    events - 等待 Application.Calculate 完成

    python - 将列添加到数组

    excel - 如何在通过 VBA 在 Sharepoint 中编辑 Excel 文件时处理共同创作

    excel - 评估字符串vba excel中的变量