2014-07-10 152 views
1

我正在嘗試調整用戶窗體和其VBA的控件以適應不同大小的監視器。以下是我使用的代碼,基於Ron DeBruin的代碼(http://www.rondebruin.nl/mac/mac022.htm)。使用VBA調整用戶窗體及其控件使用VBA

本質上,該代碼旨在縮放用戶窗體的大小和位置及其所有控件。

的問題是我在執行

得到一個錯誤(如下圖所示)
"Run-time error '-2147467259(80004005)': Method 'Properties' of object '_VBComponent' failed" 

我試着用.Top更換.Properties("Top"),我得到了Object doesn't support this property or method錯誤。

DeBruin先生的代碼使自;但我不知道爲什麼它不起作用。任何幫助肯定會被讚賞。

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 
+1

您是否允許通過信任中心訪問VBA項目對象模型?這是與對象模型一起工作所必需的。 – Gareth

+0

是的,它已啓用。雖然我試圖讓DeBruin先生的代碼正常工作,但最終我希望能夠遍歷工作簿中的所有用戶表單,以便將它們全部縮放。一些影響:對於工作簿中的每個AppUserform .... – BillD

+0

我不確定在哪種情況下的問題,但會警告需要在每臺用戶表單上的計算機上手動啓用對VBA項目對象模型的訪問將被使用。 – Gareth

回答

0

根據您最後的評論,下面是一些示例代碼,演示如何在運行時更改屬性,而無需訪問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 
+0

感謝您的編碼幫助。它效果很好。我感謝你抽出時間。 (我很抱歉這麼長時間回覆;家人死亡。) – BillD