2017-09-01 41 views
0

我正在编写一个宏以将索引条目添加到表中的条目中。有些单元格包含一个需要添加条目的字符串,我已经设法完成该条目。例如,单元格包含'S875'。我用下面的代码是:如何将数组中的字符串设置为Word中的范围VBA

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 

所以,我认为我要么需要在选择某种方式改变为每个条目阵列上或使用范围,但我不知道到底是什么?

回答

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对象静静地在屏幕后面工作。

相关问题