【问题标题】:How to set string in an array to the Range in Word VBA如何将数组中的字符串设置为Word VBA中的范围
【发布时间】:2017-09-01 20:34:05
【问题描述】:

我正在编写一个宏来将索引条目添加到 word 表中的条目中。一些单元格包含一个字符串,需要添加我已经设法完成的条目。例如,单元格包含“S875”。我为此使用了以下代码:

For Each oRow In oTable.Rows
If oRow.Cells.count = 4 Then
    oTable.Cell(oRow.Index, 4).Select
    Selection.Expand unit:=wdCell
    oem = Left$(Selection.Text, Len(Selection.Text) - 2)

    If (oem Like "*O.E.M*") Or (oem Like "*OEM*") Then
          'ignore this row
          Debug.Print oem
   Else
     ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=oem, _
     EntryAutoText:=oem, CrossReference:="", CrossReferenceAutoText:="", 
     BookmarkName:="", Bold:=False, Italic:=False
    End If
   End If
  Next oRow

但是我有一些需要添加两个或更多索引条目的单元格,例如 S875、876。我已将它们拆分为一个数组并可以循环遍历该数组,但我一直坚持如何设置要添加的范围索引条目。我所拥有的是:

If Len(oem) > 6 Then
     oemArray() = Split(oem, ", ")
     For i = LBound(oemArray) To UBound(oemArray)
              'need to use Indexes.MarkEntry to add an index entry for each
              ' string in the array 
              Debug.Print oemArray(i)
     Next i
End If

所以我认为我要么需要以某种方式将选择更改为数组上的每个条目,要么使用范围,但我不确定?

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    你完全在正确的道路上。再多一点耐心,你肯定会完成的。

    Sub WriteIndex()
    
        Dim Rng As Range
        Dim oTable As Table
        Dim oRow As Row
        Dim Oem As String
        Dim Sp() As String, i As Integer
    
        Set oTable = ActiveDocument.Tables(2)           ' used for my test
        For Each oRow In oTable.Rows
            ' in essence, if you have any merged cells in any row in
            ' the table your row counter will be thrown off
            If oRow.Cells.Count = 4 Then
                Set Rng = oRow.Cells(4).Range           ' avoiding the Selection object
                Rng.MoveEnd wdCharacter, -1
                Oem = Rng.Text
                ' your "Like" code seems to be case sensitive
                ' if so, this should be more flexible
                If (InStr(1, Oem, "O.E.M", vbTextCompare)) Or _
                   (InStr(1, Oem, "OEM", vbTextCompare)) Then
                      'ignore this row
                      Debug.Print "Found: "; Oem
                Else
                    Sp = Split(Oem, ",")
                    For i = 0 To UBound(Sp)
                        With ActiveDocument
                            ' it seems that all but the first two properties
                            ' are optional and can be omitted if not set
                            .Indexes.MarkEntry Range:=Rng, _
                                               Entry:=Trim(Sp(i)), _
                                               EntryAutoText:=Trim(Sp(i)), _
                                               CrossReference:="", _
                                               CrossReferenceAutoText:="", _
                                               BookmarkName:="", _
                                               Bold:=False, _
                                               Italic:=False, _
                                               Reading:=""
                        End With
                    Next i
                End If
            End If
        Next oRow
    End Sub
    

    请注意,Split("S675", ",") 返回一个包含单个元素的数组。因此,您可以使用相同的代码处理单个索引和多个索引。

    使用 Selection 对象比 Range 对象慢,因为必须为每个选择更新屏幕。 Range 对象在屏幕后面安静地工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 2011-10-21
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2015-03-22
      • 2011-10-10
      相关资源
      最近更新 更多