Condividi:        

Rispondere a delle mail tramite VBA di Excell

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Rispondere a delle mail tramite VBA di Excell

Postdi fulviot » 09/06/16 16:41

Ciao a todos,

scrivo a voi perché già in passato mi avete aiutato e adesso ho un nuovo problema.

Io vorrei fare un tool VBA in excell che mandi una risposta a delle mail prese da outlook.

su internet ho trovato una funzione che mi permette di risponde solamente alle mail che sono selezionate in outlook.

quello che invece vorrei fare io è:
- lancio la funzione di excell
- questa si posiziona su outlook
- si posiziona in una determinata cartella di posta Es. Inbox\pippo\pluto
- per tutte le mail presenti in questa cartella mandare una risposta.
- eventuali condizioni di filtraggio delle mail per il momento non sono importanti

avete qualche suggerimento in merito?

Vi anticipo che le soluzioni proposte su MSDN non mi funzionano.

Grazie 1000
fulviot
Utente Junior
 
Post: 33
Iscritto il: 12/04/16 09:21

Sponsor
 

Re: Rispondere a delle mail tramite VBA di Excell

Postdi fulviot » 10/06/16 11:47

Ciao, ho trovato la soluzione da solo, ve la posto nel caso vi serva.

Sub olReply()

'Dichiarazione Variabili generiche
Dim Folder_Select As String
Dim Oggetto_Select As String
Dim risposta_Select As String

'popolo le variabili sopra
Folder_Select = Foglio1.Cells(4, 4).Value
Oggetto_Select = Foglio1.Cells(5, 4).Value
risposta_Select = Foglio1.Cells(6, 4).Value

'Dichiaro le variabili per la gestione della mail
'per accettarle ho dovuto aggiungere in strumenti\riferimenti la voce "Microsoft outllok XX.X object library"

Dim objOL As Outlook.Application
Dim objMsg As Outlook.MailItem
Dim oReply As Outlook.MailItem
Dim myFolder As Outlook.Folder

'setto le variabili per recuperare i dati
Set objOL = CreateObject("Outlook.Application")
Set myNameSpace = Outlook.GetNamespace("MAPI") ' questo non so a cosa serva, lo ho trovato su internet :D
Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox) 'qui indico quale sia il folder di partenza
Set myFolder = myFolder.Folders(Folder_Select) ' qui indico in quale folder trovare le mail

'inizio a rispondere alle e-mail
For Each objMsg In myFolder.Items
If objMsg.UnRead = True Then
If objMsg.Subject = Oggetto_Select Then
Set oReply = objMsg.Reply
oReply.HTMLBody = risposta_Select & objMsg.HTMLBody
oReply.Display
End If
End If
Next

'Distruggo le variabili
Set objMsg = Nothing
Set objOL = Nothing
Set oReply = Nothing
Set myFolder = Nothing
End Sub
fulviot
Utente Junior
 
Post: 33
Iscritto il: 12/04/16 09:21

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 18/07/17 06:37

Ciao fulviot, premesso che sono un neofita in vba e vb, sto divertendomi a cercare di scrivere il codice di "rispondere" e "inoltra" tramite vba excel all'e-mail arrivata in Outlook. Ho letto sul tuo post ("su internet ho trovato una funzione che mi permette di risponde solamente alle mail che sono selezionate in outlook") che hai trovato un codice del genere sul web. Ho cercato ma non l'ho trovato. Puoi darmi gentilmente qualche indicazione? Sto usando Excel 10 e Outlook 10, si aprono con la mascherina gialla. Grazie mille
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi Anthony47 » 19/07/17 02:30

Ciao EnricoBianco, benvenuto nel forum.
Temo che fulviot non sia rimasto sintonizzato su questo canale; se vuoi qualche suggerimento di massima allora spiega il processo che vorresti realizzare e ci provero'. Mi interessa anche sapere esattamente quale versione di Office usi e su quale piattaforma (Excel 10 mi fa pensare a Office 2002 per Windows, ma mi sembra un po' vecchiotto).

