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

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

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

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

Задача:
Объединить по вертикали несколько ячеек таблицы в файле 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

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

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

    TopList