首页 > 解决方案 > Excel VBA:使用下拉列表显示表格数据

问题描述

我是VBA的初学者。我在 Excel 中有一个工作表,其中创建了每个月的表格来计算每个月的总工时。这些表位于工作表的不同列中。此表中的数据使用手动输入的数据填充到每个月创建的各个工作表中。

目前,这是手动完成的,并且列表变得很长。我想通过创建一个下拉列表过滤器并从每个月和年检索相应的数据并以日历的形式显示它来改进这一点。谁能指导我如何做到这一点?

这是我要编译的工作表的示例:

样品表

我希望它看起来像这样,其中数据的数据将根据我从各个月份检索到的数据而变化。月份和年份将以下拉列表的形式显示。

样品表

该工作簿将每天更新。所涉及的工作表的名称将以如下格式命名:Jul'19、Aug'19、Sept'20 等。随着时间的推移,将会创建更多工作表。

标签: excelvba

解决方案


请创建一个表单并将下一个代码放入其模块中:

Option Explicit

Private Sub UserForm_Initialize()
    Dim sh As Worksheet, wb As Workbook
    
    Set wb = ActiveWorkbook
    For Each sh In wb.Sheets
        Me.cbMonth.AddItem sh.Name
    Next sh
End Sub

Private Sub cbMonth_Change()
  Dim wb As Workbook, sh As Worksheet, Tbl As ListObject
  Set wb = ActiveWorkbook
  Set sh = wb.Sheets(Me.cbMonth.Value)
  Set Tbl = sh.ListObjects(1)
  arr = Tbl.Range.Value
   With Me.ListBox1
        .ColumnCount = UBound(arr, 2)
        .ColumnWidths = "40;25;22;23;22;22;22;48;40"
        .list = arr
   End With
End Sub

因此,您必须放置一个名为“ListBox1”的组合框cbMonth和一个名为“ListBox1”的列表框。

在表单Initialize事件中,组合框将填充工作表名称。

在组合框Change事件中,“ListBox1”填充了所选工作表名称的第一个表格范围。因此,在每个工作表中应该只存在一个表,或者,如果有更多表,则必须是第一个表。

您还可以使用其DblClick事件在列表框中输入数据。将询问用户要输入数据的日期,然后也可以更新工作表......

表格图片


推荐阅读