如何在办公室中自动停止ActiveX对象的大小?

end*_*and 14 excel vba activex excel-vba

这个主题讨论了我在Excel电子表格中使用ActiveX对象时遇到的问题.阅读是一团糟,最终没有一个有凝聚力的答案.

问题是100%可重现:

  1. 使用扩展坞时,在电子表格中使用ActiveX对象打开工作簿
  2. 从扩展坞断开机器,触发分辨率更改(还有其他原因,我的是扩展坞,似乎改变分辨率会导致这种情况)
  3. 单击一个ActiveX控件 - 它们会立即调整大小并更改字体大小.fontsize更改不是.Font.Size参数的函数,而是在问题发生后无法更改的内容,而不是持续增加字体大小

唯一看似权威的解决方案涉及一个MS补丁(几年前它是一个"修补程序",因此对于完全部署似乎不实用)和注册表编辑,这对我的用例来说不实用.

我正在寻找一种方法:

  1. 防止这种变化发生
  2. 找到最好的工作

在线缺乏关于此问题的权威信息.我打算发布我的工作,然而,它甚至没有接近理想,我更喜欢更好的解决方案.

end*_*and 2

我的解决方法是以编程方式迭代工作表*上的所有 OLE 对象并将代码写入调试器,然后在工作表上包含一个基本上“调整对象大小”的按钮 - 并说明为什么会出现此问题。

此方法将生成驱动该按钮的代码。

但它不会自动更新 - 它是一个快照,只能部署应用程序之前立即使用(如果最终用户将具有按钮功能)。

那么序列就变成:

  1. 运行使用以下方法生成的代码
  2. 立即保存工作簿 - 这不会阻止字体更改继续发生
  3. 重新打开工作簿,问题已“解决”

Private Sub printAllActiveXSizeInformation()
    Dim myWS As Worksheet
    Dim OLEobj As OLEObject
    Dim obName As String
    Dim shName As String

    'you could easily set a for/each loop for all worksheets
    Set myWS = Sheet1

    shName = myWS.name

    Dim mFile As String
    mFile = "C:\Users\you\Desktop\ActiveXInfo.txt"


    Open mFile For Output As #1
    With myWS
        For Each OLEobj In myWS.OLEObjects
            obName = OLEobj.name

            Print #1, "'" + obName
            Print #1, shName + "." + obName + ".Left=" + CStr(OLEobj.Left)
            Print #1, shName + "." + obName + ".Width=" + CStr(OLEobj.Width)
            Print #1, shName + "." + obName + ".Height=" + CStr(OLEobj.Height)
            Print #1, shName + "." + obName + ".Top=" + CStr(OLEobj.Top)
            Print #1, "ActiveSheet.Shapes(""" + obName + """).ScaleHeight 1.25, msoFalse, msoScaleFromTopLeft"
            Print #1, "ActiveSheet.Shapes(""" + obName + """).ScaleHeight 0.8, msoFalse, msoScaleFromTopLeft"

        Next OLEobj
    End With

    Close #1

    Shell "NotePad " + mFile



End Sub
Run Code Online (Sandbox Code Playgroud)

*注意:不幸的是,这也不会找到分组的对象。