【问题标题】:Word VBA - Loop through "AND" to delete bookmarksWord VBA - 通过“AND”循环删除书签
【发布时间】:2018-02-28 23:07:57
【问题描述】:

我正在 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 ms-word bookmarks


    【解决方案1】:

    您可以使用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  
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-22
          • 1970-01-01
          • 2020-11-17
          • 1970-01-01
          • 1970-01-01
          • 2017-02-23
          • 1970-01-01
          相关资源
          最近更新 更多