Access 2010 - Invio Mail VBA

Anonimo
2017-03-17T13:07:11+00:00

Buongiorno, chi può aiutarmi ?

Ho una routine che invia mail aprendo Outlook. Vorrei si fermasse con un messaggio nel caso l'utente, all'apertura della finestra di Outlook, anziché scegliere l'account annullasse l'apertura di Outlook.

Questa è la routine:

Private Sub Comando72_Click()

Dim MyDB As DAO.Database

Dim MyRS As DAO.Recordset

Dim objOutlook As Outlook.Application

Dim objOutlookMsg As Outlook.MailItem

Dim objAccount As Outlook.Account

Dim ConteggioRecord As Long

Dim mAIL As String

Dim Spedizioniere As String

Dim Funzionario As String

Dim TipoDAU As String

Dim DataDAU As String

Dim Cin As String

Dim DAU As String

Dim Terminal As String

Dim DataAssegnazione As String

Dim olApp As Object

Dim cli As String

Dim inte As String

Set MyDB = CurrentDb

Set MyRS = MyDB.OpenRecordset("Q_esiti_spedizioniere_per mail", dbOpenDynaset, dbInconsistent)

' va avanti in caso di errore

On Error Resume Next

'se outlook non è aperto lo apre

If Err Then

Set olApp = CreateObject("Outlook.Application")

End If

' Crea la sessione di Outlook

Set objOutlook = CreateObject("Outlook.Application")

' Conteggio record presenti nella query

ConteggioRecord = MyRS.RecordCount

' Se nessun record crea messaggio apposito

If ConteggioRecord = 0 Then

MsgBox "Nessuna assegnazione effettuata", vbInformation

' Altrimenti inizia loop

Else

MyRS.MoveLast

MyRS.MoveFirst

Do Until MyRS.EOF

ConteggioRecord = ConteggioRecord + 1

' Crea il messaggio e-mail

Set objOutlookMsg = objOutlook.CreateItem(olMailItem)

' Imposta indirizzo destinatario

mAIL = Nz(MyRS![mAIL])

' Imposta Spedizioniere

Spedizioniere = Nz(MyRS![Spedizioniere])

' Imposta Tipo DAU

TipoDAU = Nz(MyRS![Tipo DAU])

' Imposta DAU

DAU = Nz(MyRS![DAU])

' Imposta Cin

Cin = Nz(MyRS![Cin])

' Imposta data DAU

DataDAU = Nz(MyRS![Data DAU])

' Imposta il nome Funzionario

Funzionario = Nz(MyRS![Nominativo])

' Imposta data Assegnazione

DataAssegnazione = Nz(MyRS![Data Assegnazione])

' Imposta il nome Terminal

Terminal = Nz(MyRS![Terminal])

' Compila il messaggio email

With objOutlookMsg

.BodyFormat = olFormatPlain

.To = mAIL

.Subject = "Controlli"

.Body = "Gentile utente," & vbCrLf & _

vbCrLf & _

"Si segnala che la D.A.U. Registro " & TipoDAU & " Num. " & DAU & " / " & Cin & " del " & DataDAU & " è stata prescelta dal sistema di controllo." & vbCrLf & "La invitiamo dunque a presentarsi presso l'Ufficio Controlli per la verifica fisica che sarà effettuata il " & DataAssegnazione & " da " & Funzionario & " presso " & Terminal & " " & vbCrLf & _

vbCrLf & _"

.Send

End With

' Modifica campo "messaggio inviato"

MyRS.Edit

MyRS![Messaggio] = True

MyRS.Update

' Passa al record successivo

MyRS.MoveNext

Loop

' Messaggio di conferma

ConteggioRecord = ConteggioRecord - 1

MsgBox "Inviati correttamente " & ConteggioRecord & " messaggi."

End If

'Chiude query e database

MyRS.Close

MyDB.Close

MsgBox "procedura invio mail terminata", vbInformation

    Set objOutlookMsg = Nothing

    Set objOutlook = Nothing

