Word VBA - 循环通过" AND"删除书签

时间:2018-02-28 23:07:57

标签: arrays vba excel-vba word-vba bookmarks

我正在VBA Word中编写一个宏,它正在从excel文件复制数据并使用预定义的书签粘贴Word文件中的数据。 我在Word中有两组不同的书签,根据要执行的操作,宏首先删除该特定操作不需要的书签,然后粘贴剩余书签所在的数据。

到目前为止,代码在两种情况下都有效,但是,不是一个熟练的程序员,我必须为特定的任务编写几行才能工作,我希望你的帮助"清理"这部分代码,使它更少"复杂"如果需要进行未来的更改,也更容易修改。下面你会发现代码,正如我所说的那样有效,但它并不漂亮。

Dim arr As Variant
Dim bookmark As Bookmarks
Dim i As Long

arr = Array("a", "b", "c")

For Each bookmark In ActiveDocument.Bookmarks
    If bookmark <> arr(0) And bookmark <> arr(1) _
    And bookmark <> arr(2) Then
    bookmark.Delete
    Else
    bookmark.Select 'this is just to give a "useless" alternative to vba
    End If
Next bookmark  

我这里只放了3个数组元素,而实际上有很多元素,但想法是自动化&#34; AND&#34;函数和范围如下:如果Word文件中已存在的每个书签都不同于数组中的任何元素&#34; arr&#34;然后必须删除该书签,否则没有任何反应。 因此,我不想对数组的每个元素使用一个AND函数,而是希望循环遍历数组,以便将每个书签与数组中的所有元素进行比较,并且只有在删除了不同的元素时才会。我不知道是否有办法循环&#34; AND&#34;函数以某种方式,但向数组中添加更多元素意味着添加相同数量的&#34; AND&#34;。

希望能够尽力而为,你可以帮助我。

提前多多感谢!

3 个答案:

答案 0 :(得分:2)

循环数组,并使用布尔值跟踪是否找到。

Dim arr As Variant
Dim bookmark As Bookmarks
Dim i As Long
Dim bln As Boolean

arr = Array("a", "b", "c")

For Each bookmark In ActiveDocument.Bookmarks
    bln = False
    For i = LBound(arr) To UBound(arr)
        If bookmark = arr(i) Then
            bln = True
            Exit For
        End If
    Next i
    If Not bln Then bookmark.Delete
Next bookmark

答案 1 :(得分:0)

如果您只有几个元素,而不是使用&#34;如果&#34;并且可以通过数组循环使用Select Case

Select bookmark
Case Is <> "a","b","c"
bookmark.Delete
Case Else
'Whatever code
End Select

但是根据数组的大小,循环解决方案可能会更好。

答案 2 :(得分:0)

您可以使用Join()函数从所有书签数组值中获取字符串,然后使用Instr()函数检查当前书签是否存在

Dim arr As Variant
Dim bookmark As Bookmark

arr = Array("a", "b", "c")

For Each bookmark In ActiveDocument.Bookmarks
    If Instr(Join(arr, "|"), bookmark) = 0 Then bookmark.Delete
Next bookmark