5

我注意到在以下情况下会出现各种烦人的错误:

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

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

有没有其他人看到过类似的问题?如果是这样,是否有一个优雅的解决方案?我用谷歌环顾四周,到目前为止还没有发现任何有类似问题的人。

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

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

在这一点上,我相当确信 ActiveX 组合框是邪恶的化身,不值得麻烦。我已改为将这些组合框包含在用户表单模块中。我宁愿使用弹出表单给用户带来不便,而不是随机的视觉伪影和崩溃(数据丢失)。

4

5 回答 5

3

我没有给你一个明确的答案,但我可以告诉你,大约 10 年前我停止使用 ListFillRange 和 LinkedCell 进行 ActiveX 控件。我不记得我遇到了什么特别的问题。我只记得得出的结论是,无论他们为我节省了多少时间,都不值得为寻找这些错误而费尽脑汁。所以现在我通过代码填充控件并处理事件中的输出。

于 2010-02-25T15:13:08.967 回答
2

当我的戴尔停靠时,我的 active-x 组合框工作正常,但在戴尔未停靠时每次单击它时都会调整为更大的字体 - 非常奇怪。我添加了在未停靠时有效的调整大小代码,但 .height 和 .scaleheight 在停靠时和以编程方式触发时都会失败(甚至更陌生)。

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

然后,我添加了自己的类似 enableevents 的开关,以便仅在用户选择组合框值时调整大小,而不是在宏运行时发生任何影响时。

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

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

于 2010-11-30T20:41:05.670 回答
2

我有部分回复戴尔用户,以及您的格式化问题

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

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

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

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

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

通过在 Active-X 控件中使用终端或系统字体有时可以改善(但从未完全解决)该问题。

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

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

...这就是我所知道的关于字体渲染问题的一切。如果迈克(使用他的戴尔笔记本电脑)正在阅读以下内容: 祝您好运,这些变通方法 - 据我所知,没有真正的“修复”。

在 Excel 2003 出现之前,稳定性问题一直是我头疼的问题:在工作表中使用任何 Active-X 控件都会导致不稳定。即使在 Excel 2003 中,对于嵌入工作表的 Listbox 控件,评审团仍然没有意见:我仍然避免使用它们。

于 2010-12-02T19:00:57.857 回答
1

所以我面临着同样的问题。我有一个带有下拉列表的文件,我在其上叠加了组合框,以解决缩小太多时难以辨认的问题。这就是我的代码最初的样子:

'=========================================
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 问题是最大的。我从下拉菜单中的选择将转到我最后单击的工作表上的任何位置,而不是我从中选择下拉框的单元格,并且在处理过程中,还会干扰选择所在位置的代码。我使用了一个简单的 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 表不再行为不端了。希望这可以帮助。

于 2017-12-01T01:04:10.213 回答
0

出于这个原因,在将组合框放在电子表格上时,我使用带有数据验证列表的单元格。

于 2010-02-25T16:44:57.167 回答