使用VBA调整用户窗体及其控件的大小

我正在尝试调整VBA的用户窗体和其控件,以适应不同大小的监视器。 以下是我使用的代码,基于Ron DeBruin的代码( http://www.rondebruin.nl/mac/mac022.htm )。

本质上,代码旨在将用户窗体的大小和位置与其所有控件一起缩放。

问题是我得到一个错误(如下所示)在执行

"Run-time error '-2147467259(80004005)': Method 'Properties' of object '_VBComponent' failed" 

我试图用.Topreplace.Properties("Top") ,我得到的Object doesn't support this property or method错误。

德布林先生的代码使自那以来; 但是我为什么不工作而不知所措。 任何帮助肯定会感激。

 Sub ChangeUserFormAndControlsSize() Dim AppUserform As Object Dim FormControl As Object Dim NameUserform As String Dim SizeCoefficient As Single SizeCoefficient = wsControls.Range("SizeCoefficient") NameUserform = "form_APScheduler" Set AppUserform = ThisWorkbook.VBProject.VBComponents(NameUserform) With AppUserform .Properties("Top") = .Properties("Top") * SizeCoefficient '*** ERROR OCCURS HERE .Properties("Left") = .Properties("Left") * SizeCoefficient .Properties("Height") = .Properties("Height") * SizeCoefficient .Properties("Width") = .Properties("Width") * SizeCoefficient End With For Each FormControl In AppUserform.Designer.Controls With FormControl .Top = .Top * SizeCoefficient .Left = .Left * SizeCoefficient .Width = .Width * SizeCoefficient .Height = .Height * SizeCoefficient On Error Resume Next .Font.Size = .Font.Size * SizeCoefficient On Error GoTo 0 End With Next FormControl End Sub 

根据您最后的评论,下面是一些示例代码,演示如何在运行时更改属性,而不访问VBIDE.VBProject对象。 当然,这些变化不会持续下去。

 Option Explicit Sub testForm() Dim UF As form_APScheduler Dim FormControl As MSForms.Control Dim SizeCoefficient As Double SizeCoefficient = inputNumber("Scale Factor: ", "Form", 1) Set UF = New form_APScheduler With UF .Top = .Top * SizeCoefficient .Left = .Left * SizeCoefficient .Width = .Width * SizeCoefficient .Height = .Height * SizeCoefficient End With For Each FormControl In UF.Controls With FormControl .Top = .Top * SizeCoefficient .Left = .Left * SizeCoefficient .Width = .Width * SizeCoefficient .Height = .Height * SizeCoefficient On Error Resume Next .Font.Size = .Font.Size * SizeCoefficient On Error GoTo 0 End With Next FormControl UF.Show Unload UF End Sub Function inputNumber(prompt As String, title As String, defValue As Variant) As Variant inputNumber = Application.InputBox(prompt, title, defValue, , , , , 1) End Function