Vba word объединение ячеек таблицы

hexadecimal, ваш код нелогично работает, хотя и работает.

В этом случае:

Visual Basic
1
2
    Set rngTbl = tbl.Cell(2, 4).Range
    rngTbl.End = tbl.Cell(3, 4).Range.End

диапазон «rngTbl» содержит ячейки от второй ячейки в четвёртом столбце до третьей ячейки (включительно) в чётвёртом столбце. Т.е. вы думаете, что работаете с двумя ячейками, а задействуете девять ячеек. Это можно проверить, если узнать количество ячеек с помощью команды:

Visual Basic
1
rngTbl.Cells.Count

Я не буду вникать, в чём ошибка, которая у вас появляется, а предложу свой вариант (код просто показывает принцип):

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Procedure_4()
 
    Dim myTextFrame As Word.TextFrame
    Dim myTable As Word.Table
    
    Set myTextFrame = ActiveDocument.Shapes(1).TextFrame
    
    Set myTable = myTextFrame.TextRange.Tables(1)
    
    myTable.Cell(2, 1).Merge MergeTo:=myTable.Cell(3, 1)
    
End Sub

Примечание

В некоторых случаях, когда в таблице есть объединённые ячейки, нельзя обратиться к ячейке по номеру строки и столбца: Cell(2, 1). Нужно что-то другое придумывать.

I finally got this worked out, and I want to again thank you for your help. Here is my current code. The entire document is one two-column table, skinny, and includes hyperlinks so that it can be read and navigated on an iPhone. When a Unit value changes in the data, I want to 1) insert a new row below and merge it into one column, add a ‘Go Home’ link, then continue adding two-column rows.

The document is finally converted to a .PDF and accessed by iOS users.

    'Add a row for a 'back to home' link 
    If (intUnitOrder > intCurrentUnit) Then
       Selection.InsertRowsBelow (1)
       rowno = Selection.Information(wdEndOfRangeRowNumber) - 1
       With ActiveDocument.Tables(1)
         .Cell(Row:=rowno, Column:=1).Merge MergeTo:=.Cell(Row:=rowno, _ 
         Column:=2)
       End With

       Selection.Tables(1).Rows(rowno).Range.ParagraphFormat. _
         Alignment = wdAlignParagraphRight
       Selection.Shading.BackgroundPatternColor = RGB(230, 230, 230)
       Selection.Font.ColorIndex = wdBlue
       Selection.Font.Italic = True

       ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, _
         Address:="#Home", SubAddress:="", _
         ScreenTip:="Go back to the top", _
         TextToDisplay:="back to Home"

       Selection.MoveDown wdLine, 1
       intCurrentUnit = intUnitOrder
    End If

Neuromancer
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 08.05.2008 (Чт) 16:08

Объединение ячеек в таблице Word

Задача:

Объединить по вертикали несколько ячеек таблицы в файле Word.

Код: Выделить всё
Dim wrdApp1 As Word.Application
Dim wrdDoc As Word.Document
Dim sel As Selection

Set wrdApp1 = CreateObject("Word.Application")
Set wrdDoc = wrdApp1.Documents.Open("Шаблон1.doc")
wrdDoc.Tables(1).Rows(2).Cells(1).Select
Set sel = wrdApp1.Selection
With sel
  .MoveDown Unit:=wdLine, count:=1, Extend:=wdExtend
  .Range.Cells.Merge
End With

Что неверно ? Ячейки выделяются, но не объединяются.


Neuromancer
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 08.05.2008 (Чт) 16:08

Сообщение Neuromancer » 08.05.2008 (Чт) 16:58

Разобрался.

.Cells.Merge вместо Range.Cells.Merge и все работает.

Сорри за беспокойство.


Neuromancer
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 08.05.2008 (Чт) 16:08

Сообщение Neuromancer » 11.05.2008 (Вс) 21:19

Теперь столкнулся с новой проблемой.

Выделил ячейки, объединил. Теперь хочу объединить в другом столбце, но любое действие с таблицей вызывает ошибку.

