1

Тема: В Word 2007 отрисовка границ ячеек в таблице

Добрый день. Помогите разобраться в проблеме.
Есть необходимость в таблице в Word обрисовать границы ячеек, в том числе и диагонали. Особо не мудрствуя для начала запустила "создать макрос" и набила все необходимые границы через сам Word. На что VBA сгенерированл такой код:

' Макрос1 Макрос
'
'
    Selection.MoveRight Unit:=wdCharacter, Count:=5, Extend:=wdExtend
    With Selection.Cells
        With .Borders(wdBorderLeft)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorPink
        End With
        With .Borders(wdBorderRight)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorGreen
        End With
        With .Borders(wdBorderTop)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorYellow
        End With
        With .Borders(wdBorderBottom)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorBlue
        End With
        With .Borders(wdBorderVertical)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorRed
        End With
        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
        With .Borders(wdBorderDiagonalUp)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = -587137025
        End With
        .Borders.Shadow = False
    End With

End Sub

Особо "приятно", что в 2003 Word'е эта процедура отрабатывает на ура, а в 2007 генерируется ошибка

run-time error '5941':
Запрашиваемый номер семейства не существует

не строке

.Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone

А если ее закоментировать, то на следующей. Т.е. создается ощущение, что 2007 Word имеет какое-то другое представление о диагоналях в таблицах, нежели Word 2003.
Очень прошу Вашей помощи

2

Re: В Word 2007 отрисовка границ ячеек в таблице

А сделайте то же самое для формирования макроса в 2007. Интересно, что покажет?

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

3

Re: В Word 2007 отрисовка границ ячеек в таблице

В том-то и дело! Прежде, чем задать вопрос, я сгенерировала макрос в 2007 Word'е. И результат тот же.
При выборе диагонали генерируется вышеприведенный код, но при запуске этого макроса, на строке с указанием диагонали происходит ошибка.

4

Re: В Word 2007 отрисовка границ ячеек в таблице

Mirosolka пишет:

В том-то и дело! Прежде, чем задать вопрос, я сгенерировала макрос в 2007 Word'е. И результат тот же.
При выборе диагонали генерируется вышеприведенный код, но при запуске этого макроса, на строке с указанием диагонали происходит ошибка.

Подобная ошибка возникает в том случае, если программа обращается к несуществующему объекту или к объекту, имеющему несуществующий номер (например, к таблице номер 5, если в тексте имеется всего 4 таблицы) (внешняя ссылка).

Могу предложить вам только попробовать отладить ваш макрос в версии 2007. Для этого приложите, пожалуйста, файл, к которому должен быть применен данный макрос.

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

5

Re: В Word 2007 отрисовка границ ячеек в таблице

Попробовал применить ваш макрос на своей таблице.
Он обрисовывает по диагонали не более пяти ячеек той строки таблицы, в которой установлен курсор.
Причем, для того, чтобы макрос применился к одной строке, курсор нужно ставить в первый столбец этой строки.
Если курсор поставлен вне таблицы, то появляется упомянутая вами ошибка:

run-time error '5941':
Запрашиваемый номер семейства не существует

Это происходит, поскольку макрос не находит таблицу, с которой он должен работать.

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

6

Re: В Word 2007 отрисовка границ ячеек в таблице

Прошу прощения за долгое молчание.
Немного видоизменила макрос. Он однозначно ссылается на 1 ячейку таблицы. Та же ошибка генерируется при попытке отрисовать диагональ.
Файл изначально создавался в 2007 Word'е

Если на моем компьютере сначала был установлен 2003 Office, поверх него дополнительно установлен 2007 Office, возможны ли какие-нибудь подобные нестыковки? Возможно ли, что ошибка исправится, если  переустановить Office?

7

Re: В Word 2007 отрисовка границ ячеек в таблице

вот пресловутый файл

Post's attachments

Doc2.docm 16.69 Кб, 2 скачиваний с 2012-06-18 

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

8

Re: В Word 2007 отрисовка границ ячеек в таблице

