【问题标题】:How to fill a combobox with a dataset that matches a specific date如何使用与特定日期匹配的数据集填充组合框
【发布时间】:2015-04-05 10:44:14
【问题描述】:

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

我试图弄清楚如何使用与所选日期匹配的命名范围中的所有数据填充评论组合框和/或评论列表框。任何帮助表示赞赏。以下代码包含一个 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

【问题讨论】:

    标签: excel vba combobox


    【解决方案1】:

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

    假设您的记录是有序的,您只需要找到开始行和结束行。我假设您在 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
    

    需要 find 中的“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
    

    如果您正在查看的列中有日期/时间,它会变得更加复杂

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

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 2012-02-09
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多