Wenn ich eine Tabelle wie diese habe:
A B
C D
E F
Wenn ich Zelle B entferne, möchte ich, dass alle Zellen um eine Stelle in Richtung A verschoben werden, und zwar wie folgt:
A C
D E
F
Wie erreicht man das? Und wie erreicht man das Gegenteil - eine einzelne Zelle irgendwo einzufügen und alle anderen Zellen um eine Stelle zu verschieben?
Antwort1
Vor ein paar Tagen brauchte ich etwas wie das, wonach knezmilos gefragt hatte, und ich konnte nichts finden, um es zu tun. Also habe ich ein VBA-Makro (Word 2016) erstellt, um genau das zu tun. Das Makro funktioniert auf vier verschiedene Arten:
- Alle Zellen nach rechts bis zum Ende der Tabelle verschieben (Public Sub MoveCellsRight)
- Alle Zellen nach rechts verschieben, bis zur ersten leeren Zelle (Public Sub MoveCellsRightFirstBlankCell)
- Alle Zellen nach links bis zum Tabellenanfang verschieben (Public Sub MoveCellsLeft)
- Alle Zellen nach links verschieben bis zur ersten leeren Zelle (Public Sub MoveCellsLeftFirstBlankCell)
Dieses MakroWIRD NICHT:
- Arbeiten Sie mit Tabellen innerhalb einer Zelle.
- Arbeiten Sie mit geteilten Zellen (jede Zeile muss die gleiche Anzahl Spalten haben).
- Behält das Format der Zelle bei. (Ich hoffe, dass jemand dieses Makro verbessert, indem er diese Funktion hinzufügt).
Hier ist das Makro:
Option Explicit
Dim vmCurrentTableIndex As Integer
Dim vmCurrentTableRowCount As Integer
Dim vmCurrentTableColCount As Integer
Dim vmCurrentCellRow As Integer
Dim vmCurrentCellCol As Integer
Dim vmDirection As String
Enum StopCellMode
FirstLastCell = 0
FirstBlankCell = 1
End Enum
Public Sub MoveCellsRight()
If SetModuleVariables("right") Then
If CheckCurrentCellPosition() Then
MoveCellContent (FirstLastCell)
End If
End If
End Sub
Public Sub MoveCellsLeft()
If SetModuleVariables("left") Then
If CheckCurrentCellPosition() Then
MoveCellContent (FirstLastCell)
End If
End If
End Sub
Public Sub MoveCellsRightFirstBlankCell()
If SetModuleVariables("right") Then
If CheckCurrentCellPosition() Then
MoveCellContent (FirstBlankCell)
End If
End If
End Sub
Public Sub MoveCellsLeftFirstBlankCell()
If SetModuleVariables("left") Then
If CheckCurrentCellPosition() Then
MoveCellContent (FirstBlankCell)
End If
End If
End Sub
Private Function SetModuleVariables(vpDirection As String) As Boolean
Dim vsOK As Boolean
Dim vsMsgBoxValue As Integer
'Check if the [cursor | insertion point] is inside a table.
If ActiveDocument.ActiveWindow.Selection.Information(wdWithInTable) Then
vsOK = True
'Get the index of the current table. / Source: https://wordmvp.com/FAQs/MacrosVBA/GetIndexNoOfPara.htm
vmCurrentTableIndex = ActiveDocument.Range(0, Selection.Tables(1).Range.End).Tables.Count
vmCurrentTableRowCount = ActiveDocument.Tables(vmCurrentTableIndex).Rows.Count
vmCurrentTableColCount = ActiveDocument.Tables(vmCurrentTableIndex).Columns.Count
vmCurrentCellRow = ActiveDocument.ActiveWindow.Selection.Cells(1).RowIndex
vmCurrentCellCol = ActiveDocument.ActiveWindow.Selection.Cells(1).ColumnIndex
vmDirection = vpDirection
Else
vsMsgBoxValue = MsgBox("This command can be executed only within a table.", vbInformation, "Error")
vsOK = False
End If
SetModuleVariables = vsOK
End Function
Private Function CheckCurrentCellPosition() As Boolean
Dim vsOK As Boolean
Dim vsMsgBoxValue As Integer
vsOK = True
If vmDirection = "right" Then
If vmCurrentCellRow = vmCurrentTableRowCount And vmCurrentCellCol = vmCurrentTableColCount Then
vsMsgBoxValue = MsgBox("This is the last cell. There is no cell to move to the right.", vbCritical, "Error")
vsOK = False
End If
Else
If vmCurrentCellRow = 1 And vmCurrentCellCol = 1 Then
vsMsgBoxValue = MsgBox("This is the first cell. There is no cell to move to the left.", vbCritical, "Error")
vsOK = False
End If
End If
CheckCurrentCellPosition = vsOK
End Function
Private Sub MoveCellContent(vpStopCellMode As StopCellMode)
Dim vsCol As Integer
Dim vsRow As Integer
Dim vsStartRow As Integer
Dim vsStartCol As Integer
Dim vsEndRow As Integer
Dim vsEndCol As Integer
Dim vsStep As Integer
Dim IsStartColSet As Boolean
Dim vsCurrentCellContent As String
Dim vsPreviousCellContent As String
Dim vsLenght As Integer
vsPreviousCellContent = ""
IsStartColSet = False
vsStartRow = vmCurrentCellRow
vsStartCol = vmCurrentCellCol
If vmDirection = "right" Then
vsStep = 1
vsEndRow = vmCurrentTableRowCount
vsEndCol = vmCurrentTableColCount
Else
vsStep = -1
vsEndRow = 1
vsEndCol = 1
End If
For vsRow = vsStartRow To vsEndRow Step vsStep
For vsCol = vsStartCol To vsEndCol Step vsStep
vsLenght = Len(ActiveDocument.Tables(vmCurrentTableIndex).Cell(vsRow, vsCol).Range.Text) - 2
vsCurrentCellContent = Left(ActiveDocument.Tables(vmCurrentTableIndex).Cell(vsRow, vsCol).Range.Text, vsLenght)
ActiveDocument.Tables(vmCurrentTableIndex).Cell(vsRow, vsCol).Range.Text = vsPreviousCellContent
vsPreviousCellContent = vsCurrentCellContent
If vsCurrentCellContent = "" And vpStopCellMode = FirstBlankCell Then
Exit Sub
End If
Next
If IsStartColSet = False Then
If vmDirection = "right" Then
vsStartCol = 1
Else
vsStartCol = vmCurrentTableColCount
End If
IsStartColSet = True
End If
Next
End Sub
Antwort2
Antwortversuch:
Schreiben Sie ein Makro, um:
- Erstellen Sie eine separate Kopie der letzten Zelle in der Tabelle unterhalb der Tabelle.
- die kopierte Zelle aus der Tabelle entfernen,
- Bewegen Sie den Cursor zurück zur letzten verbleibenden Zelle, um eine Wiederholung vorzubereiten.
Testen Sie es und versuchen Sie dann, den Randabstand für die Tabellenausrichtung zu entfernen
und die Randdarstellung anzupassen, um ein funktionierendes Design/Erscheinungsbild zu erhalten.
(Nicht ausprobiert)
Ich probiere Dinge in LibreOffice (v5.1.6.2) Writer aus, um beim Aufzeichnen des Makros zu helfen:
Hinweis: Ich versuche nicht, dies in Write aufzuzeichnen, sondern zeige nur, wie es in Word funktionieren KÖNNTE, vorausgesetzt, es hat die gleichen Tastenkombinationen wie Write. Ich habe derzeit keinen Zugriff auf Word Dies ist ein Beispiel für das DENKEN, das auf das Problem anzuwenden ist. Ich versuche nicht, eine spezifische Antwort auf das Q zu finden.
Menü > Tabelle > Tabelle einfügen (STRG+F12), standardmäßig 2x2-Tabelle ...
Geben Sie Textzeilen mindestens in die letzten beiden Zellenzeilen ein.
Drücken Sie den Cursor nach unten, um die Tabelle zu verlassen, und drücken Sie die EINGABETASTE, um mindestens eine zusätzliche Zeile zwischen der Tabelle und allen kommenden Einfügungen einzufügen.
Nun scheint die folgende Beschreibung vielleicht „fortgeschritten“ zu sein – die praktische Umsetzung ist es jedoch NICHT.
Die Aufzeichnung muss dort beginnen, wo die letzte Zellenzeile herauskopiert wird. Also:
- Halten Sie die STRG-Taste gedrückt und drücken Sie den Cursor zweimal nach oben.
Der Cursor befindet sich jetzt oben links in der rechten Zelle, in der letzten Zeile der Tabelle (dem Startpunkt). - Aufnahme starten (bei Verwendung in Word)
- Wählen Sie Menü > Tabelle > Tabelle teilen
(die letzte Tabellenzeile wird in eine separate Tabelle aufgeteilt) - Halten Sie nun STRG und UMSCHALT gedrückt und drücken Sie zweimal Ende.
Schreiben Sie die ausgewählte gesamte rechte Zelle der einzeiligen und zweispaltigen Tabelle. - Halten Sie die STRG-Taste gedrückt und drücken Sie die X-Taste, um den Inhalt auszuschneiden.
- Halten Sie STRG+UMSCHALT gedrückt und drücken Sie Pos1.
Beide Zellen sind ausgewählt - Wählen Sie Menü > Tabelle > Zellen verbinden
- Cursor zwei Zeilen nach unten bewegen, einfügen (STRG+V)
- Halten Sie die STRG-Taste gedrückt und bewegen Sie den Cursor jeweils um einen Schritt nach oben, bis er sich in einer ähnlichen Position befindet wie nach Schritt 1) oben.
- Aufzeichnung beenden (bei Verwendung von Word).
Die letzte Zeile der Tabelle wurde in zwei separate „Tabellen“ mit jeweils einer Zelle extrahiert.
Wenn Sie dem Makro nun eine Tastenkombination zuweisen, können Sie loslegen: Am einfachsten ist es, einfach die Taste gedrückt zu halten, während das Makro die Tabelle „auffrisst“. Bei einer großen Tabelle dauert das wahrscheinlich ein paar Minuten, bei größeren Tabellen länger.