Vba 隐藏帧时无法设置可见属性错误

Vba 隐藏帧时无法设置可见属性错误,vba,excel,runtime-error,Vba,Excel,Runtime Error,我在Excel2007VBA中遇到一个问题,我试图在UserForm中的框架上将visible属性设置为false Userform1.Frame1.Visible = False 尝试设置属性时,excel会抛出错误: 运行时错误“-2147418113(8000ffff)”: 无法设置Visible属性。对方法或属性访问的意外调用 我对此进行了研究,我发现的唯一一件事是,这可能与没有控制焦点有关。在我的例子中,这是不正确的,因为有一个按钮可以将焦点放在另一帧上。另一帧设置为在隐藏Frame

我在Excel2007VBA中遇到一个问题,我试图在UserForm中的框架上将visible属性设置为false

Userform1.Frame1.Visible = False
尝试设置属性时,excel会抛出错误:

运行时错误“-2147418113(8000ffff)”:

无法设置Visible属性。对方法或属性访问的意外调用

我对此进行了研究,我发现的唯一一件事是,这可能与没有控制焦点有关。在我的例子中,这是不正确的,因为有一个按钮可以将焦点放在另一帧上。另一帧设置为在隐藏
Frame1
之前可见

是否有其他人遇到过此问题,或者可以帮助我了解导致此错误的原因

编辑-添加代码

Public Sub fOpenFrame(uf As UserForm, strName As String)

Dim con As Control
Dim i As Long

i = 5

Application.ScreenUpdating = False

With uf.Controls(strName)
    .Top = 38.15
    .Left = 120
    .Height = 400
    .Width = 565
    .Visible = True
End With

For Each con In uf.Controls
    If TypeName(con) = "Frame" And con.Name <> strName And InStr(con.Name, "Menu") < 1 _
    And con.Name <> "frmNewAbsenceButton" And con.Name <> "frmExistingAbsenceButton" Then
        With con
            .Visible = False 'Error occurs here'
            .Top = 5
            .Left = i
            .Height = 20
            .Width = 20
        End With
        i = i + 25
    End If
Next con

Application.ScreenUpdating = True

End Sub
Public Sub-fOpenFrame(uf作为用户表单,strName作为字符串)
Dim con作为控制
我想我会坚持多久
i=5
Application.ScreenUpdating=False
使用uf.控件(strName)
.Top=38.15
.左=120
.高度=400
.宽度=565
.Visible=True
以
对于uf.控件中的每个con
如果TypeName(con)=“Frame”和con.Name strName和InStr(con.Name,“Menu”)<1_
和con.Name“frmnewbsencebutton”和con.Name“frmexistingbsencebutton”,然后
带着骗局
.Visible=False“此处发生错误”
.Top=5
.左=i
.高度=20
.宽度=20
以
i=i+25
如果结束
下一个骗局
Application.ScreenUpdating=True
端接头
编辑2-添加图片

这是第一帧
Frame1
。弹出一个msgbox,当用户单击yes时,它将打开
Frame2

这是
Frame2
。此框架打开时,所有文本框/组合框均已禁用。按钮控件“编辑”已启用。

我宁愿先让所有的框架都不可见(而不在乎它们的位置和大小);之后,只能看到相关的框架。 如果sub在userform的宏模块中,您可以使用Me(“Frame4”)并避免使用参数:“ufas userform”

Public Sub fOpenFrame(uf As UserForm, strName As String)
 for each it in uf.controls
  if typename(it)="Frame" then it.visible=false
 next

 With uf.Controls(strName)
  .Top = 38.15
  .Left = 120
  .Height = 400
  .Width = 565
  .Visible = True
 End With
End Sub

我在Excel2010中进行了测试,代码运行良好(我没有Excel2007)

请尝试下面的代码

Private Sub Frame1_Click()

End Sub

Private Sub TextBox1_Change()

End Sub

 Private Sub UserForm_Initialize()

    Me.Frame1.Visible = False
End Sub

请在将窗体设置为不可见之前添加前两行代码,好吗?您可能必须手动将焦点设置到另一个对象上,因为当对象当前具有焦点时,无法将其可见性设置为False。@我已添加了在出错行之前触发的过程。从本质上讲,这个过程循环通过相关的框架,并将false的可见性设置为false,而不是要打开的fame。ThanksTry创建了一个“伪装”控件,甚至可以是一个按钮,它除了改变焦点之外什么都不做。然后在设置
con.Visible=False
之前,将焦点设置在新创建的控件上。这可能是一种变通方法。不过,这个错误有点奇怪,您是否尝试过删除错误恢复下一步的
,看看实际错误在哪里?@PaulFrancis感谢您的建议。关于错误,请继续下一步
,这只是一个占位符,这样我就可以继续解决问题了。删除它会产生完全相同的错误。我刚刚尝试添加一个空白按钮并将焦点设置为它,但仍然抛出错误!当您调用
fOpenFrame
方法时?谢谢您的建议,但切换过程并没有什么区别。关于过程本身,它不在UserForms代码模块中。那么如果你将它放在userform的代码模块中会怎么样?很难相信你有几个框架,尺寸为。Top=5。Height=20。Width=20,放在同一行的位置5,30,55,80105,等等。它与您发布的图片不匹配。这是因为它们的可见性根据发布的过程设置为隐藏,因此在运行时,框架不可见。您是否考虑过使用多页控件而不是使用框架和“可见”?您只需将不同的控件放在不同的页面上,将页面样式设置为不显示选项卡标题,然后您的控件按钮只需更改活动页面,无需将任何内容设置为可见或其他。这是我在创建向导时经常使用的一种技术。这不是一个答案,因为它是一个彻底改变你所要求的,所以只需要考虑的事情。但一旦完成,这是一项非常有用的技术。这并不能真正回答问题,它只是使用OP已经尝试过的相同方法(即控制
。可见
)。