如何用与特定date匹配的数据集填充combobox

我在Excel中创build一个用户窗体,允许用户查看在选定dateinput的所有logging。 dateselect使用combobox填充本周的date。 然后所有其他操作都由一个命令button触发。

我想弄清楚如何使用与选定date相匹配的命名范围中的所有数据来填充审阅combobox和/或审阅列表框。 任何帮助表示赞赏。 下面的代码包含一个作为一个deadend的Vlookup命令。

工作表:Data_Entry
命名范围:Records_Entered
userform:ufrmDataEntry1
datecombobox:CboReviewWeek
命令button:CmdReviewCount
检查combobox: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 

有几种方法可以得到你想要的结果。 解决scheme可能取决于您没有提到的两个问题 – 无论是仅存储date还是date时间,以及数据是按inputdate还是按其他顺序sorting。 后者是至关重要的 – 如果数据按inputdatesorting,那么您要查找的logging组是连续的。 如果没有,那么他们将通过你的工作表分散。

假设你的logging是有序的,你只需要find开始和结束行。 我假设你在Records_Entered范围内查找的date是在第一列 – 如果没有,你需要改变代码中的“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开始用第一个单元格进行search,并且只查看它后面的单元格 – 也就是说,如果select的date实际上是该范围中的第一个date,则查找将导致第二排。 通过在最后一行开始search,它强制Excel将其换行到第一行以开始search。

如果logging没有按顺序sorting,或者如果您只想要一个更灵活的解决scheme,则可以使用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/时间,则会变得更加复杂

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