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
Siete quasi sulla strada giusta. Lasciami postare una risposta :) –