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

时间:2015-03-28 15:15:15

标签: excel vba combobox

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

我正在尝试弄清楚如何使用与所选日期匹配的命名范围中的所有数据填充评论组合框和/或查看列表框。任何帮助表示赞赏。以下代码包含一个作为deadend的Vlookup命令。

工作表:Data_Entry
命名范围:Records_Entered
userform: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 个答案:

答案 0 :(得分: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
""""需要查找属性,因为遗憾的是,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

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

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

相关问题