对于VBA代码,我是一个菜鸟。我们的想法是扫描特定主题行的传入电子邮件,从电子邮件的第一行提取电子邮件地址,并回复从第一行提取的电子邮件地址。
问题在于emailC行,它告诉我这是一个无效的过程调用或参数。
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
答案 0 :(得分:0)
邮件正文很可能不包含任何'&lt;'或''gt;'。在这种情况下,Instr
将返回0
,并且您最终会得到一个命令left(sText, -1)
,它会严重抛出您描述的错误
对于初学者,请更改代码
dim p as integer
p = InStr(sText, "<")
if p = 0 then
debug.Print "no '<' found, text = :" & sText
else
emailC = Trim(Left(sText, p - 1))
....
之后你必须决定在这种情况下该怎么做(你也应该找到'&lt;'但没有'&gt;'的情况)
答案 1 :(得分:0)
<
和>
可能在sText
中表示为<
和>
。
答案 2 :(得分:0)
通常很好的做法是声明所有变量,即使它们只是字符串。
我会为你正在使用的所有String执行此操作。我还会按如下方式更改您的SendReply例程:
Private Sub SendReply(ByVal Tostr as String,ByVal Subjectstr as String,ByVal Bodystr as String,ByVal senderstr as String)
从内存中,如果你不这样做,代码就不知道变量应该是什么数据类型。