我正在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”。
希望已经穷尽,你可以帮助我。
非常感谢提前!
循环数组,并使用布尔值来跟踪是否找到。
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
如果您只有几个元素,而不是使用“If”和数组循环,您可以使用Select Case
Select bookmark
Case Is <> "a","b","c"
bookmark.Delete
Case Else
'Whatever code
End Select
但是根据阵列的大小,循环解决方案可能会更好。