在项目中更改Evey UserForm的StartUpPosition错误:对象不支持属性

时间:2014-11-01 06:25:20

标签: excel vba excel-vba userform

设置: 我有许多带有许多UserForms的项目,当在双监视器系统上打开它们时,默认的StartUpPosition是1 = CenterOwner,它出现在主显示器的右侧(Windows桌面的中心)。我正在尝试编写一小段代码,为项目中的每个用户表单更改一个属性。在这种情况下,具体而言,.StartUpPosition = 2(CenterScreen)

使用Microsoft Office Professional Plus 2010

我已经知道如何在Positions.StartUpPosition下使用VBA中的属性编辑器更改StartUpPosition。问题是在这么多项目中有太多的UserForms,我想一次在每个项目上更改它们。最后,我想使用相同的代码通过使用方法的重载参数(FormName,Property,Value)来改变任何属性。现在,我只有一个可以处理StartUpPosition。

当我运行此代码时,在打开UserForm时,它按预期工作,覆盖默认的StartUpPosition = 1(CenterOwner),它会在屏幕中央显示该表单。

Sub UserForm_Initialize()
    With UserFormName
      .StartUpPosition = 2 'CenterScreen'
    End With
End Sub

但是,当我在这个循环中运行它时,它会从模块循环遍历项目的控件,试图一次更改所有表单的默认值,我得到以下错误。

错误:运行时错误'438': Object不支持此属性或方法。

Sub UserFormStartUp_Center()
    Dim VBComp As Object
    'For each control in project'
    For Each VBComp In Application.VBE.ActiveVBProject.VBComponents
        'Check to see if control is a UserForm'
        If VBComp.Type = 3 Then           '3 = vbext_ct_MSForm'

            'Change Property - StartUpPosition - SAME AS ABOVE'
            With VBComp
                .StartUpPosition = 2 'CenterScreen'
            End With

        End If
    'Loop through controls'
    Next
End Sub

问题:如何将表单的属性设置为默认值,而不仅仅是在运行时的实例中,除了进入每个UserForm并通过向下滚动手动更改它到属性并单击它,然后关闭表单,然后继续到下一个重复。 (是的,我现在已经完成了,但我有很多项目需要更改UserForms,因为我学习新技术,我需要为客户修补其他项目)

我觉得这是关于运行时的一些我不明白的事情。我必须相信您可以以编程方式设置此属性,因为它将其与其他属性一起存储。

研究
MSDN: StartUp Object Property 根据MSDN,只有运行时的对象可以是StartUp对象。

MSDN: StartUpPosition Property

提前感谢您对此提供任何帮助。这将为我节省很多时间点击。

编辑:在阅读答案后添加以下内容:

更新:当我使用您在答案中提到的每个建议运行代码时,我仍然会收到错误消息。运行时错误:' - 2147467259(80004005)'对象'_VBComponent'的方法'属性'失败。

所以我决定尝试一些事情,比如打印Property Item ..的值,名称等的MsgBox。

For Each VBComp In ActiveWorkbook.VBProject.VBComponents
    '~~> Check to see if control is a UserForm'
    If VBComp.Type = 3 Then
        With VBComp
        MsgBox (VBComp.Properties.Item(50).Value)
        End With
    End If
Next

当我这样做时,它很有趣。将出现消息框,其中包含与该项目的“本地”窗口匹配的正确信息。然后,在msgbox之后,它会显示对象错误。如果是错误,那么为什么消息框会正确打印出来?就像UserForm是一个Object,但Property.Item不是。然而,它具有可以定义的参数,例如名称,值等。

包含该属性的Locals信息的屏幕截图,其中Object Type = Nothing

Locals Info

1 个答案:

答案 0 :(得分:6)

每个 UserForm / Control 都有一个可以被.Properties.Item

访问的属性

例如

Sub GetPropertiesDetails()
    Dim VBComp As Object
    Dim i As Long, j As Long

    i = 1

    For Each VBComp In ActiveWorkbook.VBProject.VBComponents
        '~~> Check to see if control is a UserForm'
        If VBComp.Type = 3 Then
            With VBComp
                For j = 1 To .Properties.Count
                    Debug.Print i & ". "; .Properties.Item(j).Name
                    i = i + 1
                Next j
            End With                
            Exit For '<~~ Just want to check for one userform
        End If
    Next
End Sub

当您运行上述代码时,您将在立即窗口

中获得此代码
1. ActiveControl
2. BackColor
3. BorderColor
4. BorderStyle
5. CanPaste
6. CanRedo
7. CanUndo
8. Controls
9. Cycle
10. _Font_Reserved
11. Font
12. ForeColor
13. InsideHeight
14. InsideWidth
15. KeepScrollBarsVisible
16. MouseIcon
17. MousePointer
18. PictureAlignment
19. Picture
20. PictureSizeMode
21. PictureTiling
22. ScrollBars
23. ScrollHeight
24. ScrollLeft
25. ScrollTop
26. ScrollWidth
27. Selected
28. SpecialEffect
29. VerticalScrollBarSide
30. Zoom
31. DesignMode
32. ShowToolbox
33. ShowGridDots
34. SnapToGrid
35. GridX
36. GridY
37. DrawBuffer
38. Name
39. Caption
40. Left
41. Top
42. Width
43. Height
44. Enabled
45. Tag
46. HelpContextID
47. WhatsThisButton
48. WhatsThisHelp
49. RightToLeft
50. StartUpPosition
51. ShowModal

所以从这里我们看到我们所追求的属性是50。现在我们需要做的就是像你那样使用{而不是.StartUpPosition = 2

Sub SetUserformStartUp()
    Dim VBComp As Object

    For Each VBComp In ActiveWorkbook.VBProject.VBComponents
        '~~> Check to see if control is a UserForm'
        If VBComp.Type = 3 Then VBComp.Properties.Item(50).Value = 2
    Next
End Sub

由Chris Neilsen提供(来自评论)

您也可以使用:

VBComp.Properties.Item("StartUpPosition") = 2