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
- 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
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Формулировка задачи:
С помощью макроса добавляю таблицу в 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
Код:
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 VBA это общая концептуальная проблема, мы привыкли обрабатывать пустую ячейку как пустую («»). но на самом деле явно пустая ячейка таблицы Word содержит два невидимых символа (по крайней мере, в слове 2007), то есть chr(13)
& Chr(7)
. его можно проверить с помощью простого оператора, например
MsgBox Len(.Cell(1, 1).Range.Text)
MsgBox Asc(Right(.Cell(1, 1).Range.Text, 1))
MsgBox Asc(Left(.Cell(1, 1).Range.Text, 1))
поэтому, чтобы ваш код работал, его можно изменить на что-то вроде
Sub merge()
Dim x As Integer, i As Integer, S As String
x = ActiveDocument.Tables(1).Rows.Count
With ActiveDocument.Tables(1)
For i = 1 To x
S = .Cell(i, 2).Range.Text
S = Replace(S, Chr(13), "")
S = Replace(S, Chr(7), "")
If S = "" Then
.Cell(Row:=i, Column:=2).merge _
MergeTo:=.Cell(Row:=i, Column:=3)
.Borders.Enable = False
End If
Next i
End With
End Sub
или тестовая строка может быть изменена на
If Len(.Cell(i, 2).Range.Text) = 2 Then
также не мог понять, почему в вашем коде вы повторяете ActiveDocument.Tables(1).Rows.Count+1
, поэтому для тестирования я использовал только For i = 1 To x
person
Ahmed AU
schedule
11.04.2019