【问题标题】:Outlook VBA find and add link; keeps skipping first hitOutlook VBA 查找并添加链接;一直跳过第一击
【发布时间】:2014-10-07 07:42:35
【问题描述】:

我长期受益于这里的人们向其他人提供的有用建议(真诚感谢大家),但这是我第一次真正发帖。我的 VBA 技能充其量只是乏善可陈。

这让我发疯:我有一个 Outlook 宏,它应该在发送电子邮件之前梳理并替换对我们政策文件的引用,所有这些文件的前缀都是“A&P-”,并带有指向该文件的链接.

它实际上工作得很好,除了它固执地拒绝捕获引文,如果它们是电子邮件中的第一个单词。因此,例如,如果我有一个如下所示的条目列表:

A&P-I-A-1-100、A&P-II-B-2-200、A&P-III-C-3-300

脚本将添加指向第二个和第三个条目的链接(以及我想添加的更多),但完全跳过第一个。奇怪的是,如果我在电子邮件的开头添加任何字符(即使只是按了几次空格键),这不会发生。它也不影响后续段落开头的引用。就这第一个字。

这是我正在使用的代码。非常非常感谢任何帮助!:

Sub Citation3()

Dim myInspector As Outlook.Inspector
Dim myObject As Object
Dim myItem As Outlook.MailItem
Dim rngStory As Word.Range
Dim myDoc As Word.Document
Dim mySelection As Word.Selection
Dim strItem As String
Dim strItem2 As String
Dim strLink As String

Set myInspector = Application.ActiveInspector
Set myObject = myInspector.CurrentItem
Set myDoc = myInspector.WordEditor
Set mySelection = myDoc.Application.Selection

For Each rngStory In ActiveDocument.StoryRanges
    With mySelection.Find
        .ClearFormatting
        .Text = "A&P-*-*-[0-9]{3}"
        .Replacement.Text = ""
        .Wrap = wdFindContinue
        .MatchWildcards = True

    If mySelection.Find.Execute = True Then
        While mySelection.Find.Execute
        strItem = mySelection.Text
        strItem2 = Replace(strItem, "A&P", "AP")

  mySelection.Hyperlinks.Add Anchor:=mySelection.Range, _
  Address:="http://www.google.com/" & strItem2 & "_document.shtml", _
  TextToDisplay:=strItem

End If

End With

Next rngStory


End Sub

【问题讨论】:

    标签: vba email replace outlook find


    【解决方案1】:

    问题线是:

    If mySelection.Find.Execute = True Then
        While mySelection.Find.Execute
    

    当他们像那样被隔离时,你可能会看到发生了什么。

    您在 If 语句中执行一个 Execute 语句,该语句找到您正在寻找的模式的第一次出现,然后立即在 While 循环中执行另一个 Execute 现在找到第二次出现该模式,因此完全忽略了第一个匹配。之后,代码围绕While 循环循环并正确选择剩余的匹配项。

    要解决此问题,只需删除 If 和相应的 End If 行,因为您不需要它们。 While 循环会处理所有事情。

    现在,进行一些观察。

    在您的代码中,我没有看到您的For Each 循环的Next 语句,或您的With 块的End With 语句,或您的Wend 循环的Wend 语句,或End Sub 就此而言。我只能假设您只剪切和粘贴了代码的选定部分,所以我将忽略它。

    您可能应该更好地缩进您的代码,以便其他人(以及您!)更容易阅读和识别任何潜在的错误。

    最后,我对你的匹配模式有点困惑:"A&P-*-*-[0-9]{3}"。它与"A&P*[0-9]{3}""A&P-*-*-*-[0-9]{3}" 一样好用。在后者中,请注意P 和 3 位数字之间有 3 位虚线文本(根据您的引用格式规范),而您的原始模式仅占 2 位虚线。

    【讨论】:

    • 完美。谢谢!这实际上起到了作用;我认为出于某种原因,我需要将 while-wend 循环的应用限制在找到选择的时间(我已经从互联网上的代码片段中将这个东西科学化了,所以我可能从一个来源继承了这个假设它更有意义)。尽管我认为下一个在那儿,但还是照顾了丢失的一面。这太棒了,再次感谢!
    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2013-05-08
    • 2022-11-26
    • 1970-01-01
    相关资源
    最近更新 更多