Код: Выделить всё
Dim wrdApp1 As Word.Application
Dim wrdDoc As Word.Document
Dim sel As Selection

Set wrdApp1 = CreateObject("Word.Application")
Set wrdDoc = wrdApp1.Documents.Open("Шаблон1.doc")
wrdDoc.Tables(1).Rows(2).Cells(1).Select
Set sel = wrdApp1.Selection
With sel
  .MoveDown Unit:=wdLine, count:=1, Extend:=wdExtend
  .Range.Cells.Merge
End With
wrdDoc.Tables(1).Rows(2).Cells(2).Select

Последняя строка вызывает ошибку, как и любое другое действи с ячейками.

Как снять выделение, чтобы можно было что то делать дальше в таблице ?

Спасибо.


Neuromancer
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 08.05.2008 (Чт) 16:08

Сообщение Neuromancer » 05.06.2008 (Чт) 12:08

Через «Add Watch..» обратил внимание на поле Last объекта Table. Там написано «В таблице есть объеденения по вертикали, поэтому доступ к отдельным строкам запрещен». В документации или в help я этого нигде не нашел. Задачу решил выделением строки поячеечно.

Пишу тем кто возможно столкнется с похожей проблемой.

Код: Выделить всё
wrdDoc.Tables(1).Cell(tbl.Rows.count, 1).Select
Set sel = tbl.Application.Selection
With sel
    .MoveEnd Unit:=wdColumn, count:=17
    .Cells.Delete
End With

Вопрос снят.


Vlassoff
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 06.06.2008 (Пт) 13:55

Сообщение Vlassoff » 06.06.2008 (Пт) 14:06

На самом деле, после того как ячейки обеденены, имеется доступ только к первой ячейке, то есть в таблице 3Х3 при объеденение ячеек и использовании следующей конструкции

Код: Выделить всё
Table(1).Cell.Next
debug.print Selection.Information(wdStartOfRangeRowNumber)
debug.print Selection.Information(wdStartOfRangeColumnNumber)

несколько раз выдается значение одного и того же столбца и строки. т.е. ячейки как бы есть, но адрес у ни — только первой ячейки…


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.06.2008 (Пт) 14:25

Это потому что таблицы в Word отличаются от таблиц в Excel. В Word это скорее списки, чем таблицы, и в случае объединения нескольких ячеек «внутренних» ячеек действительно не существует. Остается только одна ячейка, по высоте и ширине равная объедененным.

Lasciate ogni speranza, voi ch’entrate.


Vlassoff
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 06.06.2008 (Пт) 13:55

Сообщение Vlassoff » 06.06.2008 (Пт) 14:36

Но при методе Table(1).Cell.Next они как-бы существуют в качестве ссылок на первую из объедененных ячеек. ..


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.06.2008 (Пт) 14:50

Хм… У меня при Selection.Cells(1).Next.Select выбралась следующая ячейка, а не текущая.

Возможно, что тогда там имеется что-то вроде атрибута colspan таблиц HTML.

Lasciate ogni speranza, voi ch’entrate.


Vlassoff
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 06.06.2008 (Пт) 13:55

Сообщение Vlassoff » 06.06.2008 (Пт) 16:24

alibek писал(а):Хм… У меня при Selection.Cells(1).Next.Select выбралась следующая ячейка, а не текущая.
Возможно, что тогда там имеется что-то вроде атрибута colspan таблиц HTML.

Я в цикле атрибуты ячеек выводил. Количесто ячеек:

Код: Выделить всё
Sub АтрибутыЯчеек()

Set Таб = Selection.Tables(1)

k = 1

Строк = Таб.Rows.Count

Столбец = Таб.Columns.Count

Таб.Cell(1, 1).Range.Select

Debug.Print "Строк: "; Строк

Debug.Print "Столбцов: "; Столбец

For i = 1 To Строк

For j = 1 To Столбец

Debug.Print "(" & Selection.Information(wdStartOfRangeRowNumber) & ";" & Selection.Information(wdStartOfRangeColumnNumber) & ")";

