Объединить ячейки в таблице с макросом ms word VBA

Хочу слить в одну ячейку с vba, но не работает.

мой код:

Sub merge()
Dim x As Integer, i As Integer
x = ActiveDocument.Tables(1).Rows.Count
    With ActiveDocument.Tables(1)
      For i = 1 To x + 1
            If .Cell(i, 2).Range.Text = "" Then
            .Cell(Row:=i, Column:=2).merge _
            MergeTo:=.Cell(Row:=i, Column:=3)
            .Borders.Enable = False
            End If      
      Next i
    End With
End Sub

В документе у меня есть таблица (пять строк и три столбца).


person smafeto    schedule 10.04.2019    source источник


Ответы (2)


Для разработчиков кода Excel VBA это общая концептуальная проблема, мы привыкли обрабатывать пустую ячейку как пустую (""). но на самом деле явно пустая ячейка таблицы Word содержит два невидимых символа (по крайней мере, в слове 2007), то есть chr(13) & Chr(7). его можно проверить с помощью простого оператора, например

MsgBox Len(.Cell(1, 1).Range.Text)
MsgBox Asc(Right(.Cell(1, 1).Range.Text, 1))
MsgBox Asc(Left(.Cell(1, 1).Range.Text, 1))

поэтому, чтобы ваш код работал, его можно изменить на что-то вроде

Sub merge()
Dim x As Integer, i As Integer, S As String
x = ActiveDocument.Tables(1).Rows.Count
    With ActiveDocument.Tables(1)
      For i = 1 To x
      S = .Cell(i, 2).Range.Text
      S = Replace(S, Chr(13), "")
      S = Replace(S, Chr(7), "")
            If S = "" Then
            .Cell(Row:=i, Column:=2).merge _
            MergeTo:=.Cell(Row:=i, Column:=3)
            .Borders.Enable = False
            End If
      Next i
    End With
End Sub

или тестовая строка может быть изменена на

If Len(.Cell(i, 2).Range.Text) = 2 Then

также не мог понять, почему в вашем коде вы повторяете ActiveDocument.Tables(1).Rows.Count+1, поэтому для тестирования я использовал только For i = 1 To x

person Ahmed AU    schedule 11.04.2019

Попробуйте изменить:

If .Cell(i, 2).Range.Text = "" Then

to:

If Split(.Cell(i, 2).Range.Text,vbCr)(0) = "" Then
person macropod    schedule 13.04.2019