1

Тема: Определение последего ряда в таблице на текущей странице

Есть таблица, она располагается на трех страницах, как определить последний ряд ячеек, который находится на 1й и 2й страницах.

2

Re: Определение последего ряда в таблице на текущей странице

таблица в Ворде?
если да, то почему бы ряд не назвать по русски - строка таблицы?

3

Re: Определение последего ряда в таблице на текущей странице

Bykva_Iob пишет:

Есть таблица, она располагается на трех страницах, как определить последний ряд ячеек, который находится на 1й и 2й страницах.

Не совсем понятен вопрос. Что значит "определить"? Найти? Перейти на указанную вами строку?
Что делать, если строка разделится на две части: одна часть остается на предыдущей странице, а другая переходит на следующую?
Если не секрет - с какой целью вам это понадобилось?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

4

Re: Определение последего ряда в таблице на текущей странице

Ципихович Эндрю

таблица в Ворде?
если да, то почему бы ряд не назвать по русски - строка таблицы?

Таблица в Ворде. Можно и как строка таблицы назвать. smile

Alex_Gur
Для чего это нужно: для того чтобы убрать нижнюю линию в таблице при ее продолжении на другой странице. (про изменения в госте читал, но есть необходимость убирать эту злосчастную черту)

Что делать, если строка разделится на две части: одна часть остается на предыдущей странице, а другая переходит на следующую?

Во избежании этого снимаю галочку с параметра: "разрешить перенос строк на следующую страницу".

Спасибо.

5

Re: Определение последего ряда в таблице на текущей странице

Bykva_Iob пишет:

Для чего это нужно: для того чтобы убрать нижнюю линию в таблице при ее продолжении на другой странице. (про изменения в госте читал, но есть необходимость убирать эту злосчастную черту)

А нельзя разделить таблицу на три части и убрать нижнюю черту у нижней строки? Конечно, не очень красивое решение, но все же...

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

6

Re: Определение последего ряда в таблице на текущей странице

Alex_Gur пишет:

А нельзя разделить таблицу на три части и убрать нижнюю черту у нижней строки? Конечно, не очень красивое решение, но все же...

Дык, чтобы ее разделить на три части нужно знать сколько строк таблицы помещается на один лист (это кол-во строк может и варьироваться).  А если таблица занимает не 3 листа, а намного больше.

7

Re: Определение последего ряда в таблице на текущей странице

Вот пример макроса удаляющего у всех таблиц документа, расположенных более чем на одной странице в последней строке на странице нижнюю линию, единственная проблема в том, что первая строка на следующей странице, теряет верхнюю линию

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

8

Re: Определение последего ряда в таблице на текущей странице

Bykva_Iob пишет:
Alex_Gur пишет:

А нельзя разделить таблицу на три части и убрать нижнюю черту у нижней строки? Конечно, не очень красивое решение, но все же...

Дык, чтобы ее разделить на три части нужно знать сколько строк таблицы помещается на один лист (это кол-во строк может и варьироваться).  А если таблица занимает не 3 листа, а намного больше.

Мы, например, в этом случае делаем так: начинаем таблицу с новой страницы, далее делим таблицу на части (с запасом) (в ГОСТе вроде нигде не сказано, что таблица должна занимать всю страницу). И вы правы: это подходит только для небольших таблиц.

А, несомненно, более красивое решение - это макрос, который предложил коллега aap77.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

9

Re: Определение последего ряда в таблице на текущей странице

Вот модифицированный макрос который разделяет единую таблицу на отдельные и в разделенных таблицах в последних строках удаляет нижнюю линию, в следующей таблице первая строка остается целой

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

10

Re: Определение последего ряда в таблице на текущей странице

Вот еще один пример объединения и разделения таблиц по страницам
Создаем класс 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. Макрос приведен в качестве примера способа разбиения таблицы

11

Re: Определение последего ряда в таблице на текущей странице

Процедура Public Sub MergeTable в доработке ее пока не используйте

12

Re: Определение последего ряда в таблице на текущей странице

Вот исправленный код процедуры

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

13

Re: Определение последего ряда в таблице на текущей странице

Спасибо огромное.

aap77

А можете изменить ваш последний приведенный код для случая если необходимо:
- на первом листе таблицу разбить, удалить нижнюю границу таблицы
- на втором и последующих листах вписать "продолжение таблицы Х", повторить шапку таблицы и так же удалить нижнюю границу таблицы.

В редакторе VBA в проекте активного документа создайте класс clsTable с приведенным выше кодом

А можно пример как его создать?

14

Re: Определение последего ряда в таблице на текущей странице

