我正在使用
Range("$AC" & Right(ActiveCell.Address, 2)).Value
获取所选单元格行中AC
列的内容。单元格的内容是注释,我希望用户能够写入包含在我用宏生成的电子邮件中。例如,截至目前,如果您对学生3进行了评论。"如果没有单元格中的引号,则会将其添加到电子邮件的正文中。注释包含在字符串strBody
中,然后使用以下两个命令(目标电子邮件地址存储在strTo
中)合并到电子邮件中:
strURL = strTo & "&Body=" & strBody
和
ShellExecute 0&, vbNullString, strURL, vbNullString, vbNullString, vbNormalFocus
到目前为止没有问题。除非用户在Excel单元格的内容中使用特殊字符,例如?
或"
。使用?
时,使用"
关闭其余字符串会产生错误,甚至无法生成电子邮件。
所以这就是问题:有没有办法可以编写抓取来格式化单元格的内容,以便忽略特殊字符?或者我可以让用户输入他们的评论,以便?
被视为?
。请注意,我已尝试\?
/?
"?"
"?
'?
,甚至尝试Microsoft.Visual.Chr(34)
。
编辑:
@stucharo在下面的回答非常有用!谢谢。对于那些要求一个最小的代码来看看发生了什么的人(这对我来说仍然是一个谜,因为我只是Frankinstein和这些东西在一起)这里是:
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Sub EmailStudent()
strTo = "mailto:Address@bmail.com"
strSubject = "Email Subject"
strBody1 = Range("'Sheet1'!A1")
strBody2 = Range("'Sheet1'!A2")
strBody3 = Range("'Sheet1'!A3")
strBody = strBody1 & "%0D%0A%0D%0A" & strBody2 & "%0D%0A%0D%0A" & strBody3
strBody = Replace(strBody, "?", "%3F")
strURL = strTo & "&subject=" & strSubject & "&Body=" & strBody
ShellExecute 0&, vbNullString, strURL, vbNullString, vbNullString, vbNormalFocus
End Sub
Sheet1的A1 A2和A3中的文本应包含在电子邮件正文中。您需要运行Outlook客户端。我添加了问号修正,如果您删除了替换命令并在A2中添加了问号,则其后的任何文本(包括A3中的文本)将不再显示在电子邮件中。
答案 0 :(得分:1)
地址后面的第一个标题应该以{{1}}开头,并且不应该存在互联网不安全字符。在VBA中,?
字符将结束字符串,并且在VBA认为是字符串之外将存在非法代码。
使用您的正文字符串中的十六进制等值替换"
和?
应该有效。
尝试:
"
在将strBody = Replace(strBody, """", "%22") 'to replace the "
strBody = Replace(strBody, "?", "%3F") 'to replace the ?
传递给strBody
命令之前。
您可以在此处详细了解如何使用ShellExecute
协议:https://msdn.microsoft.com/en-us/library/aa767737%28v=vs.85%29.aspx