If Not ((i = Строк) And (j = Столбец)) Then Selection.MoveRight Unit:=wdCell

Next j

Debug.Print

Next i

End Sub

Вот что получалось. Певый массив до объеденения. Второй после.

Код: Выделить всё
Строк:  4
Столбцов:  4
(1;1)(1;2)(1;3)(1;4)
(2;1)(2;2)(2;3)(2;4)
(3;1)(3;2)(3;3)(3;4)
(4;1)(4;2)(4;3)(4;4)
Строк:  4
Столбцов:  4
(1;1)(1;2)(1;3)(1;4)
(1;1)(2;2)(2;3)(2;4)
(1;1)(3;2)(3;3)(3;4)
(4;1)(4;2)(4;3)(4;4)

Можете попробовать!!! :P


Neuromancer
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 08.05.2008 (Чт) 16:08

Сообщение Neuromancer » 02.07.2008 (Ср) 15:41

Vlassoff писал(а):На самом деле, после того как ячейки обеденены, имеется доступ только к первой ячейке, то есть в таблице 3Х3 при объеденение ячеек и использовании следующей конструкции

Код: Выделить всё
Table(1).Cell.Next
debug.print Selection.Information(wdStartOfRangeRowNumber)
debug.print Selection.Information(wdStartOfRangeColumnNumber)

несколько раз выдается значение одного и того же столбца и строки. т.е. ячейки как бы есть, но адрес у ни — только первой ячейки…

Проблема была в другом. Я объединял ячейки в одной строке или столбце, после этого добавлял новые строки, и уже в них не мог обращаться к строке таблицы. Пришлось перейти к обращению вида Cell(x,y). Как я понял, объединив в таблице ячейки один раз, я теряю возможность обращаться к элементам таблицы через Column(i) или Row(i), что мне кажется странным.

Все свои проблемы я решил :)

Даже научился объединять ячейки в столбце при переходе на новую страницу. Для справки, если я пытаюсь объединить ячейки в столбце и конец объединения попадает на следующую страницу, то я получаю ошибку. Так что надо отслеживать этот момент и объединять до конца текущей страницы и с начала следующей до конца. Кому интересно могу написать сюда пример кода.



Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Формулировка задачи:

С помощью макроса добавляю таблицу в TextBox на страницу.
Дальше пытаюсь объединить ячейки.
В столбцах отличных от первого ячейки объединяются. В первом столбце появляется ошибка «Запрашиваемый номер семейства не существует»
Макрос

Подскажите, в чем ошибка.

Такой вариант работает.
Выделение происходит правильно.
Только ошибка все равно непонятная.

Код к задаче: «Word: объединение ячеек таблицы»

textual

Sub Procedure_4()
 
    Dim myTextFrame As Word.TextFrame
    Dim myTable As Word.Table
    
    Set myTextFrame = ActiveDocument.Shapes(1).TextFrame
    
    Set myTable = myTextFrame.TextRange.Tables(1)
    
    myTable.Cell(2, 1).Merge MergeTo:=myTable.Cell(3, 1)
    
End Sub

Полезно ли:

5   голосов , оценка 4.000 из 5

Код:

procedure TForm1.Button1Click(Sender: TObject);
var word,count,n,Unit_,extend :OleVariant;
begin

  n:=’C:document1.doc’;

      Unit_:=wdCharacter;
    extend:= wdExtend;
    count:=2;

    WordApplication1.Documents.Open(n,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,
    emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,
    emptyparam,emptyparam,);
    WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
    WordApplication1.Selection.MoveRight(unit_,count,extend);
    WordApplication1.Selection.Cells.Merge;

end;

вот так вот у меня нормально работает объединение ячеек…вощем в конце попробуй добавить doc.ActiveWindow.selection.cells.merge; тогда должно заработать. Удачи!

Для разработчиков кода 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

Like this post? Please share to your friends:
  • Vba word обновить оглавление
  • Vba word при открытии документа
  • Vba word обновить все поля
  • Vba word последняя строка таблицы
  • Vba word нумерация страниц