使用带有?的字符串?来自Excel中的Excel单元格内容

时间:2016-01-05 18:47:29

标签: excel vba excel-vba

我正在使用

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中的文本)将不再显示在电子邮件中。

1 个答案:

答案 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