2014-11-01 7 views
5

Setup: Ho molti progetti con molti form, e quando si apre questi su un sistema a doppio monitor, lo StartupPosition default è 1 = CenterOwner e viene visualizzato a destra del display principale (il centro del desktop di Windows). Sto cercando di scrivere una piccola porzione di codice che modifichi una proprietà per ogni modulo utente nel progetto. In questo caso, in particolare, .StartUpPosition = 2 (CenterScreen)Cambio StartupPosition di Evey form In Project ERRORE: L'oggetto non supporta proprietà

Utilizzo di Microsoft Office Professional Plus 2010

so già come cambiare lo StartupPosition usando l'editor delle proprietà in VBA, sotto Positions.StartUpPosition. Il problema è che ci sono così tanti UserForm su tanti progetti, voglio cambiarli tutti su ogni progetto contemporaneamente. In definitiva, voglio utilizzare lo stesso codice per modificare qualsiasi proprietà utilizzando gli argomenti overload del metodo (NomeFormato, Proprietà, Valore). Per ora, sto bene con uno solo per gestire StartUpPosition.

Quando si esegue questo codice, all'apertura del Form utente, funziona come previsto, sostituendo il valore predefinito di StartUpPosition = 1 (CenterOwner) e visualizza il modulo al centro dello schermo.

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

Tuttavia, quando l'eseguo incorporato in questo ciclo che cicli attraverso i controlli del progetto da un modulo, nel tentativo di cambiare le impostazioni predefinite di tutte le forme in una sola volta, ottengo il seguente errore.

Errore: Errore di run-time '438': L'oggetto non supporta questa proprietà o questo metodo.

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 

Domanda: Come posso impostare la proprietà per il modulo da memorizzare come predefinito, non solo in un caso a run-time, oltre ad andare in ogni form e cambiare manualmente scorrendo verso il basso per la proprietà e facendo clic su di esso, quindi chiudendo il modulo e passando al successivo per ripetere. (Sì, a questo punto sarei pronto, ma ho molti progetti che richiedono modifiche ai UserForm man mano che apprendo nuove tecniche, ho bisogno di applicare patch ad altri progetti per i client)

Ho la sensazione che sia qualcosa sul tempo di esecuzione che non capisco. Devo credere che è possibile impostare questa proprietà a livello di codice poiché lo memorizza con altre proprietà.

Research:
MSDN: StartUp Object Property Secondo MSDN, oggetti solo in fase di esecuzione può essere oggetti di avvio.

MSDN: StartUpPosition Property

Grazie in anticipo per qualsiasi aiuto su questo. Questo mi farà risparmiare molte ore di clic.

EDIT: aggiungendo quanto segue, dopo le risposte di lettura:

UPDATE: Quando eseguo il codice con ciascuno dei suggerimenti che hai menzionato nella risposta, sto ancora ricevendo un errore. Errore di run-time: '-2147467259 (80004005)' Metodo 'Proprietà' dell'oggetto '_VBComponent' non riuscito.

così ho deciso di provare un paio di cose, come la stampa di un MsgBox della Proprietà Item .. valore, nome, ecc

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 

Quando faccio questo, è interessante. Viene visualizzata la finestra di messaggio, con le informazioni corrette che corrispondono alla finestra dei locali per quell'elemento .. POI, DOPO il menu msg, viene visualizzato un errore dell'oggetto. Se si tratta di un errore, allora perché la finestra di messaggio viene stampata correttamente? È come se il Form utente è un Oggetto, ma il Property.Item non è. Eppure, vi sono parametri, che possono essere definiti come il nome, il valore, ecc

Schermata incluso degli abitanti del luogo informazioni che la proprietà dell'oggetto in cui il tipo di oggetto = Nothing

Locals Info

+0

Siete quasi sulla strada giusta. Lasciami postare una risposta :) –

risposta

6

Ogni form/Controllo ha una proprietà che può essere letta da esso è .Properties.Item

Per esempio

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 

Quando si esegue il codice di cui sopra si ottiene questo nella finestra immediata

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 

Quindi da questo si vede che la proprietà che ci sono dopo è a 50. Ora tutto ciò che dobbiamo fare è usare quello invece di .StartUpPosition = 2 come hai fatto tu.

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 

Per gentile concessione di Chris Neilsen (Dai commenti)

È inoltre possibile utilizzare:

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

+1 per essere il Top Gun - ottima risposta. – barryleajo

+3

O meglio ancora 'VBComp.Properties.Item (" StartUpPosition ") = 2' –

+2

@chrisneilsen: l'ho aggiunto al mio post. I commenti sono temporanei e non voglio che queste preziose informazioni si perdano in futuro :) –

Problemi correlati