Vba word table merge cell

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

  • 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

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). Нужно что-то другое придумывать.

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

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

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

Like this post? Please share to your friends:
  • Vba word selection wholestory
  • Vba word закрыть приложение
  • Vba word selection text
  • Vba word закрыть документ без сохранения
  • Vba word selection paste