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

Excel 如何用与特定日期匹配的数据集填充组合框,excel,vba,combobox,Excel,Vba,Combobox,我正在Excel中创建一个userform,允许用户查看在选定日期输入的所有记录。使用组合框选择日期,组合框中填充了当前周的日期。然后,所有其他操作都由命令按钮触发 我试图找出如何用与所选日期匹配的命名范围中的所有数据填充“审阅”组合框和/或“审阅列表框”。感谢您的帮助。下面的代码包括一个Vlookup命令,它是一个死端 工作表:数据输入 命名范围:输入的记录 用户表单:ufrmDataEntry1 日期组合框:CboReviewWeek 命令按钮:CmdReviewCount 查看组合框:Cb

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

我试图找出如何用与所选日期匹配的命名范围中的所有数据填充“审阅”组合框和/或“审阅列表框”。感谢您的帮助。下面的代码包括一个Vlookup命令,它是一个死端

工作表:数据输入
命名范围:输入的记录
用户表单: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

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

假设您的记录是有序的,您只需要找到开始行和结束行。我假设您在输入的记录范围中查找的日期在第一列中——如果不是,您需要更改代码中的“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
Dim R作为范围,NumRows作为整数,FirstCell作为范围
NumRows=工作表(“数据输入”).范围(“记录输入”).行数
设置R=工作表(“数据项”).Range(“记录项”).Columns(1).Find(What:=CboReviewWeek.Value,after:=工作表(“数据项”).Cells(NumRows,1))
设置FirstCell=Nothing
不做就做R什么都不是,R第一个单元格
如果FirstCell为空,则设置FirstCell=R
CboReviewReviewRecords.addItem R.value(或者,如果您希望返回与上面的VLOOKUP类似的第二列,请使用R.offset(0,1).value)
设置R=工作表(“数据输入”)。范围(“记录输入”)。列(1)。FindNext
环
如果你看到的专栏中有日期/时间,它会变得复杂得多

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