Mirosolka, я не совсем понимаю, что вам нужно получить в результате.

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

На всякий случай, помещаю сюда получившийся у меня макрос:

Sub Macroname1()
'
' Использован макрос для определение номера текущей таблицы
' - http://www.forum.mista.ru/topic.php?id=130346
'
    Dim ThisTableIndex As Variant
    ThisTableIndex = 0
    
    'Определяем номер текущей таблицы
    Dim MyRangeTable()
    For i = 1 To ActiveDocument.Tables.Count
        ReDim Preserve MyRangeTable(i)
        Set MyRangeTable(i - 1) = ActiveDocument.Tables(i).Range
        ActiveDocument.Tables(i).ID = "Table " & i
    Next
    For i = 1 To ActiveDocument.Tables.Count
        If Selection.InRange(MyRangeTable(i - 1)) Then
           ThisTableIndex = i
        End If
    Next
    
    'Преобразование первой строки текущей таблицы
    If ThisTableIndex <> 0 Then
        'Выделение первой строки текущей таблицы
        ActiveDocument.Tables(ThisTableIndex).Rows(1).Select
        
        'Далее идет ваша процедура
        With Selection.Cells
            With .Borders(wdBorderLeft)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorPink
            End With
            With .Borders(wdBorderRight)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorGreen
            End With
            With .Borders(wdBorderTop)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorYellow
            End With
            With .Borders(wdBorderBottom)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorBlue
            End With
            With .Borders(wdBorderVertical)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorRed
            End With
            .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
            With .Borders(wdBorderDiagonalUp)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = -587137025
            End With
            .Borders.Shadow = False
        End With
    
    Else
        MsgBox "Это не таблица", vbCritical, "Идентификатор таблицы"
    End If
    
End Sub

Примечание: Возможно к текущей таблице можно обратиться и проще, но более простого решения я пока не нашел.

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

9

Re: В Word 2007 отрисовка границ ячеек в таблице

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

10

Re: В Word 2007 отрисовка границ ячеек в таблице

Mirosolka пишет:

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

Небольшая поправка: доопределил переменную i, на случай, если у вас стоит оператор Option Explicit:

Sub Macroname1()
'
' Использован макрос для определение номера текущей таблицы
' - http://www.forum.mista.ru/topic.php?id=130346
'
    Dim ThisTableIndex As Variant
    ThisTableIndex = 0
    Dim i As Integer
        
    'Определяем номер текущей таблицы
    Dim MyRangeTable()
    For i = 1 To ActiveDocument.Tables.Count
        ReDim Preserve MyRangeTable(i)
        Set MyRangeTable(i - 1) = ActiveDocument.Tables(i).Range
        ActiveDocument.Tables(i).ID = "Table " & i
    Next
    For i = 1 To ActiveDocument.Tables.Count
        If Selection.InRange(MyRangeTable(i - 1)) Then
           ThisTableIndex = i
        End If
    Next
    
    'Преобразование первой строки текущей таблицы
    If ThisTableIndex <> 0 Then
        'Выделение первой строки текущей таблицы
        ActiveDocument.Tables(ThisTableIndex).Rows(1).Select
        
        'Далее идет ваша процедура
        With Selection.Cells
            With .Borders(wdBorderLeft)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorPink
            End With
            With .Borders(wdBorderRight)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorGreen
            End With
            With .Borders(wdBorderTop)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorYellow
            End With
            With .Borders(wdBorderBottom)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorBlue
            End With
            With .Borders(wdBorderVertical)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = wdColorRed
            End With
            .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
            With .Borders(wdBorderDiagonalUp)
                .LineStyle = wdLineStyleSingle
                .LineWidth = wdLineWidth050pt
                .Color = -587137025
            End With
            .Borders.Shadow = False
        End With
    
    Else
        MsgBox "Это не таблица", vbCritical, "Идентификатор таблицы"
    End If
    
End Sub

У меня все работает, даже если курсор стоит не на таблице.

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