Se invece vuoi provare in autonomia, cerca su google con le chiavi
Codice: Seleziona tutto
outlook reply excel vba
outlook forward excel vba


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 19/07/17 18:29

Grazie mille Anthony per la risposta e per il consiglio mi metto molto volentieri alla scoperta dei codici con le tue indicazioni.
Il processo è il seguente: arriva un'e-mail in Outlook e la macro vba consente di fare o "rispondi a tutti" o "inoltra a tutti".

Poi sto cercando di selezionare un testo da inserire nell'e-mail ma questo dovrei essere in grado ;o) infatti sto facendo alcune prove con il codice "crea e invia e-mail da vba", questa parte del processo infatti non non credo dovrebbe cambiare se si tratta di crea e invia o rispondi/inoltra.

Se ho capito bene, il processo indicato da fulviot fa rispondi e-mail da un folder in Outlook dove sono inserite le e-mail in modo da verificare le e-mail di interesse (con una regola Outlook le potrei spostare) però il processo mi si blocca alla riga in cui setta myFolder:

Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox) 'qui indico quale sia il folder di partenza

In D4 ho capito che bisogna mettere qualcosa tipo il path Oulook, ci ho provato ma si blocca. Ho inserito la libreria nel progetto macro ma non va comunque.

Ho visto le caratteristiche del computer:
Microsoft Office 2010
Microsoft Outlook 2010
Windows 7
System type: 64 bit

Grazie mille ;o)
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi Anthony47 » 20/07/17 02:59

Hummm.... C'e' un motivo per cui questa automazione pensi di farla all'interno di Excel e non in Outlook? Ad esempio crei in Outlook una macro di VBA_Inoltro e una di VBA_Rispondi e poi crei una "Regola" che come azione abbia "Esegui uno script".
Puoi inoltre avviare le macro tramite comandi standard (es Esegui Macro) o tramite icone e personalizzazioni aggiunte sia alla Barra di accesso Rapido che al Ribbon.

Per quanto riguarda il codice di fulviot, per farlo funzionare ho dovuto modificare la dim di alcuni oggetti come segue:
Codice: Seleziona tutto
'Dim objMsg As Outlook.MailItem
Dim objMsg As Object
'Dim oReply As Outlook.MailItem
Dim oReply As Object
'Dim myFolder As Outlook.Folder
Dim myFolder As Object

Come pure ho modificato questa:
Codice: Seleziona tutto
'Set mynamespace = Outlook.GetNamespace("MAPI") ' questo non so a cosa serva, lo ho trovato su internet :D
Set mynamespace = objOL.GetNamespace("MAPI") ' questo non so a cosa serva, lo ho trovato su internet :D

Pero' io non ho OL2010, e ho provato su OL2003; prossimamente potro' provare su OL2016

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 25/07/17 15:58

Grazie mille, ci provo. Gentilissimo.
Grazie per il consiglio, ho visto un sito che contiene codice vario per outlook:
http://www.outlookcode.com/d/code/index
Interessante, cerco anche qui
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 25/07/17 17:18

Nel periodo non collegato mi sono messo in cercadi codice sull'argomento. Interessante il sito stackoverflow.

Ma questi codici non mi funzionano, in realtà non danno messaggi di errore a parte uno come ho riportato.

Rispondi a tutti
https://stackoverflow.com/questions/252 ... from-excel
Codice: Seleziona tutto
Sub Test()
Dim olApp As Outlook.Application
Dim olNs As Namespace
Dim Fldr As MAPIFolder
'Dim olMail As Variant
Dim olMail As Outlook.MailItem
Dim i As Integer

Set olApp = New Outlook.Application
Set olNs = olApp.GetNamespace("MAPI")
Set Fldr = olNs.GetDefaultFolder(olFolderInbox)
i = 1

