pee*_*ege 5 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
Run Code Online (Sandbox Code Playgroud)
但是,当我在这个循环中运行它时,它从模块循环遍历项目的控件,试图一次更改所有表单的默认值,我得到以下错误.
错误: 运行时错误"438":对象不支持此属性或方法.
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
Run Code Online (Sandbox Code Playgroud)
问题:如何将表单的属性设置为默认存储,而不仅仅是在运行时的实例中,除了进入每个UserForm并通过向下滚动到属性并单击它然后手动更改它,然后关闭表格然后继续下一个重复.(是的,我现在已经完成了,但是我有很多项目需要更改UserForms,因为我学习新技术,我需要为客户修补其他项目)
我觉得这是关于运行时的一些我不明白的事情.我必须相信您可以以编程方式设置此属性,因为它将其与其他属性一起存储.
研究:
MSDN:StartUp对象属性
根据MSDN,只有运行时的对象可以是StartUp对象.
提前感谢您对此的任何帮助.这将节省我很多小时的点击.
编辑: 阅读答案后添加以下内容:
更新:当我使用你在答案中提到的每个建议运行代码时,我仍然收到错误.运行时错误:' - 2147467259(80004005)'对象'_VBComponent'的方法'属性'失败.
所以我决定尝试一些东西,比如打印属性项的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
Run Code Online (Sandbox Code Playgroud)
当我这样做时,它很有趣.将出现消息框,其中包含与该项目的"本地"窗口匹配的正确信息.然后,在msgbox之后,它会显示对象错误.如果是错误,那么为什么消息框会正确打印出来?就像UserForm是一个Object,但Property.Item不是.然而,它具有可以定义的参数,例如名称,值等.
屏幕截图包含该属性的Locals信息Item,其中Object Type = Nothing

每个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
Run Code Online (Sandbox Code Playgroud)
当您运行上面的代码时,您将在立即窗口中获得此代码
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
Run Code Online (Sandbox Code Playgroud)
因此,我们从中看到我们所追求的财产是在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
Run Code Online (Sandbox Code Playgroud)
感谢Chris Neilsen(来自评论)
您还可以使用:
VBComp.Properties.Item("StartUpPosition") = 2
Run Code Online (Sandbox Code Playgroud)