gpt4 book ai didi

excel - OLEObjects 和 Userform 之间的冲突

转载 作者:行者123 更新时间:2023-12-04 20:03:38 24 4
gpt4 key购买 nike

我正在尝试删除 ActiveX OLEObject从工作表然后启动 UserFormvbModeLess .
在下面的代码中:
首先,一个子创建一个 OLEObject (a Label )在工作表“mySheet”中及其标题和名称。

Sub creteOleo()

Dim rng As Range

Set rng = Sheets("mySheet").Range("B2:C3")

With Sheets("mySheet").OLEObjects.Add(ClassType:="Forms.Label.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=rng.Left, _
Top:=rng.Top, _
Width:=rng.Width, _
Height:=rng.Height)
.Name = "myOleo" 'A name
.Object.Font.Size = 13
.Object.Caption = "test"
End With
End Sub
然后是一个删除它的子程序,然后使用 vbModeLess 启动一个用户表单(用户表单只包含一个标签,它用于测试,所以里面没有代码)状态。
Sub deleteOleo()
Sheets("mySheet").OLEObjects("myOleo").Delete
UserForm1.Show vbModeless
End Sub
这是问题所在,删除特定的 OLEObject 然后启动 UserForm 会按预期删除 OLEObject,但随后 UserForm 会出现片刻,然后消失。
此问题仅在 vbModeLess 中启动 UserForm 时出现。状态,所以我采用了另一种有效的方式(隐藏对象而不是删除它),但我很想知道为什么 VBA 会这样。
我的理解是,由于 Excel 执行 UserForm1.Show删除 OLEObject 后,它不应该干扰它。此外,这不像我要删除所有对象,而只是删除一个特定的对象。

最佳答案

是的,这是一个未记录的错误(至少我从未找到任何有关它的文档)。话虽如此,您可以通过执行以下操作来实现您想要的。
逻辑

  • Modal 中显示表格
  • UserForm_Activate()事件改回Modeless .

  • 在一个模块中
    Option Explicit

    Sub creteOleo()
    Dim rng As Range

    Set rng = Sheets("mySheet").Range("B2:C3")

    With Sheets("mySheet").OLEObjects.Add(ClassType:="Forms.Label.1", _
    Link:=False, _
    DisplayAsIcon:=False, _
    Left:=rng.Left, _
    Top:=rng.Top, _
    Width:=rng.Width, _
    Height:=rng.Height)

    .Name = "myOleo" 'On lui donne un nom
    .Object.Font.Size = 13
    .Object.Caption = "test"
    End With
    End Sub

    Sub deleteOleo()
    Sheets("mySheet").OLEObjects("myOleo").Delete

    DoEvents

    Dim frm As New UserForm1

    frm.Show
    End Sub
    在用户表单代码
    Option Explicit

    Private Declare Function EnableWindow Lib "user32.dll" (ByVal hWnd As Long, _
    ByVal fEnable As Long) As Long

    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    Private Declare Function GetParent Lib "user32.dll" (ByVal hWnd As Long) As Long

    Private Sub UserForm_Activate()
    EnableWindow GetParent(FindWindow(vbNullString, Me.Caption)), 1
    End Sub
    在行动
    enter image description here

    关于excel - OLEObjects 和 Userform 之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63593062/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com