Excel ActiveX组合框中的错误?

时间:2010-02-25 01:38:29

标签: excel excel-vba excel-2007 excel-2003 vba

我注意到在以下情况下我遇到了各种恼人的错误:

  • 我在工作表(不是excel表单)上有ActiveX组合框
  • 组合框具有链接到它们的事件代码(例如,onchange事件)
  • 我使用他们的listfillrange或linkedcell属性(清除这些属性似乎可以缓解很多问题)
  • (不确定这是否已连接)但目标链接单元上有数据验证。

我编写了一个相当复杂的excel应用程序,它执行大量事件处理并使用大量控件。几个月来,我一直在努力处理各种与这些组合框有关的错误。我现在不记得每个实例的所有细节,但是这些错误往往涉及将listfillrange和linkedcell属性指向命名区域,并且通常与在不适当的时间触发的组合框事件有关(例如当application.enableevents时) = false)。这些问题似乎在Excel 2007中变得越来越大,因此我不得不完全放弃这些组合框(我现在使用用户表单中包含的组合框,而不是直接在工作表上)。

还有其他人见过类似的问题吗?如果是这样,那是否有优雅的解决方案?我一直在寻找谷歌,到目前为止还没有发现任何有类似问题的人。

我最终看到的一些症状是:

  • Excel启动时崩溃(涉及另一个不同工作表上的combobox_onchange,listfillrange->命名范围,以及workbook_open交互)。 (注意,我也对链接​​的单元格进行了一些数据验证,以防用户直接编辑它们。)
  • Excel渲染错误(通常当组合框发生变化时,来自另一个工作表的某些单元格随机地绘制在当前工作表的顶部)有时它会让屏幕完全闪烁到另一个工作表片刻。
  • Excel失去理智(或者更确切地说,调用堆栈)(与第一个项目符号点相关)。有时当函数修改组合框的属性时,组合框onchange事件会触发,但它永远不会将控制返回到导致首先发生更改的函数。即使application.enableevents = false,也会触发combobox_onchange事件。
  • 当他们不应该触发事件时(我发布了与此相关的堆栈溢出的另一个问题)。

此时,我相信ActiveX组合框是邪恶的化身,不值得麻烦。我已经切换到在userform模块中包含这些组合框。我宁愿用弹出窗口给用户带来麻烦,而不是随机的视觉工件和崩溃(数据丢失)。

5 个答案:

答案 0 :(得分:2)

我没有确切的答案,但我可以告诉你,大约10年前我停止使用ListFillRange和LinkedCell进行ActiveX控件。我不记得我遇到过哪些特殊问题。我只记得得出的结论是,无论他们什么时候拯救我,都不值得尝试追踪虫子。所以现在我通过代码填充控件并处理事件中的输出。

答案 1 :(得分:2)

当我的戴尔停靠时,我的active-x组合框工作正常,但每次点击戴尔时,只需点击一个更大的字体 - 非常奇怪。我添加了重新调整代码,该代码在取消停靠时有效,但是当停靠时以及以编程方式触发时,高度和.scaleheight都会失败(甚至更奇怪)。

        Sheet2.Shapes("cb_SelectSKU").Select
        Selection.ShapeRange.Height = 40
        Selection.ShapeRange.ScaleHeight 0.8, msoFalse, msoScaleFromTopLeft

然后我添加了我自己的类似启用事件的开关,这样只有在用户选择组合框值时才会调整大小,而不是在宏运行时受到任何影响。

Select Case strHoldEvents
    Case Is = "N"                                                   'Combobox resizing fails with error when triggered programatically (from SaveData)

        Call ShowLoadShts

        Sheet2.Shapes("cb_SelectSKU").Select
        Selection.ShapeRange.Height = 40
        Selection.ShapeRange.ScaleHeight 0.8, msoFalse, msoScaleFromTopLeft


    Case Else
End Select

最后,无论是停靠还是取消停靠,无论是由用户触发还是在程序中触发,它似乎都有效。我们会看看它是否成立......

答案 2 :(得分:1)

我对戴尔用户和格式问题有部分答复

格式化和显示问题是Excel中另一个已知但未记录的问题。

许多平板显示器(包括笔记本电脑显示器)无法在Excel电子表格的文本框控件中正确呈现字体:您有一个温和版本的问题。

我们公司最近升级到新的(并且更大!)显示器,我可以最后使用工作表中的文本框,标签和组合框。我们旧的三星屏幕正确显示文本控件,但任何手动或VBA驱动的更新都会导致混乱的字符混乱。

列表框没有问题:它是组合框中存在问题的“文本框”部分。尝试在VBA事件过程中操作列表框:它是一个kludge,但它的工作原理。

数据验证列表中的In-Cell下拉列表没有问题。如果为单元格设置验证列表,则将数据验证错误消息设置为空字符串,您可以在单元格中输入自由格式文本;下拉列表是建议性的,而不是强制性的限制列表。

通过在Active-X控件中使用终端或系统字体,问题有时会得到改善(但从未完全修复)。

通过使用VBA事件将Active-X控件微调或调整0.75 mm,问题有时会得到改善(但从未完全修复)。

检查您的笔记本电脑制造商是否已发布升级显示驱动程序。

......这就是我所知道的关于字体渲染问题的一切。如果Mike(戴着他的戴尔笔记本电脑)正在阅读这篇文章:祝你好运 - 据我所知,我没有真正的'修复'。

在Excel 2003问世之前,稳定性问题一直是我头疼的问题:在工作表中使用任何Active-X控件都是不稳定的根源。即使在Excel 2003中,评审团仍然可以使用嵌入在工作表中的Listbox控件:我仍然避免使用它们。

答案 3 :(得分:1)

所以我面临同样的问题。我有一个带有下拉列表的文件,我在其中叠加了组合框,以便在缩小太多时解决难以辨认的问题。这就是我的代码看起来像INITIALLY:

If Target.Validation.Type = 3 Then
'... all the normal code here...
End If

我遇到了各种各样的问题,但正如本主题中提到的那样,LinkedCell问题是最大的问题。我从下拉菜单中选择的内容将放在我最后点击的工作表上,而不是我从下拉框中选择的单元格,并且正在处理中,也会干扰选择所在的代码。我使用一个简单的ONE LINE代码来确保我的ActiveX程序只在其下拉菜单中运行。我在LinkedCell命令运行之前使用了它:

'... Code as before

If Target.Validation.Type = 3 Then
' NEW CODE LINE ABOVE
 If Target.Count > 1 Then GoTo exitHandler

Set cboTemp = ws.OLEObjects("ComboBox1")
  On Error Resume Next
If cboTemp.Visible = True Then
  With cboTemp
    .Top = 10
    .Left = 10
    .ListFillRange = "Treatment"
    .LinkedCell = Target.Address
    .Visible = False
    .Value = ""
  End With
End If
End If
' End of the new If

所以我的代码现在看起来像这样:

plan_id

令人难以置信,这很有效。现在我的excel表格不再是行为不端了。希望这会有所帮助。

答案 4 :(得分:0)

因此,在电子表格中放置组合框时,我会使用带有数据验证列表的单元格。