我注意到在以下情况下我遇到了各种恼人的错误:
我编写了一个相当复杂的excel应用程序,它执行大量事件处理并使用大量控件。几个月来,我一直在努力处理各种与这些组合框有关的错误。我现在不记得每个实例的所有细节,但是这些错误往往涉及将listfillrange和linkedcell属性指向命名区域,并且通常与在不适当的时间触发的组合框事件有关(例如当application.enableevents时) = false)。这些问题似乎在Excel 2007中变得越来越大,因此我不得不完全放弃这些组合框(我现在使用用户表单中包含的组合框,而不是直接在工作表上)。
还有其他人见过类似的问题吗?如果是这样,那是否有优雅的解决方案?我一直在寻找谷歌,到目前为止还没有发现任何有类似问题的人。
我最终看到的一些症状是:
此时,我相信ActiveX组合框是邪恶的化身,不值得麻烦。我已经切换到在userform模块中包含这些组合框。我宁愿用弹出窗口给用户带来麻烦,而不是随机的视觉工件和崩溃(数据丢失)。
答案 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)
因此,在电子表格中放置组合框时,我会使用带有数据验证列表的单元格。