For Each olMail In Fldr.Items
If InStr(olMail.Subject, "Application for Privilege Leave - Leave ID - Dev-PL-45252-4") <> 0 Then
olMail.Display
olMail.ReplyAll
olMail.ReplyAll.body = bodyMail & vbLF & .body

'Inserisce testo e-mail
For Each oMail in Fldr.Items
    If InStr(olMail.Subject, "mysubject") <> 0 Then
        With oMail.ReplyAll
            .Subject  = oMail.Subject '~~> this is optional
            .Body = "your Body"
            '~~> all other stuff you need your mail to have
            .Display '~~> change to .Send if it is already ok
        End With
    End If
Next
'Inserisce testo e-mail


i = i + 1
End If
Next olMail
End Sub



Inoltra e-mail. Da errore: "While senza Wend"
https://www.mrexcel.com/forum/excel-que ... cript.html
Codice: Seleziona tutto
Dim OLF As Outlook.MAPIFolder, CurrUser As String
Dim EmailItemCount As Integer, i As Integer, EmailCount As Integer

    Dim appOutlook        As Outlook.Application
    Dim ns                As Outlook.NameSpace
    Dim Inbox             As MAPIFolder
    Dim MoveToFolder      As MAPIFolder
    Dim strSubject        As String
    Dim strSender         As String
   
    Set appOutlook = CreateObject("Outlook.Application")
    Set ns = appOutlook.GetNamespace("MAPI")
    Set Inbox = ns.GetDefaultFolder(olFolderInbox)
     
   SetOLF=GetObject("","Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
   EmailItemCount = OLF.Items.Count
   i = 0: EmailCount = 0
   
   
   While i < EmailItemCount
      i = i + 1
     
          With OLF.Items(1)
          EmailCount = EmailCount + 1
          Mail_subject = .Subject
          Mail_body = .Body
          mail_from = .SenderName
          .UnRead = False
               
          End With



Altra routine che funziona con Outlook 10 e che funziona 'secondo il test eseguito dall'autore. A me non funziona.
http://windowssecrets.com/forums/showth ... ward-Email
Codice: Seleziona tutto
Sub Complete()

' Send Completed Message to support
On Error Resume Next
Dim oApp As Outlook.Application
Dim objFolder As Outlook.MAPIFolder
Set oApp = New Outlook.Application
Set objNS = Application.GetNamespace("MAPI")
Set objInbox = objNS.GetDefaultFolder(olFolderInbox)
Set objFolder = objInbox.Folders("Inbox")
Dim oEmail As Outlook.MailItem

'Require that this procedure be called only when a message is selected
If Application.ActiveExplorer.Selection.Count = 0 Then
    Exit Sub
End If

For Each objItem In Application.ActiveExplorer.Selection
    If objFolder.DefaultItemType = olMailItem Then
        If objItem.Class = olMail Then
            Response = MsgBox("Forward message (" + Item.Subject + ") to Appended Subject")
            Set myForward = objItem.Forward
            myForward.Subject = "APPENDED SUBJECT - " + objItem.Subject + ""
            'myForward.Recipients.Add "John Doe <jdoe@someaddress.com>"
            myForward.Send
        End If
    End If
Next

End Sub



Altro codice
https://www.pcreview.co.uk/threads/how- ... s.2798274/

Codice: Seleziona tutto
Sub ForwardA()
 Dim objMail As Outlook.MailItem
 Set objItem = GetCurrentItem()
 Set objMail = objItem.Forward
objMail.To = ""
 objMail.Display
 Set objItem = Nothing
 Set objMail = Nothing
 End Sub



Codice: Seleziona tutto
Sub ForwardB()
 Dim objMail As Outlook.MailItem
 Set objItem = GetCurrentItem()
 Set objMail = objItem.Forward
objMail.To = ""
 objMail.Display
 Set objItem = Nothing
 Set objMail = Nothing
 End Sub


Codice: Seleziona tutto
Function GetCurrentItem() As Object
 Dim objApp As Outlook.Application
 Set objApp = Application
 On Error Resume Next
 Select Case TypeName(objApp.ActiveWindow)
   Case "Explorer"
      Set GetCurrentItem = _
       objApp.ActiveExplorer.Selection.Item(1)
   Case "Inspector"
      Set GetCurrentItem = _
        objApp.ActiveInspector.CurrentItem
   Case Else
 End Select
 End Function
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi Anthony47 » 26/07/17 00:16

Non ho grande abilita' a revisionare il codice di altri, ma qualche commento lo posso "sparare"...
Ad esempio, sulla prima Sub: ma tu hai veramente delle email il cui Subject comincia con "Application for Privilege Leave. Etc etc"?

Il secondo codice e' monco sia in testa (dove comincia?) che in coda (della famosa "End Sub" non c'e' traccia); non mi meraviglia che dia un (uno solo??) messaggio di errore.

Nel codice della Sub Complete, elimina la riga On Error Resume Next e certamente qualche errore comparira'; comunque metti un break sulla Exit Sub (oppure metti l'istruzione Stop subito prima di Exit Sub) in modo da controllare se l'uscita e' su quella Exit oppure sulla End Sub.
Metti anche una wait di almeno 500 msec prima di Next (Next objItem), in questo modo:
Codice: Seleziona tutto
'codice esistente
        End With
    End If
