2017-09-01 1 views
0

Ich schreibe ein Makro zum Hinzufügen von Indexeinträgen Einträge in Tabellen in Word. Einige Zellen enthalten eine einzelne Zeichenfolge, für die der hinzugefügte Eintrag benötigt wird. ZB Zelle enthält "S875".So legen Sie Zeichenfolge in einem Array auf den Bereich in 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 

Aber ich habe einige Zellen bekam, die zwei oder mehr Indexeinträge müssen hinzugefügt, zB S875, 876. ich diese in ein Array aufgeteilt haben und kann Schleife: Ich habe den folgenden Code für diese verwendet durch das Array aber bin ich darauf, wie Sie den Bereich zum Hinzufügen der Indexeinträge festlegen. Was ich habe, ist:

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 

Also ich denke, ich entweder muß irgendwie die Auswahl auf dem Array zu jedem Eintrag ändern oder die Range verwenden, aber ich bin nicht sicher genau?

Antwort

1

Sie waren genau auf dem richtigen Weg. Mit ein bisschen mehr Geduld hättest du es bestimmt geschafft.

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 

Beachten Sie, dass Split("S675", ",") ein Array mit einem einzelnen Element zurückgibt. Daher können Sie einzelne Indizes und mehrere mit demselben Code behandeln.

Die Verwendung des Selection-Objekts ist langsamer als das Range-Objekt, da der Bildschirm für jede Auswahl aktualisiert werden muss. Das Range-Objekt arbeitet leise hinter dem Bildschirm.

Verwandte Themen