2014-11-01 43 views
5

設置: 我有很多項目,很多用戶窗體,和雙顯示器系統上打開這些時,默認StartUpPosition爲1 = CenterOwner它會出現在主顯示屏的右側(Windows桌面的中心)。我正在嘗試編寫一小段代碼來更改項目中每個用戶窗體的一個屬性。在這種情況下,具體而言,.StartUpPosition = 2(中心屏幕)變化StartUpPosition在項目錯誤:對象不支持物業

使用Microsoft Office Professional Plus 2010的

我已經知道如何使用VBA的屬性編輯器,Positions.StartUpPosition下改變StartUpPosition。問題是這麼多的項目中有這麼多的用戶窗體,我想一次性在每個項目上更改它們。最終,我想通過使用方法的重載參數(FormName,Property,Value)來使用相同的代碼來更改任何屬性。現在,我只需要一個人來處理StartUpPosition即可。

當我運行此代碼時,打開用戶窗體時,它按預期工作,覆蓋StartUpPosition = 1(CenterOwner)的默認值,並在屏幕中心顯示窗體。

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

然而,當我運行它嵌入在這個循環中循環通過從模塊項目的控制,試圖改變一切形式的違約一次,我碰到下面的錯誤。

錯誤:運行時錯誤'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 

問:我怎樣才能設置該屬性的形式被存儲爲默認值,而不僅僅是在運行時的情況下,除了進入每個用戶窗體,並通過向下滾動到手動更改該屬性並點擊它,然後關閉表單並轉到下一個重複。 (是的,我現在已經完成了,但是當我學習新技術時,我有很多項目需要更改用戶窗體,我需要爲客戶端修補其他項目)

我有這種感覺關於我不明白的運行時間。我必須相信,你可以通過程序設置這個屬性,因爲它將它與其他屬性一起存儲。

研究:
MSDN: StartUp Object Property 根據MSDN,在運行時纔對象可以啓動對象。

MSDN: StartUpPosition Property

預先感謝您有這方面的幫助。這將節省我許多小時的點擊。

編輯:添加以下內容,閱讀後回答:

UPDATE:當我運行與你們每個人在答覆中提到的建議的代碼,我仍然得到一個錯誤。運行時錯誤:'-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 

當我做到這一點,這很有趣。出現消息框,其正確的信息與該項目的本地窗口匹配。然後,在msgbox之後,它給出對象錯誤。如果這是一個錯誤,那麼爲什麼消息框會正確輸出?就好像UserForm是一個對象,但Property.Item不是。然而,它具有可如名稱,值等包含在該屬性項目,其中對象類型=無

Locals Info

+0

你幾乎在正確的軌道上。讓我發表一個答案:) – 2014-11-01 13:10:56

回答

6

用戶窗體/控制的當地人信息的

截圖中可以定義的參數具有可接受它的.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 

禮貌(從評論)

您還可以使用:

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

作爲頂級槍+1 - 很好的答案。 – barryleajo 2014-11-01 13:20:26

+3

或更好的'VBComp.Properties.Item(「StartUpPosition」)= 2' – 2014-11-01 19:19:35

+2

@chrisneilsen:我已經添加到我的文章。評論是暫時的,我不希望這個有價值的信息在未來迷失:) – 2014-11-01 21:13:02

相關問題