Condividi tramite

GENERAZIONE E-MAIL AUTOMATICA CON VBA

Anonimo
2017-11-10T13:37:23+00:00

Ciao Norman!

ho compilato la seguente struttura per la generazione automatica di un e-mail (e funziona :D):

Sub Make_Outlook_Mail_With_File_Link()

    Dim OutApp As Object

    Dim OutMail As Object

    Dim strbody As String

    If ActiveWorkbook.Path <> "" Then

        Set OutApp = CreateObject("Outlook.Application")

        Set OutMail = OutApp.CreateItem(0)

        strbody = "<font size=""3"" face=""Calibri"">" & _

                  "Buongiorno,<br><br>" & vbNewLine & vbCrLf & Chr(13) & _

                  Range("AE2").Value & _

                  "<br><br>Cordiali Saluti"

        On Error Resume Next

        With OutMail

            .To = "******@hotmail.it"

            .CC = ""

            .BCC = ""

            .Subject = "AVVISO ASSENZA TECNICO"

            .HTMLBody = strbody

            .Display   'or use .Send

        End With

        On Error GoTo 0

        Set OutMail = Nothing

        Set OutApp = Nothing

    Else

        MsgBox "The ActiveWorkbook does not have a path, Save the file first."

    End If

End Sub

Il testo si auto crea nella colonna "AE" ogni qual volta io compilo delle colonne precedenti, mentre il numero della riga è sempre sequenziale (compilo la riga 3 per esempio, il testo si compilerà nella cella "AE3).

Come faccio a dire alla struttura di non prendere il testo dalla cella "AE2", come è espresso in questa funzione, ma di passare a quella dell'ultima riga compilata della colonna "AE"?

Considera che nella colonna "AE" se non c'è testo è presente il numero zero.

Grazie

Andrea :D

Microsoft 365 e Office | Excel | 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

  1. Anonimo
    2017-11-13T11:26:44+00:00

    Ciao Andrea,

    Ho scaricato il tuo file e vedo suboto il problema!

    Nella colonna AE del foglioSORGENTE & COMPILAZIONE DATI, la tua formula non è quella incata da te, ossia:

    ecco la formula:

       =IF(AA2=2,W2,IF(AA2=1,X2,"VUOTA"))

    ma invece vedo la formula:

           =IF(AA2=2;W2;IF(AA2=1;X2;""))

    A questo priposito vedo la mia risposta precedente nella quale avevo detto:

    Con questa formula il codice dovrebbe restituire l'ultima riga effettiva della colonna AE e il codice dovrebbe funzionare nel modo previsto, Avrei previsto un eventuale problema se la formula fosse stata del genere:  =IF(AA2=2,W2,IF(AA2=1,X2,""))      

     !!!

    Vedo che difatti la tua formula è precisamente quella che avevo previsto come problematico!

    Tu vuoi restituire il contenuto della ultima cella della colonna AE che contenga testo visibile e, pertanto, la mia funzione LastRow non è appropriata poichè questa funzione restituisce l'ultima cella popolata e una cella che contiene una formula - qualunque formula - è sempre popolata!

    Quindi, per risolvere il tuo problema, sostituisci la mia funzione LastRow con la seguente funzione:

    '=========>>

    Public Function LastEffectiveRangeRow(aRng As Range)

        Dim arrIn As Variant

        Dim iRow As Long, i As Long

        arrIn = aRng.Columns(1).Value

        iRow = aRng.Row

        For i = 1 To UBound(arrIn)

            If arrIn(i, 1) = vbNullString Then

                With aRng

                    LastEffectiveRangeRow = i - 1

                End With

                Exit Function

            End If

        Next i

    End Function

    '<<=========

    Inoltre,  nella procedura Make_Outlook_Mail_With_File_Link, sostituisci

             With SH

                    LRow = LastRow(SH, .Columns(sColonnaCorpo))

                    Set RngCorpo = .Columns(sColonnaCorpo).Cells(LRow + 1)

                End With

    con:

                With SH

                    LRow = LastEffectiveRangeRow(.Columns(sColonnaCorpo))

                    Set RngCorpo = .Columns(sColonnaCorpo).Cells(LRow)

                End With

    ===

    Regards,

    Norman

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento

14 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-11-10T15:59:07+00:00

    Perdonami errore mio di compilazione, adesso sto cercando di risolvere un altro problema, genera l'e-mail ma non prende il testo dalla cella di excel

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-11-10T15:48:58+00:00

    scusa, error "91"

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-11-10T15:47:31+00:00

    ahahah mi è piaciuto "Andrea loves spam"...hai ragione!

    la struttura mi va in errore qui:    Set SH = .Sheets(sFoglioEmail)                 

    Dice: "Run time error "9".

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-11-10T15:12:38+00:00

    Ciao Andrea,

      Ciao Norman!

    Questa salutazione avrebbe dovuto essere:

        Ciao a TUTTI!

    GENERAZIONE E-MAIL AUTOMATICA CON VBA

    ho compilato la seguente struttura per la generazione automatica di un e-mail (e funziona :D):

    [...]

    Il testo si auto crea nella colonna "AE" ogni qual volta io compilo delle colonne precedenti, mentre il numero della riga è sempre sequenziale (compilo la riga 3 per esempio, il testo si compilerà nella cella "AE3).

    Come faccio a dire alla struttura di non prendere il testo dalla cella "AE2", come è espresso in questa funzione, ma di passare a quella dell'ultima riga compilata della colonna "AE"?

    Considera che nella colonna "AE" se non c'è testo è presente il numero zero.

    Prova qualcosa del genere:

    '=========>>

    Option Explicit

    '--------->>

    Public Sub Make_Outlook_Mail_With_File_Link()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim RngCorpo As Range

        Dim OutApp As Object

        Dim OutMail As Object

        Dim strbody As String

        Dim LRow As Long

        Const sFoglioEmail As String = "Foglio1"                   '<=== Modifica

        Const sColonnaCorpo As String = "AE"                         '<=== Modifica

        Const sIndirizzoEmail As String = _

              "Andrea_loves_SpamATgmailDOTcom"               '<=== Modifica

        Const sOggetto As String = _

                        "AVVISO ASSENZA TECNICO"                    '<=== Modifica

        Const sMsgSalvaFile As String = _

              "Il file attivo non ha un percorso." _

    & vbNewLine & vbNewLine _

    & "Salva il file e quindi riporova!"                      '<=== Modifica

        Set WB = ActiveWorkbook

        With WB

            If .Path <> "" Then

                Set SH = .Sheets(sFoglioEmail)

                With SH

                    LRow = LastRow(SH, .Columns(sColonnaCorpo))

                    Set RngCorpo = .Columns(sColonnaCorpo).Cells(LRow + 1)

                End With

                Set OutApp = CreateObject("Outlook.Application")

                Set OutMail = OutApp.CreateItem(0)

                strbody = "<font size=""3"" face=""Calibri"">" _

                          & "Buongiorno,<br><br>" _

                          & vbNewLine & vbNewLine _

                          & RngCorpo.Value _

                          & "<br><br>Cordiali Saluti"

                On Error Resume Next

                With OutMail

                    .To = sIndirizzoEmail

                    .CC = ""

                    .BCC = ""

                    .Subject = sOggetto

                    .HTMLBody = strbody

                    .Display   'or use .Send

                End With

                On Error GoTo 0

                Set OutMail = Nothing

                Set OutApp = Nothing

            Else

                Call MsgBox( _

                     Prompt:=sMsgSalvaFile, _

                     Buttons:=vbCritical, _

                     Title:="SALVA FILE!")

            End If

        End With

    End Sub

    '--------->>

    Public Function LastRow(SH As Worksheet, _

                            Optional rng As Range, _

                            Optional minRow As Long = 1, _

                            Optional sPassword As String)

        Dim bProtected As Boolean

        With SH

            If rng Is Nothing Then

                Set rng = .Cells

            End If

            bProtected = .ProtectContents = True

            If bProtected Then

                Application.ScreenUpdating = False

                .Unprotect Password:=sPassword

            End If

        End With

        On Error Resume Next

        LastRow = rng.Find(What:="*", _

                           after:=rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

        If LastRow < minRow Then

            LastRow = minRow

        End If

        If bProtected Then

            SH.Protect Password:=sPassword, _

                       UserInterfaceOnly:=True

        End If

        Application.ScreenUpdating = True

    End Function

    '<<=========

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento