Change the behavior of the TAB key inside a table cell
Article contributed by Bill Coan
Note
When the cursor is inside an unprotected table and you press the Tab key, Word runs a built-in
routine called NextCell. If you create a custom version of this routine, Word will run your version
instead of the built-in version. If the table is in a section of a document protected for forms,
Word runs a built-in routine that lies beyond the reach of Visual Basic for Applications.
Solution
Use a macro to move the cursor downward through each column when the tab key is
pressed (or upward when Shift+Tab is pressed).
Design the macro so that, when the cursor reaches the bottom of a column, it moves to the top of
the next column.
Caveats
The following routines have been tested only on tables where all rows have the same number of
columns and all columns have the same number of rows.
Using them disables the ability to create new rows by tabbing.
1.
|
Click Macro on the Tools menu, then click Macros... on the submenu.
|
2.
|
Under Macro Name, enter NextCell, then click Create
Word will show the following code, which represents the built-in NextCell routine:
Sub NextCell()
'
' NextCell Macro
' Moves to the next table cell
'
Selection.MoveRight Unit:=wdCell
End Sub
|
3.
|
Replace the built-in code with the following code:
Sub NextCell()
Dim NeedToSelect As Long,
CurrentRow As Long, CurrentColumn As
Long
Do While Selection.Information(wdStartOfRangeColumnNumber)
> _
Selection.Information(wdMaximumNumberOfColumns)
Selection.MoveLeft
NeedToSelect = 1
Loop
If NeedToSelect = 1 Then
Selection.Cells(1).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
Exit Sub
End If
CurrentRow = Selection.Information(wdStartOfRangeRowNumber)
CurrentColumn = Selection.Information(wdStartOfRangeColumnNumber)
If CurrentRow <
Selection.Information(wdMaximumNumberOfRows) Then
Selection.Tables(1).Cell(CurrentRow + 1,
CurrentColumn).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
ElseIf CurrentColumn <
Selection.Information(wdMaximumNumberOfColumns) Then
Selection.Tables(1).Cell(1, CurrentColumn + 1).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
Else
Selection.Tables(1).Cell(1, 1).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
End If
System.Cursor = wdCursorNormal
End Sub
|
4.
|
Similarly create a PrevCell macro as with the following code, to intercept
pressing Shift+Tab:
Sub PrevCell()
Dim NeedToSelect As Long,
CurrentRow As Long, CurrentColumn As
Long, _
NumRows As Long,
NumCols As Long
Do While Selection.Information(wdStartOfRangeColumnNumber)
> _
Selection.Information(wdMaximumNumberOfColumns)
Selection.MoveLeft
NeedToSelect = 1
Loop
If NeedToSelect = 1 Then
Selection.Cells(1).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
Exit Sub
End If
NumRows = Selection.Information(wdMaximumNumberOfRows)
NumCols = Selection.Information(wdMaximumNumberOfColumns)
CurrentRow = Selection.Information(wdStartOfRangeRowNumber)
CurrentColumn = Selection.Information(wdStartOfRangeColumnNumber)
If CurrentRow > 1 Then
Selection.Tables(1).Cell(CurrentRow - 1, CurrentColumn).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
ElseIf CurrentColumn > 1 Then
Selection.Tables(1).Cell(NumRows, CurrentColumn - 1).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
Else
Selection.Tables(1).Cell(NumRows, NumCols).Select
Selection.MoveEnd unit:=wdCharacter, Count:=-1
End If
System.Cursor = wdCursorNormal
End Sub
|
5.
|
Select “Save Normal” on the File menu.
|
6.
|
Select “Close and Return to MS Word” on the File menu.
|
7.
|
Position the cursor in a table and press the TAB key
|
8.
|
If not satisfied with the results, modify the code as desired.
|
9.
|
To return the TAB key to its normal functionality, delete or rename the
macros.
|
See also: Intercepting events like Save and Print