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
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Cell.Merge method (Word) |
vbawd10.chm156106956 |
vbawd10.chm156106956 |
word |
Word.Cell.Merge |
79d929bd-9578-e937-405f-8ad970ae883c |
06/08/2017 |
medium |
Cell.Merge method (Word)
Merges the specified table cell with another table cell. The result is a single table cell.
Syntax
expression.Merge (MergeTo)
expression Required. A variable that represents a ‘Cell’ object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
MergeTo | Required | Cell object | The cell to be merged with. |
Example
This example merges the first two cells in table one in the active document with one another and then removes the table borders.
If ActiveDocument.Tables.Count >= 1 Then With ActiveDocument.Tables(1) .Cell(Row:=1, Column:=1).Merge _ MergeTo:=.Cell(Row:=1, Column:=2) .Borders.Enable = False End With End If
See also
Cell Object
[!includeSupport and feedback]
- Remove From My Forums
-
Question
-
Hello,
I’m trying to merge table using c#, I tried several code but no use…
I Tried
—————-
table.Cell(rowIndex, coloumnIndex).Range.Select();
oWord.Selection.MoveUp(ref moveUnit, ref moveCount, ref moveExtend);
oWord.Selection.Cells.Merge();it generated error when there was cell in a row that contained many data
—————Then I tried:
object startLocation = table.Cell(startIndex, coloumnIndex);
object endLocation = table.Cell(endIndex, coloumnIndex);
Word.Range mergeRange = oDoc.Range(ref startLocation, ref endLocation);
mergeRange.Select();
mergeRange.Cells.Merge();It did nothing…
—————
Finally I tried
table.Rows[endIndex].Cells[1].Merge(table.Rows[startIndex].Cells[1]);
it merged 1st column, but when i tried to merge the other columns it said «Cannot access individual rows in this collection because the table has vertically merged cells.»
—————
any help… ?
Thanks in advance…
Answers
-
Hi 3y3y
OK, here’s some sample code (in VBA, because that’s fastest to test) that bascially does what I understand you need. I don’t think you should have any problems converting this to C#.
Basically, what it does is get the number of rows and divide by 4 (the number of cells to be merged vertically). This is the outside loop. The inside loop is the number of columns.
Since Word doesn’t really like to work with row/column indexes when it contains merged cells, about the only way you can do this is to «walk» the cells. I’m using the Cell object, rather than the Cells object because that allows me to set the size of
cell range I want to merge (MergeTo parameter).Sub Merge4RowsPerCol() Dim tbl As word.Table Dim cel As word.Cell Dim rowIndex As Long, colIndex As Long, i As Long, r As Long Set tbl = ActiveDocument.Tables(1) colIndex = tbl.Columns.Count rowIndex = tbl.Rows.Count / 4 For r = 1 To rowIndex For i = 1 To colIndex Set cel = tbl.Cell(r, i) cel.Merge MergeTo:=tbl.Cell(cel.rowIndex + 3, i) Next i Next r End Sub
Cindy Meister, VSTO/Word MVP
-
Marked as answer by
Thursday, December 23, 2010 11:46 AM
-
Marked as answer by
-
Thanksssssssss Cindy
It worked really appreciated
anyway I’ll put the code for anyone who might face same problem
private void MergeTable(Word.Table table) { Word.Cell cell; int rowIndex = 2; //Starting of 2 row to ignore first row int blockIndex = (table.Rows.Count - 1) / 4; //Block of 4 rows to be merged and -1 to ignore first row in the table int coloumnIndex = 4; //Selecting first 4 coloums for (int blockCounter = 1; blockCounter < blockIndex; blockCounter++) { for (int colCounter = 1; colCounter <= coloumnIndex; colCounter++) { cell = table.Cell(rowIndex, colCounter); cell.Merge(table.Cell(cell.RowIndex + 3, colCounter)); } rowIndex += 4; //Updated rowIndex to the start of the next 4 rows } }
-
Marked as answer by
3y3y
Sunday, December 26, 2010 6:40 AM
-
Marked as answer by
hexadecimal, ваш код нелогично работает, хотя и работает.
В этом случае:
Visual Basic | ||
|
диапазон «rngTbl» содержит ячейки от второй ячейки в четвёртом столбце до третьей ячейки (включительно) в чётвёртом столбце. Т.е. вы думаете, что работаете с двумя ячейками, а задействуете девять ячеек. Это можно проверить, если узнать количество ячеек с помощью команды:
Visual Basic | ||
|
Я не буду вникать, в чём ошибка, которая у вас появляется, а предложу свой вариант (код просто показывает принцип):
Кликните здесь для просмотра всего текста
Visual Basic | ||
|
Примечание
В некоторых случаях, когда в таблице есть объединённые ячейки, нельзя обратиться к ячейке по номеру строки и столбца: Cell(2, 1). Нужно что-то другое придумывать.
- Neuromancer
- Начинающий
- Сообщения: 8
- Зарегистрирован: 08.05.2008 (Чт) 16:08
Объединение ячеек в таблице Word
Задача:
Объединить по вертикали несколько ячеек таблицы в файле Word.
- Код: Выделить всё
Dim wrdApp1 As Word.Application
Dim wrdDoc As Word.Document
Dim sel As SelectionSet 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 SelectionSet 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.SelectDebug.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 iEnd 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)
Можете попробовать!!!
- 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
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0