Call myWait(0.5)         '+++ Riga da aggiungere nel codice esistente
Next
End Sub



Codice: Seleziona tutto
'+++ Ulteriore codice da aggiungere in un "modulo standard" del vba:
Sub myWait(myStab As Single)
Dim myStTiM As Single
'
    myStTiM = Timer
    Do          'wait myStab
        DoEvents
        If Timer > myStTiM + myStab Or Timer < myStTiM Then Exit Do
    Loop
End Sub

Analogamente nelle Sub ForwardA e Sub ForwardB inserisci un ritardo di almeno 1 sec prima di distruggere objItem:
Codice: Seleziona tutto
objMail.Display
Call myWait(1.0)         '+++ Riga da aggiungere nel codice esistente
 Set objItem = Nothing
(presuppone che il codice della Sub myWait sia gia' stato inserito in un modulo standard del vba).

Ci sono anche altre righe "On Error Resume Next" la cui motivazione non conosco e che vanno abolite; questa istruzione e' da usare (nella mia opinione) solo quando una specifica istruzione potrebbe ragionevolmente dare errore senza che questa sia una situazione di vero errore, e deve essere seguita da un ripristino della gestione dell'errore (On Error Goto XYZ; oppure On Error Goto 0).

So che stai facendo esperimenti e quindi non ti chiedo di spiegare cosa vuoi fare per provare a dare dei suggerimenti piu' espliciti...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 26/07/17 00:43

Grazie di tutto, in realtà sto cercando come ho scritto nel secondo post una cosa molto semplice (penso): arriva un'e-mail in Outlook e la macro vba consente di fare o "rispondi a tutti" o "inoltra a tutti".
Poi sto cercando di selezionare un testo da inserire nell'e-mail ma questo dovrei essere in grado ;o) infatti sto facendo alcune prove con il codice "crea e invia e-mail da vba", questa parte del processo infatti non non credo dovrebbe cambiare se si tratta di crea e invia o rispondi/inoltra.
Quindi ho cercato un pò ovunque come da tue stringhe di ricerca nella speranza che magari riuscivo a trovare un codice adatto ma no. Quindi mi concentro su questo di fulviot e sulle tue modifiche.
Poi devo cercare con calma, come da tuo consiglio la possibilità di fare una macro in Outlook (peccato manchi il registratore, se ho capito bene) ma il sito che ho indicato ha molto materiale. Le strade sono quindi due:
- fulviot+Anthony47
- prove con macro Outlook (fonte: http://www.outlookcode.com/d/code/index)
Grazie di tutto
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 26/07/17 13:57

Ripartendo dal codice fulviot modificato da Anthony47, che ringrazio moltissimo, ho provato con le modifiche ma si ferma sempre alla stessa riga:

Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox) 'qui indico quale sia il folder di partenza

Se ho capito bene dalla cella D4 del Foglio1 il processo "legge" il percorso dove prendere l-e-mail di Outlook alla quale fare reply. Quindi dopo aver inserito sotto Inbox di Outlook il percorso Pippo\Pluto ho provato come segue scrivendo in D4 in alternativa:

Inbox\Pippo\Pluto

Tutto il percorso outlook rilevato dal file posta:
C:\Appdata\Local\Microsoft\Outlook\miaemail.it.ost\Inbox\Pippo\Pluto

C:\Appdata\Local\Microsoft\Outlook\miaemail.it\Inbox\Pippo\Pluto
Cioè senza il .ost

Però da sempre il messaggio di errore "necessario oggetto"
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 26/07/17 14:01

Dal sito http://www.outlookcode.com/d/code/index ho trovato solo codice di reply a e-mail già impostata e non un codice reply/forward generico. Libri di vba che ho trattano solo nuova e-mail da modello. Insomma ora è proprio una vera sfida!!!
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 26/07/17 14:04

Il percorso Outllok l'ho visto in proprietà del percorso file di posta perchè ho pensato che il processo deve essere indirizzato. Ma magari sbaglio
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi Anthony47 » 26/07/17 23:53

Vediamo di fare qualche passo avanti...
Assodato che non c'e' motivo per lavorare dal vba di Excel per eseguire una macro su Outlook lavoreremo direttamente su Outlook...
Ma prima cerchiamo di mettere qualche punto fermo. Ad esempio: come si identificano le mail su cui la macro deve eseguire (supponiamo) un "Rispondi a tutti"?
Risposta: crei una "regola" di Outlook che sposta i messaggi da processare in una cartella specifica; ad esempio
Codice: Seleziona tutto
Cartelle personali / Posta in arrivo /DaProcessare

Crei anche una cartella in cui le mail processate dalla macro saranno spostate; ad esempio:
Codice: Seleziona tutto
Cartelle personali / Posta in arrivo /Processate

Ora creiamo una macro che legge ognuna della mail presenti nella cartella prescelta e fa Rispondi a tutti. Potrebbe essere:
Codice: Seleziona tutto
Sub RepAll()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=107024&p=638054#p638054
Dim daProc As MAPIFolder, Procd As MAPIFolder
Dim myNameSpace As NameSpace, myMex As MailItem, myReply As MailItem
Dim sjAdd As String, MailTxt As String, I As Long
'
sjAdd = " - autoanswer by macro"                    '<<< Un testo da accodare nel Subject
'Composizione del testo della Risposta (esempio):   '<<< Composizione del testo
MailTxt = "Cari amici, sapete gia' che fare " & vbCrLf
MailTxt = MailTxt & "Firmato: Enrico" & vbCrLf
MailTxt = MailTxt & "Non telefonatemi" & vbCrLf
'
Set myNameSpace = Application.GetNamespace("MAPI")
Set daProc = myNameSpace.Folders("Cartelle personali").Folders("Posta in arrivo").Folders("DaProcessare")   '<<<Folder di origine
Set Procd = myNameSpace.Folders("Cartelle personali").Folders("Posta in arrivo").Folders("Processate")      '<<< Folder si destinazione
'
For Each myMex In daProc.Items
    If TypeOf myMex Is MailItem Then
        Set myReply = myMex.ReplyAll
        myReply.Subject = myMex.Subject & sjAdd
        myReply.Body = MailTxt & myReply.Body
    '    myReply.Send
        myReply.Display
        myWait (0.5)
        myMex.Move Procd
        I = I + 1
    End If
Next myMex
MsgBox ("Completato; (" & I & " messaggi)")
End Sub

Sub myWait(myStab As Single)
Dim myStTiM As Single
'
    myStTiM = Timer
    Do          'wait myStab
        DoEvents
        If Timer > myStTiM + myStab Or Timer < myStTiM Then Exit Do
    Loop
End Sub

Va messo in un Modulo standard del vba di Outlook; partendo da Outlook:
-premi Alt-F11 per aprire l'editor delle macro
-Menu /Inserisci /Modulo
-Copia il codice e incollalo nel frame dx del modulo appena creato
-Personalizza le righe marcate <<< come da commenti.

Poi torna su Excel e quando vuoi lancia la macro RepAll:
-premi Alt-F8
-seleziona RepAll dall'elenco di macro disponibili
-premi Esegui
La macro dovrebbe fare "Rispondi a tutti" per tutte le mail che trova nel folder indicato, spostando la mail nell'altro folder indicato.

Ovviamente puoi automatizzare diversamente l'esecuzione della RepAll.

Prova e fai sapere
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 27/07/17 01:16

Grazie mille Anthony, provo e faccio sapere
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 27/07/17 19:41

Dopo una giornata di test...Buone notizie e anche un'osservazione.
La prima buona notizia è che con una e-mail nel folder "DaProcessare" la macro funziona seguendo tutti i passi indicati da Anthony. Grazie Anthony!!! Non ci sarei mai arrivato da solo.
La seconda buona notizia è che ho provato ad inserire il codice per Outlook in excel e non funziona ma cambiando la seguente riga della macro per Outlook diAnthony: "Set myNameSpace = Application.GetNamespace("MAPI")"
con la seguente riga di fulviot: "Set myNameSpace = Outlook.GetNamespace("MAPI")" la macro scritta per Outlook da Anthony funziona anche in excel. Ora perchè anche excel? Perchè se ho visto bene nel menu macro di Outlook non è possibile (come invece in excel) attribuire ad una macro un comando veloce "ctrl+x" per esempio. E poi perchè volevo divertirmi a settare il testo da inserire nell'e-mail, e ci sto già lavorando come già scritto in post precedenti, da una cella di excel magari inserito con data entry di una maschera. Questa seconda parte la sto testando.

Cambiando poi "Set myReply = myMex.ReplyAll" con "Set myReply = myMex.Reply" e "Set myReply = myMex.Forward" fa esattamente come Outlook cioè rispondi a tutti senza allegato/i, rispondi solo al mittente senza allegato/i, inoltra senza indirizzi di origine ma con allegato/i.

Ora veniamo all'osservazione perchè funziona benissimo con un sola e-mail nel folder "DaProcessare" ma...Se ci sono più e-mail nel folder "DaProcessare" accade una cosa strana e cioè se il numero di e-mail è dispari:
se c'è ne sono tre, la macro ne apre (display) due
se c'è ne sono 5 la macro ne apre 3
se c'è ne sono 7 la macro ne apre 4
se c'è ne sono 9 la macro ne apre 5
se c'è ne sono 11 la macro ne apre 6
se c'è ne sono 13 la macro ne apre 7
e così via.
Se invece il numero di e-mail è pari apre la metà delle e-mail. Sarebbe interessante capirne la logica matematica. Ho provato a svuotare la cache (non si mai), a fare il reboot, a copiare e incollare e-mail nel folder "Daprocessare" ma il funzionamento non cambia.
Il display avviene random in quanto qualche volta non apre l'e-mail cliccata (cioè in evidenza).
Allora ho provato ha mettere in evidenza più e-mail nel foder "Daprocessare" ma la macro si comporta allo stesso modo.
Pensavo che mettendo in evidenza una o più e-mail Outlook capisse che era solo quella/e da gestire.
Allora adesso voglio approfondire, se c'è un comando che faccia girare la macro solo sulla/e e-mail selezionata/e cioè una sorta di "If TypeOf myMex Is MailItem.SELECTED Then".
Adesso è proprio una bella sfida!!!

Comunque ripeto con una sola e-mail funziona perfettamente e anche in excel con la modifica riportata.
Grazie di nuovo Anthony
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 28/07/17 00:50

Cercando sul sito http://www.outlookcode.com dove parla di basic Outlook VBA (http://www.outlookcode.com) se ho capito bene parla di come gestire e-mail tramite la funzione GetCurrentItem. Provo...
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi Anthony47 » 28/07/17 15:12

In Outlook 2003 il comportamento e' diverso, comunque ecco una versione modificata:
Codice: Seleziona tutto
Sub RepAll2()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=107024&p=638054#p638054
Dim daProc As MAPIFolder, Procd As MAPIFolder
Dim myNameSpace As NameSpace, myMex As MailItem, myReply As MailItem
Dim sjAdd As String, MailTxt As String, I As Long
'
sjAdd = " - autoanswer by macro"                    '<<< Un testo da accodare nel Subject
'Composizione del testo della Risposta (esempio):   '<<< Composizione del testo
MailTxt = "Cari amici, sapete gia' che fare " & vbCrLf
MailTxt = MailTxt & "Firmato: Enrico" & vbCrLf
MailTxt = MailTxt & "Non telefonatemi" & vbCrLf
'
Set myNameSpace = Application.GetNamespace("MAPI")
Set daProc = myNameSpace.Folders("Cartelle personali").Folders("Posta in arrivo").Folders("DaProcessare")   '<<<Folder di origine
Set Procd = myNameSpace.Folders("Cartelle personali").Folders("Posta in arrivo").Folders("Processate")      '<<< Folder si destinazione
'
For J = daProc.Items.Count To 1 Step -1
'For Each myMex In daProc.Items
    Set myMex = daProc.Items(J)
    If TypeOf myMex Is MailItem Then
        Set myReply = myMex.ReplyAll
        myReply.Subject = myMex.Subject & sjAdd
        myReply.Body = MailTxt & myReply.Body
    '    myReply.Send
        myReply.Display
        myWait (0.5)
        myMex.Move Procd
        I = I + 1
    End If
'Next myMex
Next J
MsgBox ("Completato; (" & I & " messaggi)")
End Sub

Il codice della Sub myWait non e' cambiato

Questa (come la precedente) lavora sul contenuto di un folder; se vuoi lavorare sulla mail selezionata allora devi sfruttare la Function GetCurrentItem; il codice che avevi pubblicato in uno dei tuoi primi messaggi ti restituisce solo una mail (o quella attiva nell'inspector o la prima selezionata nell'explorer), se vuoi poter lavorare con una o piu' mail devi fare qualche piccola modifica.

Ho preferito continuare a lavorare in Outlook perche' per me il collaudo e' piu' semplice; comunque tieni presente che, se hai OL2010, puoi richiamare facilmente le macro tramite una icona aggiunta alla QuickAccessBar, o puoi creare un "Tab" sul tuo ribbon in cui inserisci le tue automazioni. E comunque mi pare che trasformare tutto in macro eseguibile da Excel lo sai fare.

Una ultima nota: nella macro ci sono le istruzioni myReply.Send e myReply.Display, ma la prima e' "commentata"; in questo modo le mail pronte da spedire sono visualizzate e se ne puo' controllare il contenuto e la corretta impostazione; finito il debug allora puoi attivare la myReply.Send e commentare la myReply.Display, in modo che le mail vengano spedite direttamente dalla macro.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Rispondere a delle mail tramite VBA di Excell

Postdi EnricoBanco » 28/07/17 17:21

Ciao, grazie!!! Funziona alla grande, gestisce tutte le e-mail contenute nel folder "DaProcessare.
Grazie, ora provo con la QuickAccessbar.

Quindi avevo capito bene in merito alla gestione di e-mail selezionate. Ci sto provando. Ho visto anche questo link che spiega come fare:

https://www.slipstick.com/developer/out ... lect-item/

Se ho capito bene bisogna inserire la getcurrentitem function:
**********
Function GetCurrentItem() As Object
Dim objApp As Outlook.Application

Set objApp = Application
On Error Resume Next
Select Case TypeName(objApp.ActiveWindow)
Case "Explorer"
Set GetCurrentItem = objApp.ActiveExplorer.Selection.Item(1)
Case "Inspector"
Set GetCurrentItem = objApp.ActiveInspector.CurrentItem
End Select

Set objApp = Nothing
End Function
**********

Poi ad certo punto dice:
When you want to use the macro with either open or selected items, you can use this function to determine if the item is open or selected. You'll call the function in your code in this manner:
Set objItem = GetCurrentItem()

Quindi se ho capitoche bene è necessario aggiungere questa funzione che va richiamata in questa riga riportata qui sopra. Quindi dove dice "objItem" intende il "myMex"?
Però dice anche che se si vuole gestire item non ancora aperti occorre mettere anche questa riga:
Set objItem = objApp.ActiveExplorer.Selection.Item(1)

Ho provato, ma si blocca. Cerco un esempio più completo perchè altrimenti non riesco a capire come fare.
Grazie veramente delle dritte.
Ciao
EnricoBanco
Utente Junior
 
Post: 77
Iscritto il: 18/07/17 06:29

Re: Rispondere a delle mail tramite VBA di Excell

Postdi Anthony47 » 29/07/17 14:23

Come detto, il codice della Function GetCurrentItem che ho visto pubblicato consente di selezionare una sola email: o quella aperta nell'inspector o la prima selezionata nell'explorer. Se vuoi poter elaborare tutte le email selezionate allora devi ispirarti al codice della GetCurrentItem ma devi utilizzarlo poi all'interno di un codice piu' articolato.
Ad esempio:
Codice: Seleziona tutto
Sub RepSel()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=107024&p=638054#p638054
Dim daProc As MAPIFolder, Procd As MAPIFolder
Dim myNameSpace As NameSpace, myMex As MailItem, myReply As MailItem
Dim sjAdd As String, MailTxt As String, I As Long
'
sjAdd = " - autoanswer by macro"                    '<<< Un testo da accodare nel Subject
'Composizione del testo della Risposta (esempio):   '<<< Composizione del testo
MailTxt = "Cari amici, sapete gia' che fare " & vbCrLf
MailTxt = MailTxt & "Firmato: Enrico" & vbCrLf
MailTxt = MailTxt & "Non telefonatemi" & vbCrLf
'
Set myNameSpace = Application.GetNamespace("MAPI")
'Set daProc = myNameSpace.Folders("Cartelle personali").Folders("Posta in arrivo").Folders("DaProcessare")   '<<<Folder di origine
Set Procd = myNameSpace.Folders("Cartelle personali").Folders("Posta in arrivo").Folders("Processate")      '<<< Folder si destinazione
'
Dim sMail As Single

Select Case TypeName(Application.ActiveWindow)
   Case "Explorer"
        sMail = Application.ActiveExplorer.Selection.Count
   Case "Inspector"
        sMail = 0.1
   Case Else
 End Select

For J = sMail To 0 Step -1
    If sMail >= 1 Then
        Set myMex = Application.ActiveExplorer.Selection.Item(J)
    ElseIf sMail > 0 Then
        Set myMex = Application.ActiveInspector.CurrentItem
    End If
    If TypeOf myMex Is MailItem Then
        Set myReply = myMex.ReplyAll
        myReply.Subject = myMex.Subject & sjAdd
        myReply.Body = MailTxt & myReply.Body
    '    myReply.Send
        myReply.Display
        myWait (0.3)
        myMex.Move Procd
        myWait (0.2)
        I = I + 1
    End If
    If J <= 1 Then Exit For
Next J
On Error Resume Next
myMex.Close olDiscard
On Error GoTo 0
MsgBox ("Completato; (" & I & " messaggi)")
End Sub

Questa macro lavora o sulla singola mail aperta oppure su tutte quelle selezionate; seguendo il codice non farai fatica a decodificarne il significato.

Ciao

keyw
vba outlook automation reply to selected email mail
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Rispondere a delle mail tramite VBA di Excell":


Chi c’è in linea

Visitano il forum: Nessuno e 31 ospiti