Word宏来查找所有超链接,剪切它们,删除其他所有内容,然后粘贴回文档?

时间:2014-08-05 18:27:48

标签: vba ms-word word-vba

我在Powershell中编写了一个脚本,这使我节省了大量时间,而且每天都有单调的任务,即在收件箱中打开未读的电子邮件,并从这些电子邮件中的超链接下载文件。我的脚本读取所有电子邮件,将每个电子邮件的正文保存到.txt文件,打开组织页面并登录,然后使用Invoke-Webrequest从指定类型的.txt文件中的页面下载所有链接(.docx,.doc,.pdf等)。然后它以正确的格式重命名它们并将它们移动到每个文件的相应文件夹中。

我遇到的问题是.txt文件 - 每封电子邮件的正文通常都是“查看电子邮件的项目”,然后是发件人姓名和链接本身。为了让它与Powershell很好地配合,我必须在Word中手动打开.txt文件,使用高级查找搜索“http * ittach”(所有链接和链接都匹配的模式),关闭查找对话框,剪切选定的文本,选择其他所有内容,删除,粘贴链接,然后保存。它几乎没有时间,但理想情况下我想完全自动化这个过程,所以它根本不需要任何用户交互,并且每天都可以按计划运行。

我在修改.txt文件时尝试使用Word的宏录制器记录我的确切操作,但每次尝试在文档上运行宏时,都会返回“运行时错误4605:此方法或属性不可用因为对象是空的。“我怀疑在运行宏而不是手动执行动作时,它在关闭查找对话框时不会保留选择。代码如下:

Sub GetLinks()
'
' GetLinks Macro
'
'
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "http*ittach"
        .Replacement.Text = "; "
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
->  Selection.Cut
    Selection.WholeStory
    Selection.TypeBackspace
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
    ActiveDocument.Save
End Sub

错误发生在 - >。

1 个答案:

答案 0 :(得分:0)

我仍然是VBA的新手,但我相信调用Execute会选择Find操作的第一个匹配。

With Selection.Find
    .Text = "http*ittach"
    .Replacement.Text = "; "
    .Forward = True
    .Wrap = wdFindAsk
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
    .Execute
End With

我找不到我为此打开的引用,但我仍然打开了以下页面,因为它似乎非常彻底地涵盖了查找:http://gregmaxey.mvps.org/word_tip_pages/words_fickle_vba_find_property.html

编辑:

如上所述,.Execute仅选择第一个匹配,但进一步研究显示它在调用时返回一个布尔值(如果找到匹配则为True,否则为False),因此您应该能够将其用作一个循环条件。因此,一种解决方案是循环匹配,将选择复制到变量,然后将其全部粘贴到最后。像这样未经测试的代码:

Dim linkArray() As String
Dim idx As Integer

idx = -1
With Selection.Find
    <snip settings>
    While .Execute
        idx = idx + 1
        ReDim Preserve linkArray(idx) As String
        linkArray(idx) = Selection.Text
    Wend
End With
Selection.WholeStory
Selection.TypeText(Join(linkArray, VbCrLf))

希望这有效,但无论如何,While .Execute成语在提出解决方案时应该是有用的。