2017-09-28 1 views
0

Je suis un noob quand il s'agit de code VBA. L'idée est de scanner les e-mails entrants pour une ligne d'objet particulière, d'extraire l'adresse e-mail de la première ligne de l'e-mail et de répondre à l'adresse e-mail extraite de la première ligne.Extrait l'adresse e-mail de la chaîne: procédure invalide appel ou argument

Le problème réside dans la ligne emailC, où il me dit qu'il s'agit d'un appel ou d'un argument de procédure non valide.

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) 

    Dim mymail As Outlook.MailItem 
    Dim ns As Outlook.NameSpace 
    Set ns = Application.GetNamespace("MAPI") 
    Set mymail = ns.GetItemFromID(EntryIDCollection) 

    Substr = Trim(mymail.Subject) 
    If InStr(1, Substr, "TEST SUBJECT") > 0 Then 

     sText = mymail.Body 

     vText = Split(sText, Chr(13), -1, vbTextCompare) 
     'Find the next empty line of the worksheet 
     emailC = Trim(Left(sText, InStr(sText, "<") - 1)) 'Split(vText(0), " ", -1, vbTextCompare) 
     Resultstr = Trim(Mid(sText, InStr(sText, ">") + 1)) 
     senderstr = mymail.SenderEmailAddress 

     Call SendReply(emailC, mymail.Subject, Resultstr, senderstr) 

    End If 

End Sub 

Private Sub SendReply(Tostr, Subjectstr, Bodystr, senderstr) 
    Dim mymail2 As Outlook.MailItem 
    Set mymail2 = Application.CreateItem(olMailItem) 

    nam = mymail2.Session.CurrentUser.Name 

    With mymail2 
     .To = senderstr 
     .Subject = "RE: " & Subjectstr 
     .ReplyRecipients.Add emailC 
     .Body = Replace(Bodystr, Tostr, "", 1, -1, vbTextCompare) 

    End With 

    mymail2.Send 

End Sub 

Répondre

0

Très probablement le corps du message ne contient aucune « < » ou « > ». Dans ce cas, le Instr retournera 0, et vous vous retrouvez avec une commande left(sText, -1) qui exacly jeter l'erreur que vous décrivez

Pour une entrée, changer votre code

dim p as integer 
p = InStr(sText, "<") 
if p = 0 then 
    debug.Print "no '<' found, text = :" & sText 
else 
    emailC = Trim(Left(sText, p - 1)) 
    .... 

Après cela, vous devez faire votre esprit ce qu'il faut faire dans ce cas (et vous devriez aussi que vous trouvez un « < » mais pas « > »)

0

peut-être le < et > sont en sText représentés comme &lt; et &gt;.

0

Il est généralement recommandé de déclarer toutes vos variables même si elles ne sont que des chaînes.

Je le ferais pour toutes les chaînes que vous utilisez. Je voudrais aussi changer votre routine SendReply comme suit:

Private Sub SendReply (ByVal Tostr as String, ByVal SubjectStr comme String, ByVal Bodystr comme String, ByVal senderstr as String)

De mémoire, si vous ne le faites pas faire ce qui précède, le code ne sait pas quel type de données les variables devraient être.