Excel组合框listfillrange属性指向基于公式的命名范围存在问题

时间:2009-08-11 22:44:08

标签: excel vba

Excel中的ActiveX组合框对象在其ListFillRange引用基于公式的命名范围(定义的名称)时表现不佳。

我认为我遇到了其他错误,甚至可能因此崩溃而崩溃,但是现在所发生的一切都是随着工作簿中任何单元格的更改而触发的combobox_change()事件。

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

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

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

  1. 创建新工作簿。在Sheet3上,创建一个小表3列,高几行。
  2. 使用此公式(或等效项)创建命名范围:= OFFSET(Sheet3!$ A $ 2:$ C $ 36,0,0,COUNTA(Sheet3!$ A:$ A),COUNTA(Sheet3!$ 4: $ 4))为此,请使用输入>名称>定义。将范围命名为“demoRange”
  3. 转到Sheet1并创建一个组合框,(它必须位于单独的工作表上)。 (使用“控件工具箱”菜单,“表单”菜单)。
  4. 单击“设计模式”按钮(带铅笔的蓝色三角形),然后右键单击组合框并转到“属性”。
  5. 在组合框的属性窗口中,更改ListFillRange属性,使其指向您在步骤2中创建的命名范围(“demoRange”)。
  6. 您可能希望将ColumnCount属性更改为3,将ColumnWidths属性更改为“50,50,50”
  7. 通过在linkedCell属性中键入A1,将linkedCell属性设置为单元格“A1”。
  8. 关闭属性窗口,双击组合框以定义其change()事件。
  9. 在新的组合框更改事件的子例程中放入Debug.Assert(false)或Msgbox(“demo”)行。
  10. 退出设计模式
  11. 重要 - 现在选择组合框中的项目。该事件应该在第一次正常触发。 (如果不执行此步骤,则不会显示错误 - 必须在组合框中选择一些内容)
  12. 在任何工作表和任何位置编辑工作簿[编辑]或任何其他打开的工作簿[/ edit]中的任意位置。每次编辑任何单元格时(至少对我来说),都会运行组合框的onchange事件。
  13. 同样,这是正常的,我正在做什么的最佳选择是什么?此组合框链接到各种单元格,并且应该是默认情况下excel提供的数据验证下拉列表中的小字体的替代。

2 个答案:

答案 0 :(得分:3)

我的建议是永远不要使用ListFillRange和LinkedCell。他们只是麻烦。使用List填充列表框并使用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

答案 1 :(得分:0)

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

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

此解决方案效果很好,因为您可以继续使用linkedcell属性,您不必使用VBA来填充组合框,并且命名范围仍可用于其已有的任何其他目的。避免使用onchange事件来运行这个新的子例程,因为如果用户打开“查找/替换”对话框并选择“全部替换”,它可能会被触发数千次。