【发布时间】:2018-04-20 22:20:34
【问题描述】:
我正在尝试让 Workbook_Open 事件填充控件组合框
这样当用户访问Worksheet("Benchmarking") 时,他们有一个预填充列表可供选择,其中包括数组datesArr 中的所有项目。
我遇到的问题是,在打开电子表格并导航到 Worksheet("Benchmarking") 时,我只在下拉列表中看到一项:
如果我选择该项目,那么列表实际上会填充:
想要的结果:
我希望从用户第一次尝试进行选择时就可以使用完整列表,而不仅仅是在ComboBox1_Change 事件被触发之后。
审查了许多帖子,例如Sometimes the ActiveX Combobox only shows one row, why? , Populating Combo Box on WorkBook Open 我尝试了几种不同的方法,包括 Workbook_Open 事件代码中的以下内容:
.ListFillRange = "DropDownDates"
.List = DateArrToStrAr
我还循环了将项目添加到 ComboBox1 的数组。每次我在下拉结果中得到相同的 1 个可见项目。
有人能告诉我哪里出错了吗?
我当前的代码是
1) ThisWorkbook
Private Sub Workbook_Open()
With Worksheets("Benchmarking").OLEObjects("ComboBox1").Object
.Clear
.List = DateArrToStrArr '
End With
End Sub
2) 工作表(“基准测试”):
Private Sub ComboBox1_Change() 'QH 2/11/17
Dim datesArr() As String
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Lkup")
datesArr = DateArrToStrArr 'function that reads a named range of dates and converts to string to avoid dd/mm becoming mm/dd
If ComboBox1.Value = vbNullString Then ComboBox1.Value = "01/04/2016"
ComboBox1.List = datesArr
'.....other code
End Sub
注意事项:
数组datesArr 由函数DateArrToStrArr() 填充,该函数读取指定的日期范围"DropDownDates"(工作簿范围)并将它们转换为字符串数组。然后将其分配给 ComboBox。
DropDownDates 是一个动态命名范围,公式为=OFFSET(Lkup!$F$16,,,Lkup!$M$12,)
设置:Excel 2016 64 位 Windows。
【问题讨论】:
-
如果是控件框,那么您可以将其
Input Range属性直接设置为DropDownDates,它将显示值。是否有任何理由以编程方式执行此操作? -
我现在记得为什么我以编程方式进行操作。这是为了确保组合框填充了字符串,以避免组合框中出现数字或 mm/dd/yyyy 格式。这确保始终显示“dd/mm/yyyy”。源范围是函数 DateArrToStrArr() 转换为字符串之前的日期。
-
DropDownDates范围内的日期是固定的还是计算的?如果已计算,请在使用它们之前尝试强制重新计算。 -
范围是动态的。工作簿打开时不会重新计算吗?