Excel的ActiveXcombobox中的错误?

我注意到,当出现各种烦人的错误时:

  • 我有一个工作表上的ActiveXcombobox(而不是一个Excel表单)
  • combobox具有链接到它们的事件代码(例如onchange事件)
  • 我使用他们的listfillrange或linkedcell属性(清除这些属性似乎缓解了很多问题)
  • (不知道这是否连接),但有针对性的linkedcell有数据validation。

我编写了一个相当复杂的excel应用程序,可以处理大量的事件并使用大量的控件。 几个月来,我一直在试图处理与这些combobox有关的各种错误。 现在我不记得每个实例的所有细节,但是这些错误往往涉及将listfillrange和linkedcell属性指向指定的范围,并且经常与在不适当的时候触发的combobox事件有关(例如当application.enableevents = false)。 这些问题似乎在Excel 2007中变得越来越大,所以我不得不完全放弃这些combobox(我现在使用包含在用户表单中的combobox,而不是直接在表单上)。

有其他人看过类似的问题吗? 如果是这样,有没有一个优雅的解决scheme? 我曾与谷歌环顾四周,迄今还没有发现任何有类似问题的人。

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

  • 当我启动时(包括combobox_onchange,listfillrange->在另一个不同的工作表上命名的范围和workbook_open交互),Excel崩溃。 (注意,在用户直接编辑它们的情况下,我也对链接​​的单元格进行了一些数据validation。)
  • Excel渲染错误(通常当combobox发生变化时,另一个工作表中的某些单元格会随机地在当前工作表的顶部进行绘制)。有时候,它会将屏幕完全闪烁到另一个工作表中。
  • Excel失去了主意(或者说,调用堆栈)(与第一个重点相关)。 有时,当一个函数修改combobox的属性时,comboboxonchange事件触发,但是它永远不会将控制返回到导致首先更改的function。 即使在application.enableevents = false的情况下也会触发combobox_onchange事件。
  • 事件发生时,他们不应该(我发布了与此有关的堆栈溢出的另一个问题)。

在这一点上,我相当确信ActiveXcombobox是邪恶的化身,不值得麻烦。 我已经转而将这些combobox包含在一个用户窗体模块中。 我宁愿用popup窗体的用户比随机视觉文物和崩溃(与数据丢失)不便。

我没有给你明确的答案,但我可以告诉你,大约10年前我停止使用ListFillRange和LinkedCell for ActiveX控件。 我不记得我遇到了什么特别的问题。 我只记得得出这样的结论:无论什么时候他们救了我,都不值得大脑的痛苦,试图追踪错误。 所以现在我通过代码填充控件并处理事件中的输出。

当戴尔停靠时,我的active-xcombobox可以正常工作,但在戴尔脱离接触时每次点击时都会调整为更大的字体 – 这很奇怪。 我添加了resize的代码,当解除连接时,但是.height和.scaleheight在停靠时以及以编程方式触发(甚至是陌生人)时都会失败。

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

然后,我添加了我自己的enableevents-like开关,以便只有当用户selectcombobox值时才会发生resize,而不是在macros运行时受到任何影响。

 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 

最后,这似乎工作,是否停靠或无锁,不pipe是由用户触发还是在过程中。 我们会看看它是否成立

我有一个戴尔用户的部分答复,并为您的格式问题

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

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

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

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

数据validation列表中的单元格下拉列表不存在问题。 如果为单元格设置了validation列表,则将数据validation错误消息设置为空string,则可以在单元格中input自由格式文本; 下拉列表是build议性的,而不是强制性的限制列表。

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

通过使用VBA事件来调整或调整您的Active-X控件0.75毫米,问题有时会得到改善(但从未完全解决)。

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

…这就是我所知道的关于字体渲染问题的一切。 如果Mike(戴尔的笔记本电脑)正在阅读这个问题:祝你好运,这些解决方法 – 据我所知,没有真正的“修复”。

在Excel 2003发布之前,稳定性问题一直是我头痛的问题:在表单中使用任何Active-X控件都是一个不稳定因素。 即使在Excel 2003中,陪审团依然在embedded在工作表中的Listbox控件上:我仍然避免使用它们。

所以我面临着同样的问题。 我有一个下拉列表的文件,在这个文件夹上叠加了combobox,以便在缩小太多的情况下解决模糊不清的问题。 这就是我的代码最初看起来像:

 '========================================= Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim str As String Dim cboTemp As OLEObject Dim ws As Worksheet Set ws = ActiveSheet On Error GoTo errHandler 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 On Error GoTo errHandler If Target.Validation.Type = 3 Then 'if the cell contains a data validation list Application.EnableEvents = False 'get the data validation formula str = Target.Validation.Formula1 str = Right(str, Len(str) - 1) With cboTemp 'show the combobox with the list .Visible = True .Left = Target.Left .Top = Target.Top .Width = Target.Width + 15 .Height = Target.Height + 5 .ListFillRange = ws.Range(str).Address .LinkedCell = Target.Address End With cboTemp.Activate 'open the drop down list automatically Me.ComboBox1.DropDown End If exitHandler: Application.ScreenUpdating = True Application.EnableEvents = True Exit Sub errHandler: Resume exitHandler End Sub '==================================== 'Optional code to move to next cell if Tab or Enter are pressed 'from code by Ted Lanham '***NOTE: if KeyDown causes problems, change to KeyUp 'Table with numbers for other keys such as Right Arrow (39) 'https://msdn.microsoft.com/en-us/library/aa243025%28v=vs.60%29.aspx Private Sub ComboBox1_KeyDown(ByVal _ KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) Select Case KeyCode Case 9 'Tab ActiveCell.Offset(0, 1).Activate Case 13 'Enter ActiveCell.Offset(1, 0).Activate Case Else 'do nothing End Select End Sub '==================================== 

我面对各种各样的问题,但主要是在这个话题上提到,LinkedCell问题是最大的。 我从下拉菜单中select的内容将在我上次点击的表单中的任意位置进行,而不是从我select的下拉框中select单元格,并且正在处理中,也会干扰select的任何位置的代码。 我使用了一个简单的ONE LINE代码来确保我的ActiveX程序只在下拉菜单中运行。 我在LinkedCell命令运行之前使用了这个:

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

所以我现在的代码如下所示:

 '... 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 

令人难以置信的是,这工作。 现在我的Excel表格已经不再行了 希望这可以帮助。

出于这个原因,当在电子表格上放置combobox时,我使用带有数据validation列表的单元格。