Макрос объединить ячейки 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

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

С помощью макроса добавляю таблицу в 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

   Domanoff26

16.08.13 — 11:23

есть com word,стоки в таблицу добавлять могу, но не могу добавить строки (ячейки) только в одну колонку, а другие оставлять без изменений, есть идея добавлять строку и не нужные колонки объеденять… как это делается через ком, кто знает?

   Масянька

1 — 16.08.13 — 11:24

На фига ветки плодить….

   Wobland

2 — 16.08.13 — 11:24

я знаю, как это делаится чериз макрозы

   Domanoff26

3 — 16.08.13 — 11:26

(2) с этим вообще не работал, долго осваивать?

   Wobland

4 — 16.08.13 — 11:30

(3) пара кликов

   Domanoff26

5 — 16.08.13 — 11:34

(4) расскажи пжлста

   Domanoff26

6 — 16.08.13 — 11:44

блин неужели не формируете из 1с серьезные Word документы?

   Wobland

7 — 16.08.13 — 11:47

(5) макросы — запись макроса

макросы — изменить

   Domanoff26

8 — 16.08.13 — 11:52

(7) а код какой по объединению?

   Новенький_2009

9 — 16.08.13 — 11:57

(8) то, что ты увидишь в записи макроса. Вот этот код адаптируешь под ком.

   Domanoff26

10 — 16.08.13 — 12:04

(9) а как найти именно этот макрос

   Domanoff26

11 — 16.08.13 — 12:06

кнопка изменить к тому же не активна

   manyak

12 — 16.08.13 — 12:08

(10) ну ты ваще :)

перед записью можно задать имя макроса, задай по имени и найдешь потом…

   Domanoff26

13 — 16.08.13 — 12:15

так какой код то? (4) (2)

   manyak

14 — 16.08.13 — 12:16

(13) такой код — который получился при записи макроса «имя_макроса»

   Domanoff26

15 — 16.08.13 — 12:18

(14) да я не о том, как вообще выглядит программный код макроса объеденяющий ячейки?

   Wobland

16 — 16.08.13 — 12:20

(15) запишешь — узнаешь

   manyak

17 — 16.08.13 — 12:27

(15) вот например код макроса который пишет твой ник:

я задал перед записью ему-макросу  имя Domanoff26, потом по имени нашел его, вытащил код скопировал и вставил сюда:

Sub Domanoff26()
'
' Domanoff26 Макрос
'
'
    Application.Keyboard (1033)
    Selection.TypeText Text:="domanoff26"
End Sub
   Domanoff26

18 — 16.08.13 — 15:51

а кто знает как через ком определить набор ячеек,Cell(4,1) — это одна ячейка, а несколько?

   Domanoff26

19 — 16.08.13 — 15:54

макрос для выделеных ячеек вот такой  Selection.Cells.Merge, но как получитьь этот  Selection для ком?

   Rie

20 — 16.08.13 — 15:56

(18) Это — не одна ячейка, а диапазон из одной ячейки.

   Domanoff26

21 — 16.08.13 — 15:58

(20) вот как его для ком задать?

   Rie

22 — 16.08.13 — 16:01

(21) Range

   Domanoff26

23 — 16.08.13 — 16:02

(22) fа номера ячеек то куда вставлять? ну те есть сам диапазон как проставлять?

   Wobland

24 — 16.08.13 — 16:03

(23) ты думать будешь? или хотя бы читать

   Domanoff26

25 — 16.08.13 — 16:08

я понял что range , только для екселя вижу синтаксис в сети, для ворда не понимаю как начальную и конечную ячейку задавать

   Wobland

26 — 16.08.13 — 16:15

(25) логично было б подумать, что диапазон задаётся для вордовской таблицы?

   Rie

27 — 16.08.13 — 16:15

   Domanoff26

28 — 16.08.13 — 16:38

(26) это понятно я не могу найти для вордовской

   Domanoff26

29 — 16.08.13 — 16:39

