hexadecimal, ваш код нелогично работает, хотя и работает.
В этом случае:
Visual Basic | ||
|
диапазон «rngTbl» содержит ячейки от второй ячейки в четвёртом столбце до третьей ячейки (включительно) в чётвёртом столбце. Т.е. вы думаете, что работаете с двумя ячейками, а задействуете девять ячеек. Это можно проверить, если узнать количество ячеек с помощью команды:
Visual Basic | ||
|
Я не буду вникать, в чём ошибка, которая у вас появляется, а предложу свой вариант (код просто показывает принцип):
Кликните здесь для просмотра всего текста
Visual Basic | ||
|
Примечание
В некоторых случаях, когда в таблице есть объединённые ячейки, нельзя обратиться к ячейке по номеру строки и столбца: 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
16.08.13 — 11:23
есть com word,стоки в таблицу добавлять могу, но не могу добавить строки (ячейки) только в одну колонку, а другие оставлять без изменений, есть идея добавлять строку и не нужные колонки объеденять… как это делается через ком, кто знает?
1 — 16.08.13 — 11:24
На фига ветки плодить….
2 — 16.08.13 — 11:24
я знаю, как это делаится чериз макрозы
3 — 16.08.13 — 11:26
(2) с этим вообще не работал, долго осваивать?
4 — 16.08.13 — 11:30
(3) пара кликов
5 — 16.08.13 — 11:34
(4) расскажи пжлста
6 — 16.08.13 — 11:44
блин неужели не формируете из 1с серьезные Word документы?
7 — 16.08.13 — 11:47
(5) макросы — запись макроса
макросы — изменить
8 — 16.08.13 — 11:52
(7) а код какой по объединению?
9 — 16.08.13 — 11:57
(8) то, что ты увидишь в записи макроса. Вот этот код адаптируешь под ком.
10 — 16.08.13 — 12:04
(9) а как найти именно этот макрос
11 — 16.08.13 — 12:06
кнопка изменить к тому же не активна
12 — 16.08.13 — 12:08
(10) ну ты ваще
перед записью можно задать имя макроса, задай по имени и найдешь потом…
13 — 16.08.13 — 12:15
так какой код то? (4) (2)
14 — 16.08.13 — 12:16
(13) такой код — который получился при записи макроса «имя_макроса»
15 — 16.08.13 — 12:18
(14) да я не о том, как вообще выглядит программный код макроса объеденяющий ячейки?
16 — 16.08.13 — 12:20
(15) запишешь — узнаешь
17 — 16.08.13 — 12:27
(15) вот например код макроса который пишет твой ник:
я задал перед записью ему-макросу имя Domanoff26, потом по имени нашел его, вытащил код скопировал и вставил сюда:
Sub Domanoff26()
'
' Domanoff26 Макрос
'
'
Application.Keyboard (1033)
Selection.TypeText Text:="domanoff26"
End Sub
18 — 16.08.13 — 15:51
а кто знает как через ком определить набор ячеек,Cell(4,1) — это одна ячейка, а несколько?
19 — 16.08.13 — 15:54
макрос для выделеных ячеек вот такой Selection.Cells.Merge, но как получитьь этот Selection для ком?
20 — 16.08.13 — 15:56
(18) Это — не одна ячейка, а диапазон из одной ячейки.
21 — 16.08.13 — 15:58
(20) вот как его для ком задать?
22 — 16.08.13 — 16:01
(21) Range
23 — 16.08.13 — 16:02
(22) fа номера ячеек то куда вставлять? ну те есть сам диапазон как проставлять?
24 — 16.08.13 — 16:03
(23) ты думать будешь? или хотя бы читать
25 — 16.08.13 — 16:08
я понял что range , только для екселя вижу синтаксис в сети, для ворда не понимаю как начальную и конечную ячейку задавать
26 — 16.08.13 — 16:15
(25) логично было б подумать, что диапазон задаётся для вордовской таблицы?
27 — 16.08.13 — 16:15
28 — 16.08.13 — 16:38
(26) это понятно я не могу найти для вордовской
29 — 16.08.13 — 16:39
(27) а для таблицы нету в этой ссылке ничего
30 — 16.08.13 — 16:44
(29) Range в Word задаётся начальной и конечной позициями.
Их извлекаете из Cell(i,j) как Start и End.
Ну а как получили Range (назовём его r) — то и говорите ему
r.Cells.Merge();
31 — 16.08.13 — 16:46
Docum.Range(табл.Cell(1,1).Range.Start, табл.Cell(1,2).Range.End) вот так? (30)
32 — 16.08.13 — 16:47
это диапазон.
33 — 16.08.13 — 16:52
(32) Наверное (если всему всё правильно присвоено).
и к нему теперь — .Cells.Merge()
34 — 16.08.13 — 16:54
(33) при определние диапазона пишет ошибку на cell
35 — 16.08.13 — 16:58
(34) Ну, значит, не всё всему правильно присвоено.
(Оно же не просто «ошибку на cell» пишет, оно пишет и в чём состоит ошибка).
36 — 16.08.13 — 17:14
(35) спасибо
37 — 19.08.13 — 09:56
а как скопировать строку или диапазон ячеек например, никто не подскажет?
38 — 19.08.13 — 10:00
записать макрос и посмотреть, как оно это делает?
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
не очень понимаю. как это на коме будет написано
40 — 19.08.13 — 10:10
(39) копирование не вижу, вставку вижу
41 — 19.08.13 — 10:15
(40) а как копировать чтоб в макросе отразилась, я контрл ц нажимал и эта операция не отразилась(
42 — 19.08.13 — 10:27
вообще не понимаю как получить этот Selection в коме, может тут надо использовать Range?
43 — 19.08.13 — 10:38
Word = Новый COMОбъект(«Word.Application»);
Text = Word.selection;
а дальше
Text.EndKey();
Text.Paste();
и тп.
44 — 19.08.13 — 10:43
Selection.MoveRight Unit:=wdCharacter, Count:=2, Extend:=wdExtend
Selection.EscapeKey
Selection.Cells.Merge
45 — 19.08.13 — 10:50
(43) сдесьбудет весь объект как selection? мне нужна только часть таблицы
46 — 19.08.13 — 10:51
(44) а в КОМе как это все выглядит?
47 — 19.08.13 — 11:50
ну подскажите как в коме все таки строчку скопировать
48 — 19.08.13 — 11:57
(47) Word — Сервис — Редактор Visual Basic.
F2 — и смотришь значения констант (например, wdLine — это число 5).
Вызовы методов. В отличие от VBA — параметры надо в скобки брать. И — нет именованных параметров, то есть, Unit:= — не надо писать.
Порядок параметров и их количество — смотришь, к примеру, в MSDN. Или во встроенной справке Word Basic.
49 — 19.08.13 — 12:59
(48) не могу найти этот selection
табл.Rows(2).range().copy(); — вот это вроде работает, а как ее правильно вставить?
50 — 19.08.13 — 13:08
(49) Метод Select использовать — он вернёт Selection. Дальше над ней можно поиздеваться (особенно если ячейки по столбцам объединять надо).
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(диап);
почему вот это всталяет не сам диапазон а текст диапазона в последнюю ячейку, что то забыл?
52 — 19.08.13 — 14:18
(51) Потому что InsertAfter «inserts the specified _text_ at the end of a range or selection»?
53 — 19.08.13 — 15:25
(52)согласен, какой для ячеек метод ? не могу найти
54 — 19.08.13 — 15:30
(53) Поясни задачу. Если я правильно понял — то есть таблица Word, в ней надо объединить несколько ячеек. Но сейчас почему-то вопросы по копированию. Так что нужно — копировать или объединять?
55 — 19.08.13 — 15:45
(54) объеденять научился, хочу понять как копировать
56 — 19.08.13 — 15:46
Docum.Range(табл.Cell(3,1).Range.Start, табл.Cell(3,4).Range.End).select() — Selection не получается, в отладчике неопределено
57 — 19.08.13 — 15:47
вообще хочу копировать блоки таблиц и вставлять в определенные места
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();
59 — 19.08.13 — 16:13
(58) пара минут назад до самого дошло но спсаибо
60 — 19.08.13 — 16:17
(58) а вот заполнение только каждую ячейку отдельно? т е по по cell(номерстроки,номерколонки) или мложно как нить более удобно?
61 — 19.08.13 — 16:23
я могу в созданную ячейку добавлять параметр Variables, чтоб потом через Docum.Variables.Item(имяпараметра).Value заполнять таблицу
62 — 19.08.13 — 16:46
(60) А чем плохо пройти циклом — и записать нужные значения?
(61) В принципе, у Cell есть метод Formula — можно не только переменную вставить.
63 — 20.08.13 — 10:36
(62) а не знаешь, я вот ввожу строку с символами.пс, а в ворде оно отображается как в одну строку просто ссимволом
квадратика, как его реально на новую строку переносить?
64 — 20.08.13 — 11:15
(63) Начать новый абзац — это InsertParagraph
Начать новую строку — это InsertBreak(11).
65 — 20.08.13 — 16:09
Docum.Range(табл.Cell(1,1).Range.Start, табл.Cell(1,4).Range.End); выделяет я так понял ячейки идя слева на право и вниз. а как выделить две строки одно колонки например в диапазон? (54)
66 — 20.08.13 — 16:23
(66) Воспользоваться методом Merge объекта Cell. Например:
табл.Cell(1,1).Merge(табл.Cell(2,3));
Параметр — ячейка, по какую объединять.
67 — 21.08.13 — 09:21
(66) спасибо, мир не без вас)
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 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
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 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; тогда должно заработать. Удачи!