Condividi tramite

Gestione errore esecuzione macro da VBA

Anonimo
2016-04-19T09:40:00+00:00

Buongiorno,

documentandomi in giro ho creato una routine che sia attiva automaticamente e che esegue una serie di attivià....

Tra queste esegue anche una macro.

Potrebbe succedere che questa macro vada in errore (es. perchè non c'è connessione e non trova il percorso dove punta) e, di conseguenza, si blocca tutta la routine.

Vorrei gestire questo errore ed ho provato con:

Private Sub Form_Timer()

  On  Error GoTo Gestione

DoCmd.RunMacro "Esporta_dati_in_BE"

exit sub

Gestione:

    MsgBox "HAI SBAGLIATO"

    Exit Sub

End Sub

Purtroppo, però, quando la macro va in errore mi compare la finestra "Macro passo passo" e, finchè non clicco su "termina tutte le macro" non succede niente.

C'è un modo per evitare che si apra la finestra Macro passo passo in modo che vengano eseguite direttamente le istruzioni contenute in "Gestione" ?

Grazie in anticipo del supporto.

Saluti.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-04-20T22:22:08+00:00

ciao Salvatore,

la routine che ti suggerisco cicla la collection tableDefs del currentDB, e le esporta in un db a in cui hai memorizzato il percorso della stringa StrPathDbBE.

nel loop viene controllato se nel db in cui esporti le tabella la tabella oggetto di trasferimento già esiste, se si, la funzione preposta gestisce l'errore e cancella la tabella esistente nel DB di destinazione e per poi esportatla nuovamente.

in questo modo avrai ad ogni esportazione le tabelle più aggiornate.

La cancellazione è la cosa più pratica per come ho inteso il tuo scenario, se vuoi nel caso di tabella esistente si potrebbe pensare a rinominarla.

copia/incolla il seguente codice in un modulo standard,  personalizza il path contenuto nella variabile StrPathDbBE e richiama la sub transferTables:

Option Compare Database

Option Explicit

Private Const StrPathDbBE As String = "C:\Users\sandro\Desktop\belocale.accdb" '<<<<personalizza!

Public Sub transferTables()

On Error GoTo errorHandler

Dim tdf      As dao.TableDef

Dim dbsBE    As dao.Database

Dim dbsCU    As dao.Database

Set dbsCU = CurrentDb

Set dbsBE = OpenDatabase(StrPathDbBE, False, False)

For Each tdf In dbsCU.TableDefs

    If (tdf.Attributes And dbSystemObject) = False Then

            If existsTable(tdf.Name, dbsBE) Then dbsBE.TableDefs.Delete (tdf.Name)

            DoCmd.TransferDatabase TransferType:=acExport, _

                                   DatabaseType:="Microsoft Access", _

                                   DatabaseName:=StrPathDbBE, _

                                   ObjectType:=acTable, _

                                   Source:=tdf.Name, _

                                   Destination:=tdf.Name

    End If

Next

ext_errorLoadAccountHandler:

If Not dbsBE Is Nothing Then dbsBE.Close: Set dbsBE = Nothing

Set dbsCU = Nothing

Set tdf = Nothing

Exit Sub

errorHandler:

    With Err

       MsgBox "ERR#" & .Number _

            & vbNewLine & .Description _

            , vbOKOnly Or vbCritical

     End With

     Resume ext_errorLoadAccountHandler

End Sub

Private Function existsTable(ByVal strTable As String, _

                             ByVal ObjDestDB As dao.Database) As Boolean

On Error GoTo objHandler

Dim tdf  As dao.TableDef

Dim bool As Boolean

bool = True

Set tdf = ObjDestDB.TableDefs(strTable)

exitErrTbl:

    Set tdf = Nothing

    Exit Function

objHandler:

    bool = Not bool

    Resume exitErrTbl

End Function

ciao, Sandro.

***** start Edit *****

solo se importi le tabelle è bene controllare l'esistenza di una tabella con lo stesso nome perché in export le tabelle vengono sovrascritte.

quindi il  codice si  semplifica cos' :

Option Compare Database

Option Explicit

 Private Const StrPathDbBE As String = "C:\Users\sandro\Desktop\belocale.accdb" '<<<<personalizza!

Public Sub transferTables()

On Error GoTo errorHandler

 Dim tdf      As dao.TableDef

 Dim dbsCU    As dao.Database

Set dbsCU = CurrentDb

 For Each tdf In dbsCU.TableDefs

     If (tdf.Attributes And dbSystemObject) = False Then

             DoCmd.TransferDatabase TransferType:=acExport, _

                                    DatabaseType:="Microsoft Access", _

                                    DatabaseName:=StrPathDbBE, _

                                    ObjectType:=acTable, _

                                    Source:=tdf.Name, _

                                    Destination:=tdf.Name

    End If

 Next

ext_errorLoadAccountHandler:

 Set dbsCU = Nothing

 Set tdf = Nothing

 Exit Sub

errorHandler:

     With Err

        MsgBox "ERR#" & .Number _

             & vbNewLine & .Description _

             , vbOKOnly Or vbCritical

      End With

      Resume ext_errorLoadAccountHandler

 End Sub

***** end Edit *****

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-04-20T21:11:16+00:00

Ciao Salvatore,

VBA ti garantisce indubbiamente una maggiore flessibilità. Tuttavia, volendo, puoi gestire l'errore di esecuzione anche all'interno di una macro: nell'esempio che segue ho utilizzato una sottomacro che viene lanciata nel momento in cui la macro principale va in errore:



la seconda riga della macro istruisce la stessa a saltare verso la sottomacro "ArrestaOgniMacro" (il nome è arbitrario) che ha come unica azione quella di arrestare, appunto, ogni altra macro. Questo blocco di codice viene eseguito solo nel caso in cui venga richiamato.

Nell'esempio ho forzato il codice tentando di aprire una maschera che non esiste e successivamente una tabella che esiste. L'effetto, mandando in esecuzione la macro è che viene visualizzata una finestra con un messaggio di errore (l'istruzione di apertura della tabella, essendo successiva all'errore di apertura della form, non viene eseguita in quanto la macro è saltata direttamente verso la sottomacro).

Ripetendo l'esperimento, dopo aver creato la maschera "pippo", si ottiene l'apertura di entrambi gli oggetti (maschera e tabella) senza alcun messaggio di errore.

David

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-04-19T15:29:55+00:00

Scusami, ma la macro è nel formato macro di access...

In ogni caso penso di aver risolto:

nella  seconda riga della macro (la prima serve a disattivare gli avvisi) ho inserito un if Error() e come azione "ArrestaOgniMacro".

Poi il codice in VBA che richiama tale macro l'ho lasciato come sopra e tutto funziona.

Grazie mille per l'idea!!!!

Ciao.

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-04-19T10:22:50+00:00

Domanda sciocca la mia: ma perchè non intercetti l'eccezione(errore) nella macro che richiami?

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-04-19T13:28:50+00:00

    La domanda è sicuramente corretta.

    La risposta, però, è abbastanza sciocca: percè non so come fare... :-(

    La risposta è stata utile?

    0 commenti Nessun commento