调用form.Controls.Add

时间:2018-12-05 16:57:10

标签: excel vba excel-vba

当用户与UserForm的交互中调用以下代码时,

Excel 2016 版本1811(内部版本11029.20079即点即用)崩溃而没有错误。事实是,它仅在(main) UserForm中崩溃。如果将容器添加到任何其他UserForm中,它将执行而没有任何问题。

Private container As Object

'***************************************************************************
'Purpose: Create the container frame that holds the page title and preview image
'***************************************************************************
Private Sub createContainer()
    Set container = main.pageThumbnails.Controls.add("Forms.Frame.1", name) ' Break here, continuing causes *CRASH*

    With container
        .Caption = ""

        .height = containerHeight
        .width = containerWidth
        .Left = 12
        .top = areaHeight

        .BackColor = defaultBackColor
        .BorderColor = defaultBorderColor
    End With

    With main.pageThumbnails
        .ScrollHeight = areaHeight
    End With

End Sub

检查Windows事件查看器会给我以下信息:

Faulting application name: EXCEL.EXE, version: 16.0.11029.20079, time stamp: 0x5bf4c8c3
Faulting module name: coml2.dll, version: 10.0.17134.407, time stamp: 0xaad4943a
Exception code: 0xc0000005
Fault offset: 0x0000000000016521
Faulting process id: 0x100788
Faulting application start time: 0x01d48cb0460efe6f
Faulting application path: C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE
Faulting module path: C:\WINDOWS\System32\coml2.dll
Report Id: 3ff6565e-7c37-4733-87fd-7e5ab12cba1f
Faulting package full name: 
Faulting package-relative application ID: 

我尝试过的事情:

  1. 以兼容模式运行(Windows 7和8)
  2. 将文件从网络位置移动到本地计算机上的“下载”文件夹中
  3. container而不是MSForms.frame铸造为Object
  4. 重新启动计算机和Excel
  5. 以安全模式运行Excel:excel.exe /s
  6. container私有更改为公开,并引用Me.container
  7. 尝试了Microsoft here提供的每种方法(以及每种方法)
  8. 从Microsoft安装了KB4011128更新。 它检测到一个问题并“解决了”,但问题仍然存在
  9. Redditors suggested卸载4018319更新可以解决此问题,但我没有安装它。
  10. 使用单例模块而不是main引用main.thumbnails表单
  11. main代码隐藏表单上创建框架
  12. 从单例模块引用创建的框架
  13. 创建了一个新的.xlsm文件,并将其复制到所有类,模块和表单(main除外)上。从头开始创建main
  14. 将新创建的CommandButton添加到框架(此方法有效...)
  15. thumbs帧的ID更改为一堆随机字母

2 个答案:

答案 0 :(得分:0)

在整个搜索过程中,我发现Windows事件查看器中的其他人具有相同的崩溃和错误日志。这些帖子都没有像我一样使用VBA。 我通过删除引用的控件main.pageThumbnails并在编辑器中重新创建它来解决了这个问题。

目前我不知道是什么原因引起的,也不知道此解决方案是否永久。


更新2019年1月30日

在继续努力解决这个问题,没有提出最终解决方案,甚至没有解释为什么发生这种情况之后,我创建了一个解决方法。

我没有向容器中添加MSForms.Frame对象,而是向容器中添加了框架内容(图像和四个标签),并通过Sub setTop方法控制了它们的位置。

目前,我不确定性能是否会受到影响,但至少我可以继续开发其他功能。

答案 1 :(得分:0)

pageThumbnails还是一个框架吗?您的用户表单中是否还有其他容器?如果是这样,这是一个Excel错误。

这是一个古老的问题,但是我花了数小时试图找到解决方案,所以这是我的发现。

首先,要复制问题:

  • 创建一个新的UserForm(UserForm1)
  • 添加框架(FrameA)
  • 添加此代码:
Private Sub UserForm_Activate()
    Set b = FrameA.Controls.Add("Forms.Frame.1", "FrameB")
End Sub
  • 添加具有以下内容的模块(Module1):
Sub showUserForm1()
    UserForm1.Show
End Sub
  • 运行showUserForm1

一切正常。现在,在UserForm_Activate():Set d = FrameC.Controls.Add("Forms.Frame.1", "FrameD")中添加第二个Frame(FrameC)及其代码。再次运行showUserForm1:Excel崩溃。更准确地说,它在第一行崩溃(如果您跳过它,第二行工作正常)。

经过进一步测试,看来只有在您要添加其他框架的框架在背面时,该框架才会失败。如果连续将FrameA或Frame C放在前面,您会发现它总是在后面的Frame上失效。

所以我只能想到3种可能性:

  • 不要使用框架,而是按照OP的建议将控件直接放在UserForm中,
  • 确保您的框架在设计模式下位于顶部(使用Zorder无效)
  • 如果您不能将框架放在顶部(例如,多个框架),请尝试在运行时全部创建它们(内部是FrameA和FrameB,然后是内部FrameC和FrameD,等等)。