指向基于公式的命名范围的Excelcomboboxlistfillrange属性有问题

Excel中的ActiveXcombobox对象在ListFillRange引用基于公式的命名范围(定义名称)时performance不佳。

我想我遇到了其他错误,甚至可能发生Excel崩溃,但现在发生的情况是,combobox_change()事件在工作簿中的任何单元格被更改时触发。

我不确定这是否真的是一个错误,或者是否有修复或解决方法。 如果这是一个错误,我该如何报告给Excel人员?

最后,我的问题的真正内容是“我如何最好地解决这个问题?” 我想有一些基于公式的命名范围,但似乎这是不可能的。

要重现此错误,请执行以下操作:

  1. 创build一个新的工作簿。 在Sheet3上,创build一个小的表格3列,并有几行高。
  2. 用这个公式(或等价物)创build一个命名范围:= OFFSET(Sheet3!$ A $ 2:$ C $ 36,0,0,COUNTA(Sheet3!$ A:$ A),COUNTA(Sheet3!$ 4:$ 4))要做到这一点使用input>名称>定义。 将该范围命名为“demoRange”
  3. 转到Sheet1并创build一个combobox,( 它必须在一个单独的工作表上 )。 (使用“控件工具箱”菜单, 而不是 “表单”菜单)。
  4. 点击Design Mode(devise模式)button(带铅笔的蓝色三angular形),然后右键点击combobox并转到属性。
  5. 在combobox的属性窗口中,更改ListFillRange属性,使其指向您在步骤2(“demoRange”)中创build的命名范围。
  6. 您可能希望将ColumnCount属性更改为3,并将ColumnWidths属性更改为“50,50,50”
  7. 通过在linkedCell属性中键入A1,将linkedCell属性设置为单元格“A1”。
  8. closures属性窗口,双击combobox来定义它的change()事件。
  9. 在新的combobox的更改事件的子例程中放置一个Debug.Assert(false)或Msgbox(“demo”)行。
  10. 退出devise模式
  11. 重要的 – 现在selectcombobox中的一个项目。 事件应该是第一次正常触发。 (如果你不这样做,错误将不会显示 – 必须在combobox中select一些东西)
  12. 在工作簿的任何位置编辑单元格[编辑]或任何其他打开的工作簿[/编辑],在任何工作表和任何位置。 每次编辑任何单元格(至less对我而言),都会运行combobox的onchange事件。

再次,这是正常的,什么是我正在做的最好的select? 这个combobox被链接到不同的单元格,并应该是Excel数据validation下拉列表中的小字体的替代品。

我的build议是永远不要使用ListFillRange和LinkedCell。 他们只是麻烦。 用列表填充你的列表框,并使用Change事件写入单元格。 某处,也许Workbook_Open事件,填充列表框

Private Sub Workbook_Open() Sheet2.ListBox1.Clear Sheet2.ListBox1.List = Sheet1.Range("demoRange").Value End Sub 

然后在Sheet2模块中的更改事件中,检查是否有被点击的东西并将其写入单元格

 Private Sub ListBox1_Change() If Me.ListBox1.ListIndex >= 0 Then Sheet2.Range("A1").Value = Me.ListBox1.Value End If End Sub 

到目前为止,我有几个选项可用。 我能想到的最好的是这样的:

避免直接使用基于公式的命名范围。 相反,定义一个子程序来检查定义范围“demoRange”是否应该从当前值改变。 在workbook_open和sheet3_deactivate事件上运行此子例程。 如果需要,提示用户询问是否可以更新指定的范围。 更新“demoRange”的macros可能只是从“demoRange_FormulaBased”命名范围复制到“demoRange”,这将是静态的。 [/编辑]

这个解决scheme效果很好,因为您可以继续使用linkedcell属性,不必使用VBA来填充combobox,并且指定的范围仍然可以用于其他目的。 避免使用onchange事件来运行这个新的子程序,因为如果用户打开“查找/replace”对话框并select“全部replace”,最终可能触发数千次。