2011-08-29 68 views
11

Deseo poder ejecutar un módulo VBA que manipule la tabla en la que me encuentro actualmente (es decir, el cursor está en algún lugar dentro de esa tabla). El código de VBA realizará una operación idéntica en cada tabla en la que se encuentre cuando la ejecute.¿Cómo puede obtener la tabla actual en MS Word VBA?

Así que, por ejemplo, supongamos que tengo un módulo que debe marcar en negrita la fila superior de cada tabla (los títulos). Tendría que ubicar el objeto de tabla (llamado whatever) en el que se encuentra actualmente para poder manipular whatever.rows(0).

¿Cómo puedo obtener el objeto de la tabla desde la posición del cursor? También necesito detectar si estoy no en una tabla y no hacer nada (o levantar un cuadro de diálogo de error).

Respuesta

11

La subrutina de VBA en la parte inferior de esta respuesta muestra cómo hacerlo.

Se utiliza la selección actual, colapsando hasta el punto de partida en primer lugar con el fin de no tener que preocuparse de selecciones múltiples segmentos:

Selection.Collapse Direction:=wdCollapseStart 

A continuación, comprueba que la selección para asegurarse de que está dentro de una tabla

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

A continuación, se puede acceder a la tabla consultando Selection.Tables(1).


El código de abajo era una simple prueba de concepto que simplemente alternar cada una de las células de partida en cada fila de la tabla para insertar o eliminar un marcador barra vertical.

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

Me doy cuenta de que esta es una pregunta bastante antigua, pero me encontré con algún código que puede ayudar a la siguiente persona que se enfrenta a un problema similar.

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

Esto devuelve el índice de la tabla el cursor se encuentra en el cual puede ser utilizado para hacer cambios o recuperar información:.

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 

Obviamente hay que añadir controles para garantizar el cursor está dentro de una mesa.

+0

¡Perfecto! Esto es exactamente lo que necesitaba @enifeder: ActiveDocument.Range (0, Selection.Tables (1) .Range.End) .Tables.count – DRC

Cuestiones relacionadas