如何使用与特定日期匹配的数据集填充组合框

How to fill a combobox with a dataset that matches a specific date

我正在 Excel 中创建一个用户表单,允许用户查看在选定日期输入的所有记录。使用填充有本周日期的组合框来选择日期。然后所有其他操作都由命令按钮触发。

我想弄清楚如何使用命名范围内与所选日期匹配的所有数据填充评论组合框 and/or 评论列表框。任何帮助表示赞赏。下面的代码包含一个死端的 Vlookup 命令。

工作表:Data_Entry
命名范围:Records_Entered
用户表单:ufrmDataEntry1
日期组合框:CboReviewWeek
命令按钮:CmdReviewCount
评论组合框:CboReviewRecords
评论列表框:LstReviewRecords

Private Sub UserForm_Initialize()
    'fill combobox
    Me.CboReviewWeek.List=[index(Text(today()-weekday(today(),2)+row(1:7),"mm/dd/yyyy"),)]
End Sub

Private Sub CmdReviewCount_Click()
    'Step 1) pass selection of CboReviewWeek to "Formulas" sheet
    ActiveWorkbook.Sheets("Formulas").Range("A4") = Me.CboReviewWeek
    'Step 2) Return count of total records entered on selected date
    Me.TxtReviewCount = ActiveWorkbook.Sheets("Formulas").Range("A5")
    'Step 3) Return records entered to listbox
    var1 = WorksheetFunction.VLookup(CboReviewWeek.Value, Worksheets("Data_Entry").Range("Records_Entered"), 2, False)
    LstReviewRecords.Value = var1
    CboReviewRecords.Value = var1
    'Me.LstReviewRecords.List = ActiveWorkbook.Sheets("Data Entry").Range("Records_Entered")
    'Is broke here
End Sub

有多种方法可以获得您想要的结果。解决方案可能取决于您没有提到的两个问题——您是只存储日期还是日期时间,以及您的数据是按输入的日期排序还是按其他顺序排序。后者很关键——如果数据按输入日期排序,那么您要查找的记录组是连续的。如果没有,那么它们将分散在您的工作表中。

假设您的记录是有序的,您只需找到开始行和结束行。我假设您在 Records_Entered 范围内查找的日期在第一列中——如果不是,您需要更改代码中的“1”以匹配。

Dim R as Range, NumRows as integer

NumRows=Worksheets("Data_Entry").Range("Records_Entered").Rows.Count
Set R=Worksheets("Data_Entry").Range("Records_Entered").Columns(1).Find(What:=CboReviewWeek.Value, after:=Worksheets("Data_Entry").Cells(NumRows,1))
Do While R.value=CboReviewWeek.Value
  CboReviewReviewRecords.addItem R.value (Or, if you want to return the second column like in your VLOOKUP above, use R.offset(0,1).value)
  Set R=R.offset(1,0)
Loop

查找中的 "after" 属性是必需的,因为不幸的是,Excel 从第一个单元格开始搜索,只查看它后面的单元格——即如果所选日期实际上是范围内的第一个日期,查找结果将在第二行。通过在最后一行开始搜索,它强制 Excel 换行到第一行开始搜索。

如果记录未按顺序排序,或者您只是想要更灵活的解决方案,则可以改用 FindNext:

Dim R as Range, NumRows as integer, FirstCell as Range

NumRows=Worksheets("Data_Entry").Range("Records_Entered").Rows.Count
Set R=Worksheets("Data_Entry").Range("Records_Entered").Columns(1).Find(What:=CboReviewWeek.Value, after:=Worksheets("Data_Entry").Cells(NumRows,1))
Set FirstCell = Nothing
Do While Not R is Nothing and R<>FirstCell
  If FirstCell is Nothing then Set FirstCell = R
  CboReviewReviewRecords.addItem R.value (Or, if you want to return the second column like in your VLOOKUP above, use R.offset(0,1).value)
  Set R=Worksheets("Data_Entry").Range("Records_Entered").Columns(1).FindNext
Loop

如果您正在查看的列中有 Date/Time,它会变得更加复杂

希望这能让你朝着正确的方向前进