2013-06-04 13 views
9

Gli errori all'interno di userform VBA, al di fuori di quelli che si verificano nell'evento di inizializzazione, non sembrano essere bolliti fino al metodo di chiamata. C'è un modo per forzare l'errore a gonfiarsi?Come passare l'errore in VBA userform al metodo di chiamata

userforms

VBA contengono un evento denominato userform_error che è definito come

Private Sub UserForm_Error(
    ByVal Number As Integer, 
    ByVal Description As MSForms.ReturnString, 
    ByVal SCode As Long, 
    ByVal Source As String, 
    ByVal HelpFile As String, 
    ByVal HelpContext As Long, 
    ByVal CancelDisplay As MSForms.ReturnBoolean 
) 

Sembra logico che l'UserForm_Error evento viene chiamato quando si verifica un errore in un form utente, ma che non sembra essere il caso . In effetti, non riesco a trovare alcuna documentazione per Userform_Error.

Ho cercato MSDN, Bing, Google, StackOverflow, DuckDuckGo, e non sono stato in grado di trovare un buon metodo o alcuna documentazione su cosa UserForm_error effettivamente fa.

+1

Excel VBA? Accedi a VBA? Puoi dare un esempio con il codice, di cosa stai cercando di fare? – shahkalpesh

+0

Questa non è un'applicazione di Microsoft Office. – lfrandom

+0

Sto provando a creare una macro con un userform. Gli eventi nel modulo utente potrebbero avere un errore. Mi piacerebbe che l'errore segnalato al modulo principale invece di dover costruire in un gestore di errori in ogni evento nel modulo. – lfrandom

risposta

1

È possibile intercettare gli errori nel codice UserForm (che è una classe), quindi nel codice di intercettazione errori passare i dettagli di errore al codice principale chiamando una procedura in un modulo.

In alternativa, è possibile dichiarare la variabile UserForm WithEvents nel relativo codice di chiamata e generare il proprio evento di errore in caso di errore.

+0

Ho paura che non sia possibile dichiarare Variabile UserForm ConEventi nel modulo standard, non verrà compilata: Errore di compilazione: valido solo nel modulo oggetto. – dee

+0

Scusa, presumevo che lo stessi chiamando da un altro modulo, che è un modulo di classe. Dovresti andare con la prima opzione, allora. –

2

Quindi, ho esaminato questo perché ho avuto lo stesso problema. Super strano per l'evento di errore ma sono riuscito a trovare alcune informazioni a riguardo. Se si cerca Evento di errore nella Guida per gli sviluppatori nell'IDE, ma non il contenuto offline il contenuto online. Questo è quello che dicono: "Si verifica quando un controllo rileva un errore e non può restituire le informazioni di errore a un programma chiamante ... L'evento di errore viene avviato quando si verifica un errore che l'applicazione non è in grado di gestire." Questo mi porta a credere che questo evento venga sollevato solo in presenza di un errore catastrofico. Quindi sembra che tu possa essere sfortunato a usarlo.

Non c'è modo a ribollire l'errore a causa del codice non-base enter image description here

mio modo per aggirare questo è stato per ogni Userform per avere il suo meccanismo di gestione proprio errore, sorta di fastidioso, ma questo è il meglio che potevo fare. Oltre a questo, in un po 'di luce e intendo molto leggero e non ho avuto/limitata l'interazione con il sistema sono stato in grado di fare un errore Riprendi Avanti all'inizio del codice e una volta scaricato l'userform controllato If Err.Number>0 Then Err.Raise Err.Number quindi l'errore gestore lo cattura. Tuttavia, come probabilmente saprai, se scegli la seconda opzione, procedi con cautela.

Spero che questo aiuti. Fammi sapere cosa decidi.

5

È difficile fornire informazioni precise per questo, il componente è antico. Solo un po 'di storia.

L'oggetto UserForm è implementato da Microsoft Forms 2.0, una libreria di componenti ActiveX. Era una libreria generica per aggiungere moduli a qualsiasi applicazione, non era solo limitata alle app di Office. Puoi ritrovarlo sul tuo computer in c: \ windows \ syswow64 \ fm20.dll (system32 per un computer a 32 bit). La documentazione per questo componente veniva fornita da fm20.chm. Questo file della guida non è più disponibile da Microsoft, puoi ancora ritrovarlo con una query di google. Tuttavia, la maggior parte dei siti che offrono lo sguardo sono molto ombreggiato. This one sembrava meno viscido. In realtà la visualizzazione di questo file è piuttosto fastidiosa, posso sfogliare la tabella dei contenuti ma nessuna delle pagine mostra più testo.

Una soluzione che ho trovato era quella di decompilare il file con l'utilità HTML Workshop. Che ha prodotto un file denominato f3evtError.htm, sembra che questo (a cura per i contenuti):


evento di errore

si verifica quando un controllo rileva un errore e non può restituire le informazioni sull'errore a un programma chiamante.

Sintassi

Private Sub object_Error(ByVal Number As Integer, ByVal Description As MSForms.ReturnString, _ 
    ByVal SCode As SCode, ByVal Source As String, ByVal HelpFile As String, _ 
    ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean) 

La sintassi evento di errore ha queste parti:

  • oggetto: richiesta. Un nome di oggetto valido.
  • indice: obbligatorio. L'indice della pagina in una pagina multipla associata a questo evento.
  • Numero: obbligatorio. Specifica un valore univoco che il controllo utilizza per identificare l'errore.
  • Descrizione: obbligatorio. Una descrizione testuale dell'errore.
  • SCode: obbligatorio. Specifica il codice di stato OLE per l'errore. I 16 bit di basso ordine specificano un valore identico all'argomento Numero.
  • Origine: obbligatorio. La stringa che identifica il controllo che ha avviato l'evento.
  • HelpFile: obbligatorio. Specifica un nome di percorso completo per il file della Guida che descrive l'errore.
  • HelpContext: obbligatorio. Specifica l'ID contesto dell'argomento del file della Guida che contiene una descrizione dell'errore.
  • CancelDisplay: obbligatorio. Specifica se visualizzare la stringa di errore in una finestra di messaggio.

Osservazioni

Il codice scritto per l'evento di errore determina come il controllo risponde alla condizione di errore.

La capacità di gestire le condizioni di errore varia da un'applicazione all'altra. L'evento di errore viene avviato quando si verifica un errore che l'applicazione non è in grado di gestire.


Questo è tutto quello che c'è, sfortunatamente. È vago perché il componente può essere utilizzato in così tanti diversi tipi di host ActiveX e il trapping degli errori è un dettaglio di implementazione dell'host. Penso che l'ultimo paragrafo sia quello che stai veramente chiedendo. Direi che è abbastanza sicuro presumere che, dal momento che la documentazione di Office non lo menziona, le app di Office, di fatto, non attivano questo evento. Il fatto che l'evento sia ancora visibile nell'editor VBA è solo un effetto collaterale di come funziona il modello di oggetti. Non esiste un modo semplice per l'editor di filtrare, visualizza semplicemente tutti gli eventi degli eventi pubblicati dell'oggetto.

Problemi correlati