(27) а для таблицы нету в этой ссылке ничего

   Rie

30 — 16.08.13 — 16:44

(29) Range в Word задаётся начальной и конечной позициями.

Их извлекаете из Cell(i,j) как Start и End.

Ну а как получили Range (назовём его r) — то и говорите ему

r.Cells.Merge();

   Domanoff26

31 — 16.08.13 — 16:46

Docum.Range(табл.Cell(1,1).Range.Start, табл.Cell(1,2).Range.End) вот так? (30)

   Domanoff26

32 — 16.08.13 — 16:47

это диапазон.

   Rie

33 — 16.08.13 — 16:52

(32) Наверное (если всему всё правильно присвоено).

и к нему теперь — .Cells.Merge()

   Domanoff26

34 — 16.08.13 — 16:54

(33) при определние диапазона пишет ошибку на cell

   Rie

35 — 16.08.13 — 16:58

(34) Ну, значит, не всё всему правильно присвоено.

(Оно же не просто «ошибку на cell» пишет, оно пишет и в чём состоит ошибка).

   Domanoff26

36 — 16.08.13 — 17:14

(35) спасибо

   Domanoff26

37 — 19.08.13 — 09:56

а как скопировать строку или диапазон ячеек например, никто не подскажет?

   Wobland

38 — 19.08.13 — 10:00

записать макрос и посмотреть, как оно это делает?

   Domanoff26

39 — 19.08.13 — 10:06

(38)  Selection.MoveRight Unit:=wdCharacter, Count:=2, Extend:=wdExtend

    Selection.MoveUp Unit:=wdLine, Count:=2

    Selection.MoveDown Unit:=wdLine, Count:=1

    Selection.MoveRight Unit:=wdCharacter, Count:=20, Extend:=wdExtend

    Selection.InsertRowsBelow 4

    Selection.Paste  

не очень понимаю. как это на коме будет написано

   Wobland

40 — 19.08.13 — 10:10

(39) копирование не вижу, вставку вижу

   Domanoff26

41 — 19.08.13 — 10:15

