Тема: Определение последего ряда в таблице на текущей странице
Есть таблица, она располагается на трех страницах, как определить последний ряд ячеек, который находится на 1й и 2й страницах.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть таблица, она располагается на трех страницах, как определить последний ряд ячеек, который находится на 1й и 2й страницах.
таблица в Ворде?
если да, то почему бы ряд не назвать по русски - строка таблицы?
Есть таблица, она располагается на трех страницах, как определить последний ряд ячеек, который находится на 1й и 2й страницах.
Не совсем понятен вопрос. Что значит "определить"? Найти? Перейти на указанную вами строку?
Что делать, если строка разделится на две части: одна часть остается на предыдущей странице, а другая переходит на следующую?
Если не секрет - с какой целью вам это понадобилось?
Ципихович Эндрю
таблица в Ворде?
если да, то почему бы ряд не назвать по русски - строка таблицы?
Таблица в Ворде. Можно и как строка таблицы назвать.
Alex_Gur
Для чего это нужно: для того чтобы убрать нижнюю линию в таблице при ее продолжении на другой странице. (про изменения в госте читал, но есть необходимость убирать эту злосчастную черту)
Что делать, если строка разделится на две части: одна часть остается на предыдущей странице, а другая переходит на следующую?
Во избежании этого снимаю галочку с параметра: "разрешить перенос строк на следующую страницу".
Спасибо.
Для чего это нужно: для того чтобы убрать нижнюю линию в таблице при ее продолжении на другой странице. (про изменения в госте читал, но есть необходимость убирать эту злосчастную черту)
А нельзя разделить таблицу на три части и убрать нижнюю черту у нижней строки? Конечно, не очень красивое решение, но все же...
А нельзя разделить таблицу на три части и убрать нижнюю черту у нижней строки? Конечно, не очень красивое решение, но все же...
Дык, чтобы ее разделить на три части нужно знать сколько строк таблицы помещается на один лист (это кол-во строк может и варьироваться). А если таблица занимает не 3 листа, а намного больше.
Вот пример макроса удаляющего у всех таблиц документа, расположенных более чем на одной странице в последней строке на странице нижнюю линию, единственная проблема в том, что первая строка на следующей странице, теряет верхнюю линию
Public Sub LastPageRow()
Dim Doc As Document, Tbl As Table, LRow As Row
Dim AW As Window, AP As Pane, PG As Page
Set Doc = ActiveDocument
Set AW = Doc.ActiveWindow
Set AP = AW.ActivePane
For Each Tbl In Doc.Tables
ps = Tbl.Rows(1).Range.Information(wdActiveEndAdjustedPageNumber)
pe = Tbl.Rows(Tbl.Rows.Count).Range.Information(wdActiveEndAdjustedPageNumber)
If pe > ps Then
For i = ps To pe - 1
r = AP.Pages(i).Rectangles(1).Lines.Count
Set PG = AP.Pages(i)
Set LRow = PG.Rectangles(1).Lines(r).Range.Rows(1)
LRow.Range.Borders(wdBorderBottom).LineStyle = wdLineStyleNone
Next i
End If
Next Tbl
End Sub
Alex_Gur пишет:А нельзя разделить таблицу на три части и убрать нижнюю черту у нижней строки? Конечно, не очень красивое решение, но все же...
Дык, чтобы ее разделить на три части нужно знать сколько строк таблицы помещается на один лист (это кол-во строк может и варьироваться). А если таблица занимает не 3 листа, а намного больше.
Мы, например, в этом случае делаем так: начинаем таблицу с новой страницы, далее делим таблицу на части (с запасом) (в ГОСТе вроде нигде не сказано, что таблица должна занимать всю страницу). И вы правы: это подходит только для небольших таблиц.
А, несомненно, более красивое решение - это макрос, который предложил коллега aap77.
Вот модифицированный макрос который разделяет единую таблицу на отдельные и в разделенных таблицах в последних строках удаляет нижнюю линию, в следующей таблице первая строка остается целой
Public Sub LastPageRow()
Dim Doc As Document, Tbl As Table, FRow As Row, LRow As Row
Dim AW As Window, AP As Pane, PG As Page
Set Doc = ActiveDocument
Set AW = Doc.ActiveWindow
Set AP = AW.ActivePane
Set Tbl = Selection.Tables(1)
ps = Tbl.Rows(1).Range.Information(wdActiveEndAdjustedPageNumber)
pe = Tbl.Rows(Tbl.Rows.Count).Range.Information(wdActiveEndAdjustedPageNumber)
If pe > ps Then
For i = ps + 1 To pe
Set PG = AP.Pages(i)
Set FRow = PG.Rectangles(1).Lines(1).Range.Rows(1)
FRow.Range.Select
Selection.SplitTable
Selection.Paragraphs(1).Range.Font.Size = 1
Next i
End If
pe = pe - 1
For i = pe To ps Step -1
Set PG = AP.Pages(i)
For j = PG.Rectangles(1).Lines.Count To 1 Step -1
If PG.Rectangles(1).Lines(j).Range.Tables.Count > 0 Then
Set Tbl = PG.Rectangles(1).Lines(j).Range.Tables(1)
Set LRow = Tbl.Rows(Tbl.Rows.Count)
LRow.Range.Borders(wdBorderBottom).LineStyle = wdLineStyleNone
Exit For
End If
Next j
Next i
End Sub
Вот еще один пример объединения и разделения таблиц по страницам
Создаем класс clsTable и определяем в нем свойства и методы
Public SplitRows As Collection
Public Property Get Table() As Table
Set Table = Selection.Tables(1)
End Property
Public Property Get PageStart() As Long
PageStart = Table.Range.Characters.First.Information(wdActiveEndAdjustedPageNumber)
End Property
Public Property Get PageEnd() As Long
PageEnd = Table.Range.Characters.Last.Information(wdActiveEndAdjustedPageNumber)
End Property
Public Property Get Doc() As Document
Set Doc = ActiveDocument
End Property
Public Property Get AW() As Window
Set AW = Doc.ActiveWindow
End Property
Public Property Get AP() As Pane
Set AP = AW.ActivePane
End Property
Public Property Get booSplit() As Boolean
If PageStart < PageEnd Then
booSplit = True
Else
booSplit = False
End If
End Property
Public Sub SplitTable(Optional TypeSplit As Byte)
Dim FRow As Row, RT As Rectangle, LN As Line, PG As Page
If booSplit = False Then Exit Sub
If IsMissing(TypeSplit) = True Then
TypeSplit = 0
End If
Set SplitRows = New Collection
For i = PageStart + 1 To PageEnd
Set PG = AP.Pages(i)
Set RT = PG.Rectangles(1)
Set LN = RT.Lines(Table.Range.Characters.First.Information(wdFirstCharacterLineNumber))
LN.Range.Cells(1).Select
Selection.InsertRows (1)
Set LN = RT.Lines(Table.Range.Characters.First.Information(wdFirstCharacterLineNumber))
LN.Range.Select
Selection.Cells.Merge
Select Case TypeSplit
Case 0
With LN.Range.Cells(1)
.Borders(wdBorderTop).LineStyle = wdLineStyleNone
.Borders(wdBorderLeft).LineStyle = wdLineStyleNone
.Borders(wdBorderRight).LineStyle = wdLineStyleNone
End With
Case 1
With LN.Range.Cells(1)
.Borders(wdBorderTop).LineStyle = wdLineStyleNone
.Borders(wdBorderLeft).LineStyle = wdLineStyleNone
.Borders(wdBorderRight).LineStyle = wdLineStyleNone
With .Range
.Font.Italic = True
.Paragraphs(1).Alignment = wdAlignParagraphRight
If i < PageEnd Then
.Text = "Ïðîäîëæåíèå òàáëèöû"
Else
.Text = "Îêîí÷àíèå òàáëèöû"
End If
End With
End With
End Select
SplitRows.Add LN
Next i
End Sub
Public Sub MergeTable()
Dim LN As Line
If SplitRows.Count = 0 Then Exit Sub
For i = 1 To SplitRows.Count
Set LN = SplitRows(i)
LN.Range.Select
LN.Range.Cells(1).Delete
Next i
Set SplitRows = Nothing
End Sub
Процедура Public Sub SplitTable(Optional TypeSplit As Byte) разбивает выделенную таблицу согласно необязательному аргументу TypeSplit:
При TypeSplit=0 разбивается так, что у последней строки таблице на странице нет нижней черты
При TypeSplit=1 в таблицу добавляется надпись "Продолжение таблицы" или "Окончание таблицы" с форматированием шрифта курсивом по правому краю
Для тестирования создайте в документе таблицу, состоящую например из 5 столбцов и 200 строк
В редакторе VBA в проекте активного документа создайте класс clsTable с приведенным выше кодом
Затем в модуле ThisDocument создайте тестирующую процедуру
Public Sub Test1()
Dim cls As clsTable
Set cls = New clsTable
cls.SplitTable 1
cls.MergeTable
End Sub
Выделите таблицу и запустите Test1
P.S. Макрос приведен в качестве примера способа разбиения таблицы
Процедура Public Sub MergeTable в доработке ее пока не используйте
Вот исправленный код процедуры
Public Sub MergeTable()
Dim LN As Line, RW As Row
If SplitRows.Count = 0 Then Exit Sub
For i = SplitRows.Count To 1 Step -1
Set LN = SplitRows(i)
LN.Range.Select
With LN.Range.Cells(1)
.Borders(wdBorderTop).LineStyle = .Borders(wdBorderBottom).LineStyle
.Borders(wdBorderLeft).LineStyle = .Borders(wdBorderBottom).LineStyle
.Borders(wdBorderRight).LineStyle = .Borders(wdBorderBottom).LineStyle
End With
LN.Range.Cells(1).Delete
Next i
Set SplitRows = Nothing
End Sub
Спасибо огромное.
aap77
А можете изменить ваш последний приведенный код для случая если необходимо:
- на первом листе таблицу разбить, удалить нижнюю границу таблицы
- на втором и последующих листах вписать "продолжение таблицы Х", повторить шапку таблицы и так же удалить нижнюю границу таблицы.
В редакторе VBA в проекте активного документа создайте класс clsTable с приведенным выше кодом
А можно пример как его создать?
При распознавании одного из файлов PDF, созданных по ГОСТу, и преобразовании этого файла в Word у меня каким-то образом получилась таблица, которая, как мне кажется, вам нужна - без нижней черты в конце каждой страницы.
Я пробовал копировать эту таблицу в другие файлы, и она после копирования обладает теми же необходимыми свойствами.
Данную таблицу можно преобразовывать, как вам угодно, например, вставлять или удалять столбцы. Однако не рекомендуется без особой необходимости удалять крайний правый столбец, так как при этом может сбиться отрисовка границ.
Также не следует изменять настройку границ - из-за этого полученный эффект отсутствия нижней черты может потеряться.
Файл с этой таблицей прилагаю:
Alex_Gur,
интересно и непонятно как это получается так с нижней границей, что за параметр отвечает за это?
Но, более интересен последний вариант предложенный aap77, но там вопрос: как создать класс, чтобы все заработало.
Alex_Gur,
интересно и непонятно как это получается так с нижней границей, что за параметр отвечает за это?
Мне самому это непонятно. Но, так или иначе, - почему-то работает. Можете использовать, как запасной вариант.
Спасибо огромное.
aap77
А можете изменить ваш последний приведенный код для случая если необходимо:
- на первом листе таблицу разбить, удалить нижнюю границу таблицы
- на втором и последующих листах вписать "продолжение таблицы Х", повторить шапку таблицы и так же удалить нижнюю границу таблицы.В редакторе VBA в проекте активного документа создайте класс clsTable с приведенным выше кодом
А можно пример как его создать?
все таки каким образом это делается?
Bykva_Iob пишет:Спасибо огромное.
aap77
А можете изменить ваш последний приведенный код для случая если необходимо:
- на первом листе таблицу разбить, удалить нижнюю границу таблицы
- на втором и последующих листах вписать "продолжение таблицы Х", повторить шапку таблицы и так же удалить нижнюю границу таблицы.В редакторе VBA в проекте активного документа создайте класс clsTable с приведенным выше кодом
А можно пример как его создать?
все таки каким образом это делается?
Я объясню, только мысль более понятно для Вас сформулирую.
1. Таблицы желательно разделять в конце подготовки документа.
2. Способ разделения таблицы Wordом немного некорректен, т.к. при разделении таблицы образуются 2-е независимые таблицы и общая нумерация таблиц документа сбивается, что может привести к некорректной работе работе других вполне дееспособных макросов. Можно обойти этот момент конечно, назначив в коде перед разделением таблицы вкладку Bookmark с оригинальным именем, и тогда в объекте Bookmarks([Имя закладки]).Range.Tables можно будет обращаться к каждой отдельной таблице, как бы к разделенной целой таблице. Тогда при написании алгоритма разделения и объединения таблицы надо будет учитывать много мелких нюансов.
3. Я выбрал способ оформления разделения таблицы без разрыва основной таблицы.
4. Для написания кодов обработки этих таблиц я создал класс clsTable, в котором объявляю аргументы, свойства, функции, процедуры и события. Для создания класса надо открыть редактор VBA выбрать проект основанный на Вашем документе или шаблоне или шаблон Normal, далее щелкнуть на нем ПКМ и во всплывающем меню выбрать Insert --> ClassModule. Затем в окне свойств в поле Name задать имя clsTable. (см. вложенные рисунки)
5. Далее для большего удобства и возможностей разделения таблицы я создал в документе (шаблоне) стили абзацев SplitTable© (для обозначения разделительной строки, используется как пустая с размером шрифта 1 или с надписями "Продолжение таблицы" и "Окончание таблицы"); стиль TableShapka1© (для обозначения стандартной шапки таблицы) и стиль TableShapka2© (для обозначения номеров столбцов).
6. Далее в классе clsTable я создал Основной аргумент Table, которому в дальнейшем будет соответствовать выбранный мной объект Table и добавил к нему основные свойства, которые потом в различном сочетании позволят написать разные варианты кода разделения и объединения таблицы
Public Table As Table ' Объект Table
Public Property Get PageStart() As Long ' Первая страница таблицы
PageStart = Table.Range.Cells(1).Range.Information(wdActiveEndAdjustedPageNumber)
End Property
Public Property Get PageEnd() As Long ' Последняя страница таблицы
PageEnd = Table.Range.Cells(Table.Range.Cells.Count).Range.Information(wdActiveEndAdjustedPageNumber)
End Property
Public Property Get booSplit() As Boolean ' booSplit = True если PageStart не равно PageEnd
If PageStart = PageEnd Then
booSplit = False
Else
booSplit = True
Table.Rows.AllowBreakAcrossPages = False ' Запрет переноса строк
End If
End Property
Public Property Get Pages() As Collection ' Коллекция страниц таблицы
Set Pages = New Collection
For i = PageStart To PageEnd
Pages.Add ActiveDocument.ActiveWindow.ActivePane.Pages(i)
Next i
End Property
Public Property Get TableLineStartNum() As Long ' 1-я строка таблицы
TableLineStartNum = Table.Range.Cells(1).Range.Information(wdFirstCharacterLineNumber)
End Property
Public Property Get FirstLines() As Collection ' 1-ые следующих страниц таблицы
Dim Line As Line, pg As Page
If booSplit = True Then
Set FirstLines = New Collection
For i = 2 To Pages.Count
Set pg = Pages(i)
Set Line = pg.Rectangles(1).Lines(1)
FirstLines.Add Line
Next i
End If
End Property
Public Property Get SplitLines() As Collection ' Коллекция разделительных строк
Dim Line As Line, pg As Page
If booSplit = True Then
Set SplitLines = New Collection
For i = 2 To Pages.Count
Set pg = Pages(i)
Set Line = pg.Rectangles(1).Lines(1)
If Line.Range.Cells.Count = 1 And Line.Range.Cells(1).Range.ParagraphStyle = "SplitTable©" Then
SplitLines.Add Line
End If
Next i
End If
End Property
Public Property Get booTableSplit() As Boolean ' booTableSplit = True, если таблица разделена
With Table.Range.Find
.ClearFormatting
.Style = "SplitTable©"
.Execute
If .Found = True Then
booTableSplit = True
Else
booTableSplit = False
End If
End With
End Property
Public Property Get booSplitLines() As Boolean ' если FirstLines.Count = SplitLines.Count, то таблица разделена и не слетела
If FirstLines.Count = SplitLines.Count Then
booSplitLines = True
Else
booSplitLines = False
End If
End Property
Добрый вечер. Не работает макрос в 9 пост. Ругается "В указанном месте нет таблицы" на "Set FRow = PG.Rectangles(1).Lines(1).Range.Rows(1)"
Также не выполняет макрос через класс.
"Запрашиваемый номер семейства не существует" на "cls.SplitTable 1"
Гуру vba. Помогите пожалуйста.
word 2010.
Здравствуйте. Подскажите пожалуйста. Скрипт работает на другом компьютере, хотя на обоих стоит один office. Оба x64.
В чем может быть дело?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться