【问题标题】:Using a String with a ? from Excel cell content in visual basic使用带有 ? 的字符串来自 Visual Basic 中的 Excel 单元格内容
【发布时间】:2016-04-09 17:10:28
【问题描述】:

我正在使用

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 下面的回答效果很好!谢谢。对于那些要求使用最少代码来查看发生了什么的人(这对我来说仍然是个谜,因为我只是将这些东西放在一起弗兰金斯坦):

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

【问题讨论】:

  • 欢迎来到 StackOverflow,请在以后的问题中格式化您的代码并添加有助于解决 tu 问题的相关信息。此外,不需要感谢。
  • 我认为" 正在使代码崩溃,因为它是一个特殊字符,而我不确定为什么? 会剪切字符串的其余部分(它可能与@ 987654343@ 电子邮件对象的属性,但这是我第一次听说)。但是,如果您将单元格中的这些字符存储到变量中,则应该没有任何问题,因此我认为我们缺少代码的相关部分。我们可以举一个最小的例子来重现错误吗?
  • 尝试使用这里的功能之一:stackoverflow.com/questions/218181/…
  • 您必须使用ShellExecute 命令来生成电子邮件吗?通过创建Outlook 对象,然后创建电子邮件对象并添加正文和附件等,我取得了很多成功。从这个角度工作可能会绕过你的问题。
  • ~? 不起作用。对不起。

标签: vba excel


【解决方案1】:

地址后的第一个标题应以? 开头,并且不应有互联网不安全字符。在 VBA 中," 字符将结束字符串,并且在 VBA 认为的字符串之外会有非法代码。

?" 替换为您的正文字符串中的十六进制等效项应该可以。

试试:

strBody = Replace(strBody, """", "%22") 'to replace the "
strBody = Replace(strBody, "?", "%3F") 'to replace the ?

在将strBody 传递给ShellExecute 命令之前。

您可以在此处阅读有关使用mailto: 协议的更多信息:https://msdn.microsoft.com/en-us/library/aa767737%28v=vs.85%29.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多