End Sub

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

12 risposte

Ordina per: Più utili
  1. Anonimo
    2017-03-23T10:27:29+00:00

    ciao Grifone62,

    [...]

    Credo che la variabile resti valorizzata su False e quindi fermi la routine. E' possibile ?

    [...]

    imposta un loop da cui non esci finche non clicchi su ok.

     sostituisci questa istruzione :

    If Not newOlIstance Then Exit Sub

    così :

       Do

       Loop Until newOlIstance

    e commenta il messaggio di errore

    With Err

            If .Number <> 0 Then

                'MsgBox "ERR#" & .Number _

                '     & vbNewLine & .Description _

                '    , vbOKOnly Or vbCritical

                    cleanOLinstance

                newOlIstance = False

            Else

                newOlIstance = True

            End If

        End With

    impostando un apice prima delle istruzioni che lo mostrano a video.

    A fine routine invoca la distruzione della variabile oggetto myDB :

        Set objOutlookMsg = Nothing

        Set objOutlook = Nothing

        Set myDb=nothing

    Occhio al recordCount.

    Facci sapere.

    Ciao, Sandro

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2017-03-20T08:58:33+00:00

    Nel ringraziarti per la risposta volevo dire che la mia routine funziona. Il mio problema è fermare il processo se l'utente clicca su annulla quando si apre questa finestra.

    ps. si

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-03-17T17:58:16+00:00

    ciao Grifone62,

    non è proprio correttissimo quanto dici nel senso che non apri Outlook con quel codice, ma apri un'istanza.

    il codice andrebbe rivisto in lateBinding una volta a regime, in modo da svincolarsi da riferimenti specifici, l'early binding va bene solo in fase di sviluppo.

    Prova a sostituire questa parte di codice che mi convince poco :

    va avanti in caso di errore

    On Error Resume Next

    'se outlook non è aperto lo apre

    If Err Then

    Set olApp = CreateObject("Outlook.Application")

    End If

    ' Crea la sessione di Outlook

    Set objOutlook = CreateObject("Outlook.Application")

    in questo modo :

     On Error Resume Next

           Set olApp = GetObject(, "Outlook.Application")

           If Err = 429 Then

                Set olApp = CreateObject("Outlook.Application")

           End If

     On Error GoTo 0

    e vedi se va meglio....

    Non ho testato, ma dovresti generare le emails senza che sia necessario "lanciare" Outlook, ma le gestisci con l'istanza.

    Facci sapere.

    Ciao, Sandro

    ps. per mia curiosità personale è una routine per segnalare via emails circa le visite in dogana della merce?

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-03-17T14:34:10+00:00

    mi spiego meglio:

    questi comandi


    ' va avanti in caso di errore

    On Error Resume Next

    'se outlook non è aperto lo apre

    If Err Then

    Set olApp = CreateObject("Outlook.Application")

    End If

    ' Crea la sessione di Outlook

    Set objOutlook = CreateObject("Outlook.Application")


    lanciano ,se chiuso, Outlook e  avendo più account di posta si apre la finestra in cui puoi scegliere l'account (mittente).

    Il problema è che se l'utente anziché scegliere chiude Outlook cliccando su annulla, la routine prosegue, non invia mail ma flegga il record come inviata. Vorrei inserire un controllo che stoppasse la routine nel caso l'utente esca da Outlook.

    Grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2017-03-17T13:49:08+00:00

    ciao Grifone62,

    ti consiglio di indentare il codice che scrivi, diventa più leggibile e  comprensibile.

    Detto questo, la tua routine non permette di scegliere alcun account spiega meglio cosa vuoi fare con :

    [...]

    . Vorrei si fermasse con un messaggio nel caso l'utente, all'apertura della finestra di Outlook, anziché scegliere l'account annullasse l'apertura di Outlook.

    [...]

    :-))

     Attendiamo news.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento