2017-09-01 1 views
0

J'écris une macro pour ajouter des entrées d'index aux entrées dans les tables dans Word. Certaines cellules contiennent une seule chaîne qui nécessite l'ajout de l'entrée à laquelle j'ai réussi à faire. Par exemple, la cellule contient 'S875'. Je l'ai utilisé le code suivant pour cela:Comment définir la chaîne dans un tableau à la plage dans 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 

Mais j'ai des cellules qui ont besoin de deux ou plusieurs entrées d'index ajoutés, par exemple, S875, 876. J'ai divisé ces derniers dans un tableau et peut boucle à travers le tableau, mais je suis bloqué sur la façon de définir la plage pour ajouter les entrées d'index. Ce que j'est:

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 

Je pense que je soit besoin de changer en quelque sorte la sélection à chaque entrée sur le tableau ou utiliser la plage mais je ne suis pas sûr exactement?

Répondre

1

Vous étiez exactement sur la bonne voie. Avec un peu plus de patience, vous l'auriez sûrement fait.

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 

Notez que Split("S675", ",") renvoie un tableau avec un seul élément. Par conséquent, vous pouvez gérer des index uniques et plusieurs indices avec le même code.

L'utilisation de l'objet Selection est plus lente que l'objet Range car l'écran doit être mis à jour pour chaque sélection. L'objet Range fonctionne discrètement derrière l'écran.