При распознавании одного из файлов PDF, созданных по ГОСТу, и преобразовании этого файла в Word у меня каким-то образом получилась таблица, которая, как мне кажется, вам нужна - без нижней черты в конце каждой страницы.
Я пробовал копировать эту таблицу в другие файлы, и она после копирования обладает теми же необходимыми свойствами.
Данную таблицу можно преобразовывать, как вам угодно, например, вставлять или удалять столбцы. Однако не рекомендуется без особой необходимости удалять крайний правый столбец, так как при этом может сбиться отрисовка границ.
Также не следует изменять настройку границ - из-за этого полученный эффект отсутствия нижней черты может потеряться.
Файл с этой таблицей прилагаю:

Post's attachments

Таблица по ГОСТ.doc 45 Кб, 6 скачиваний с 2012-04-25 

You don't have the permssions to download the attachments of this post.
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

15

Re: Определение последего ряда в таблице на текущей странице

Alex_Gur,
интересно и непонятно как это получается так с нижней границей, что за параметр отвечает за это?
Но, более интересен последний вариант предложенный aap77, но там вопрос: как создать класс, чтобы все заработало.

16

Re: Определение последего ряда в таблице на текущей странице

Bykva_Iob пишет:

Alex_Gur,
интересно и непонятно как это получается так с нижней границей, что за параметр отвечает за это?

Мне самому это непонятно. Но, так или иначе, - почему-то работает. Можете использовать, как запасной вариант.  smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

17

Re: Определение последего ряда в таблице на текущей странице

Bykva_Iob пишет:

Спасибо огромное.

aap77

А можете изменить ваш последний приведенный код для случая если необходимо:
- на первом листе таблицу разбить, удалить нижнюю границу таблицы
- на втором и последующих листах вписать "продолжение таблицы Х", повторить шапку таблицы и так же удалить нижнюю границу таблицы.

В редакторе VBA в проекте активного документа создайте класс clsTable с приведенным выше кодом

А можно пример как его создать?

все таки каким образом это делается?

18

Re: Определение последего ряда в таблице на текущей странице

Bykva_Iob пишет:
Bykva_Iob пишет:

Спасибо огромное.

aap77

А можете изменить ваш последний приведенный код для случая если необходимо:
- на первом листе таблицу разбить, удалить нижнюю границу таблицы
- на втором и последующих листах вписать "продолжение таблицы Х", повторить шапку таблицы и так же удалить нижнюю границу таблицы.

В редакторе VBA в проекте активного документа создайте класс clsTable с приведенным выше кодом

А можно пример как его создать?

все таки каким образом это делается?

Я объясню, только мысль более понятно для Вас сформулирую.
1. Таблицы желательно разделять в конце подготовки документа.
2. Способ разделения таблицы Wordом немного некорректен, т.к. при разделении таблицы образуются 2-е независимые таблицы и общая нумерация таблиц документа сбивается, что может привести к некорректной работе работе других вполне дееспособных макросов. Можно обойти этот момент конечно, назначив в коде перед разделением таблицы вкладку Bookmark с оригинальным именем, и тогда в объекте Bookmarks([Имя закладки]).Range.Tables можно будет обращаться к каждой отдельной таблице, как бы к разделенной целой таблице. Тогда при написании алгоритма разделения и объединения таблицы надо будет учитывать много мелких нюансов.
3. Я выбрал способ оформления разделения таблицы без разрыва основной таблицы.
4. Для написания кодов обработки этих таблиц я создал класс clsTable, в котором объявляю аргументы, свойства, функции, процедуры и события. Для создания класса надо открыть редактор VBA выбрать проект основанный на Вашем документе или шаблоне или шаблон Normal, далее щелкнуть на нем ПКМ и во всплывающем меню выбрать Insert --> ClassModule. Затем в окне свойств в поле Name задать имя clsTable. (см. вложенные рисунки)

Post's attachments

Создание класса.rar 212.32 Кб, 6 скачиваний с 2012-04-28 

You don't have the permssions to download the attachments of this post.

19

Re: Определение последего ряда в таблице на текущей странице

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

20

Re: Определение последего ряда в таблице на текущей странице

Добрый вечер. Не работает макрос в 9 пост. Ругается "В указанном месте нет таблицы" на "Set FRow = PG.Rectangles(1).Lines(1).Range.Rows(1)"

Также не выполняет макрос через класс.
"Запрашиваемый номер семейства не существует" на "cls.SplitTable 1"

Гуру vba. Помогите пожалуйста.

word 2010.

21

Re: Определение последего ряда в таблице на текущей странице

Здравствуйте. Подскажите пожалуйста. Скрипт работает на другом компьютере, хотя на обоих стоит один office. Оба x64.

В чем может быть дело?