(40) а как копировать чтоб в макросе отразилась, я контрл ц нажимал и эта операция не отразилась(

   Domanoff26

42 — 19.08.13 — 10:27

вообще не понимаю как получить этот Selection в коме, может тут надо использовать Range?

   bborisko

43 — 19.08.13 — 10:38

Word = Новый COMОбъект(«Word.Application»);

Text = Word.selection;

а дальше

Text.EndKey();

Text.Paste();

и тп.

   djekting

44 — 19.08.13 — 10:43

Selection.MoveRight Unit:=wdCharacter, Count:=2, Extend:=wdExtend

    Selection.EscapeKey

    Selection.Cells.Merge

   Domanoff26

45 — 19.08.13 — 10:50

(43) сдесьбудет весь объект как selection? мне нужна только часть таблицы

   Domanoff26

46 — 19.08.13 — 10:51

(44) а в КОМе как это все выглядит?

   Domanoff26

47 — 19.08.13 — 11:50

ну подскажите как в коме все таки строчку скопировать

   Rie

48 — 19.08.13 — 11:57

(47) Word — Сервис — Редактор Visual Basic.

F2 — и смотришь значения констант (например, wdLine — это число 5).

Вызовы методов. В отличие от VBA — параметры надо в скобки брать. И — нет именованных параметров, то есть, Unit:= — не надо писать.

Порядок параметров и их количество — смотришь, к примеру, в MSDN. Или во встроенной справке Word Basic.

   Domanoff26

49 — 19.08.13 — 12:59

(48) не могу найти этот selection

табл.Rows(2).range().copy(); — вот это вроде работает, а как ее правильно вставить?

   Rie

50 — 19.08.13 — 13:08

(49) Метод Select использовать — он вернёт Selection. Дальше над ней можно поиздеваться (особенно если ячейки по столбцам объединять надо).

   Domanoff26

51 — 19.08.13 — 14:08

(50) диап = Docum.Range(табл.Cell(3,1).Range.Start, табл.Cell(3,4).Range.End);

    //Docum.Range(табл.Cell(1,1).Range.Start, табл.Cell(1,4).Range.End);

      //  табл.Rows(13).range().InsertAfter(диап);

        табл.range().InsertAfter(диап);

почему вот это всталяет не сам диапазон а текст диапазона в последнюю ячейку, что то забыл?

   Rie

52 — 19.08.13 — 14:18

(51) Потому что InsertAfter «inserts the specified _text_ at the end of a range or selection»?

   Domanoff26

53 — 19.08.13 — 15:25

(52)согласен, какой для ячеек метод ? не могу найти

   Rie

54 — 19.08.13 — 15:30

(53) Поясни задачу. Если я правильно понял — то есть таблица Word, в ней надо объединить несколько ячеек. Но сейчас почему-то вопросы по копированию. Так что нужно — копировать или объединять?

   Domanoff26

55 — 19.08.13 — 15:45

(54) объеденять научился, хочу понять как копировать

   Domanoff26

56 — 19.08.13 — 15:46

Docum.Range(табл.Cell(3,1).Range.Start, табл.Cell(3,4).Range.End).select() — Selection не получается, в отладчике неопределено

   Domanoff26

57 — 19.08.13 — 15:47

вообще хочу копировать блоки таблиц и вставлять в определенные места

   Rie

58 — 19.08.13 — 16:06

(57) Простейший вариант — через буфер обмена.

Например, в твоей таблице скопировать ячейку (3,3) в ячейку (3,4):

Docum.Range(табл.Cell(3,3).Range.Start, табл.Cell(3,3).Range.End).Copy();

Docum.Range(табл.Cell(3,4).Range.Start, табл.Cell(3,4).Range.End).Paste();

   Domanoff26

59 — 19.08.13 — 16:13

(58) пара минут назад до самого дошло но спсаибо

   Domanoff26

60 — 19.08.13 — 16:17

(58) а вот заполнение только каждую ячейку отдельно? т е по по cell(номерстроки,номерколонки) или мложно как нить более удобно?

   Domanoff26

61 — 19.08.13 — 16:23

я могу в созданную ячейку добавлять параметр Variables, чтоб потом через Docum.Variables.Item(имяпараметра).Value заполнять таблицу

   Rie

62 — 19.08.13 — 16:46

(60) А чем плохо пройти циклом — и записать нужные значения?

(61) В принципе, у Cell есть метод Formula — можно не только переменную вставить.

   Domanoff26

63 — 20.08.13 — 10:36

(62) а не знаешь, я вот ввожу строку с символами.пс, а в ворде оно отображается как в одну строку просто ссимволом

квадратика, как его реально на новую строку переносить?

   Rie

64 — 20.08.13 — 11:15

(63) Начать новый абзац — это InsertParagraph

Начать новую строку — это InsertBreak(11).

   Domanoff26

65 — 20.08.13 — 16:09

Docum.Range(табл.Cell(1,1).Range.Start, табл.Cell(1,4).Range.End); выделяет я так понял ячейки идя слева на право и вниз. а как выделить две строки одно колонки например в диапазон? (54)

   Rie

66 — 20.08.13 — 16:23

(66) Воспользоваться методом Merge объекта Cell. Например:

табл.Cell(1,1).Merge(табл.Cell(2,3));

Параметр — ячейка, по какую объединять.

   Domanoff26

67 — 21.08.13 — 09:21

(66) спасибо, мир не без вас)

   Domanoff26

68 — 21.08.13 — 09:46

(66) а не подскажите как добавлять колонку в определенную строку, чтоб не объеденять потом все строки?

  

Domanoff26

69 — 21.08.13 — 09:57

все отпало нашел

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

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

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

Код:

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
  • Макрос очистки диапазона ячеек excel
  • Макрос объединить все файлы в один excel
  • Макрос поиска в excel по первым буквам
  • Макрос отправки на печать excel