Word VBA - 循环“AND”以删除书签

问题描述 投票:0回答:3

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

希望已经穷尽,你可以帮助我。

非常感谢提前!

arrays vba excel-vba word-vba bookmarks
3个回答
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

0
投票

如果您只有几个元素,而不是使用“If”和数组循环,您可以使用Select Case

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

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


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  
© www.soinside.com 2019 - 2024. All rights reserved.