2011-08-29 13 views
11

Desidero essere in grado di eseguire un modulo VBA che manipola la tabella in cui sono attualmente inserito (ovvero, il cursore si trova da qualche parte all'interno di tale tabella). Il codice VBA eseguirà un'operazione identica su ogni tabella in cui ti trovi quando lo esegui.Come si può ottenere la tabella corrente in MS Word VBA?

Quindi, per esempio, supponiamo di avere un modulo che ha bisogno di evidenziare la riga superiore di ogni tabella (i titoli). Dovrebbe trovare l'oggetto tabella (chiamato whatever) in cui si è attualmente in modo che possa manipolare whatever.rows(0).

Come è possibile ottenere l'oggetto tabella dalla posizione del cursore? Devo anche rilevare se sono non in una tabella e non fare nulla (o generare una finestra di errore).

risposta

11

La subroutine VBA in fondo a questa risposta mostra come eseguire questa operazione.

Esso utilizza la selezione corrente, collassare al punto di partenza prima in modo da non devono preoccuparsi di selezioni multi-segmento:

Selection.Collapse Direction:=wdCollapseStart 

Successivamente controlla che la selezione per assicurarsi che sia all'interno di una tabella

If Not Selection.Information(wdWithInTable) Then 
     MsgBox "Can only run this within a table" 
     Exit Sub 
    End If 

La tabella è quindi accessibile facendo riferimento a Selection.Tables(1).


Il codice sottostante era una semplice prova di concetto che semplicemente commutato ciascuna delle celle di partenza in ciascuna riga della tabella a uno inserire o eliminare un marcatore barra verticale.

Sub VertBar() 
    ' Collapse the range to start so as to not have to deal with ' 
    ' multi-segment ranges. Then check to make sure cursor is ' 
    ' within a table. ' 
    Selection.Collapse Direction:=wdCollapseStart 
    If Not Selection.Information(wdWithInTable) Then 
     MsgBox "Can only run this within a table" 
     Exit Sub 
    End If 

    ' Process every row in the current table. ' 
    Dim row As Integer 
    Dim rng As Range 

    For row = 1 To Selection.Tables(1).Rows.Count 
     ' Get the range for the leftmost cell. ' 
     Set rng = Selection.Tables(1).Rows(row).Cells(1).Range 

     ' For each, toggle text in leftmost cell. ' 
     If Left(rng.Text, 2) = "| " Then 
      ' Change range to first two characters and delete them. ' 
      rng.Collapse Direction:=wdCollapseStart 
      rng.MoveEnd Unit:=wdCharacter, Count:=2 
      rng.Delete 
     Else 
      ' Just insert the vertical bar. ' 
      rng.InsertBefore ("| ") 
     End If 
    Next 
End Sub 
3

Mi rendo conto che è una domanda un po 'vecchia, ma ci siamo imbattuti in un codice che può aiutare la prossima persona che si trova ad affrontare un problema simile.

ActiveDocument.Range(0, Selection.Tables(1).Range.End).Tables.count 

Ciò restituirà l'indice della tabella si trova il cursore che può quindi essere utilizzata per apportare modifiche o recuperare le informazioni:.

dim numberOfColumnsInCurrentTable as Integer 
dim currentTableIndex as Integer 

currentTableIndex = ActiveDocument.Range(0, Selection.Tables(1).Range.End).Tables.count 
numberOfColumns = ActiveDocument.Tables(currentTableIndex).Columns.count 

Ovviamente dovrebbero essere aggiunti controlli per garantire il cursore si trova all'interno un tavolo.

+0

Perfetto! Questo è esattamente ciò di cui avevo bisogno @enifeder: ActiveDocument.Range (0, Selection.Tables (1) .Range.End) .Tables.count – DRC