Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2009, 19:49   #1
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
Злость LineStyle<>-4142 однако LineStyle = xlContinuous

Вот кусок кода, который копирует границы ячеек с одного "Range" на другой:
Код:
Dim br As Integer
    For br = 7 To 12
        With FromRange.borders(br)
            ToRange.borders(br).Color = .Color
            ToRange.borders(br).ColorIndex = .ColorIndex
            ToRange.borders(br).LineStyle = .LineStyle
            ToRange.borders(br).TintAndShade = .TintAndShade
            ToRange.borders(br).Weight = .Weight
        End With
    Next br
Итог: копирует цвета границ, толщину линий... И ВСЕ! а стили линий (а отсутствие линии тоже стиль: xlLineStyleNone) не копирует! всегда остается прямая линия. Проверил, можно ли вообще поменять LineStyle (раньше же менял), написал тупо так) :
Код:
Dim br As Integer
    For br = 7 To 12
        With FromRange.borders(br)
            ToRange.borders(br).Color = .Color
            ToRange.borders(br).ColorIndex = .ColorIndex
            ToRange.borders(br).LineStyle = xlDashDotDot
            ToRange.borders(br).TintAndShade = .TintAndShade
            ToRange.borders(br).Weight = .Weight
        End With
    Next br
И что Вы думаете? Конечно все границы стали тере-точка-точка... В голове все перевернулось... Решил пойти на пролом:
Код:
Dim br As Integer
    For br = 7 To 12
        With FromRange.borders(br)
            ToRange.borders(br).Color = .Color
            ToRange.borders(br).ColorIndex = .ColorIndex
            Select Case .LineStyle
                Case xlContinuous:
                    ToRange.borders(br).LineStyle = xlContinuous
                Case xlDash:
                    ToRange.borders(br).LineStyle = xlDash
                Case xlDashDot:
                    ToRange.borders(br).LineStyle = xlDashDot
                Case xlDashDotDot:
                    ToRange.borders(br).LineStyle = xlDashDotDot
                Case xlDot:
                    ToRange.borders(br).LineStyle = xlDot
                Case xlDouble:
                    ToRange.borders(br).LineStyle = xlDouble
                Case xlLineStyleNone:
                    ToRange.borders(br).LineStyle = xlLineStyleNone
                Case xlSlantDashDot:
                    ToRange.borders(br).LineStyle = xlSlantDashDot
            End Select
            ToRange.borders(br).TintAndShade = .TintAndShade
            ToRange.borders(br).Weight = .Weight
        End With
    Next br
... В ярости и злости пошол за Вашей помощью: Этот код не работает!!! опять все линии границ становяться прямыми!!!
В чем дело? почему я не могу присвоить стиль
Посоветуйте что-нибудь, пожалуйста.
tolikman вне форума Ответить с цитированием
Старый 15.06.2009, 06:37   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Считывая значение одного из свойств границы FromRange.Borders(br), Вы считываете это свойство из первой ячейки этого диапазона.

При записи же свойства: ToRange.Borders(br).свойство = .свойство
оно применяется ко всему диапазону ячеек.

То есть, фактически, Вы копируете форматирование первой ячейки на диапазон ячеек.

Добиться копирования границ ячеек можно намного проще:
Код:
Sub test_2()
    Dim FromRange As Range, ToRange As Range
    Set FromRange = [a1:c15]: Set ToRange = [f2:h16]:    ToRange.Clear

    FromRange.Copy: ToRange.PasteSpecial xlPasteFormats
    Application.CutCopyMode = 0
End Sub
Ну или Вашим способом, но перебирая все ячейки: (долго и неэффективно)
Код:
Sub test()
    Dim FromRange As Range, ToRange As Range
    Set FromRange = [a1:c15]: Set ToRange = [f2:h16]
    ToRange.Clear: On Error Resume Next
    Application.ScreenUpdating = False

    Dim br As Integer
    For br = 7 To 12
        For i = 1 To FromRange.Cells.Count
            With FromRange.Cells(i).Borders(br)
                ToRange.Cells(i).Borders(br).Color = .Color
                ToRange.Cells(i).Borders(br).ColorIndex = .ColorIndex
                ToRange.Cells(i).Borders(br).LineStyle = .LineStyle
                'ToRange.Cells(i).Borders(br).TintAndShade = .TintAndShade
                ToRange.Cells(i).Borders(br).Weight = .Weight
            End With
        Next i
    Next br
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 15.06.2009, 11:26   #3
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

Еще раз спасибо EducatedFool. Не хватает знаний, в который раз изобретаю велосипед...
tolikman вне форума Ответить с цитированием
Старый 15.06.2009, 13:12   #4
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

EducatedFool, првоерил кусок кода... не то:
дело в том, что я копирую границы не между одинаковыми по размеру массивами ячеек: т.е. у меня есть образец таблицы, а макросом я строю подобную таблицу, однако размеры ее могут не соответствовать размерам образца. Для примера:
в образце есть ячейка которая была получена путем объединения других ячеек (шапка таблицы - 8 ячеек в одной строке), а в новой таблице шапка состоит из 12 ячеек (в одной строке), если я пользуюсь PastSpecial xlPasteFormats, то Excel разбивает мою большую ячейку на две: одну на ячейку состоящую из 8 объеденных ячеек (как в образце), оставшиеся ячейки разъеденияет.
А мне так не надо... надо чтобы скопировались только границы.
делать "поячеечно" - уже понятно не получится, ячеек в двух диапазонах разное количество.

Я предпочитаю перебирать границы именно диапазона.
В моем первом макросе (см первй пост) я проверял (msgbox'ом) какие значения у границ копируемого диапазона (FromRange....LineStyle), и они все совпадают с реальными. Не могу понять элементарного, почему не присваивается это значение ToRange....LineStyle.

Что бы было проще понять, прикрепил то, чем занимаюсь - автомат по бухучету...)

В модуле "Vars" есть sub copyBorders(....), именно он и копирует все что надо, а значит и внем проблема. P.S. для проверки открой лист "Счета", дважды щелкни по "не отображать" напротив какого-нибудь счета (лучше 50) и посмотри.
Вложения
Тип файла: rar Журнал.rar (107.7 Кб, 10 просмотров)

Последний раз редактировалось tolikman; 15.06.2009 в 13:15.
tolikman вне форума Ответить с цитированием
Старый 15.06.2009, 15:15   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
для проверки открой лист "Счета", дважды щелкни по "не отображать" напротив какого-нибудь счета (лучше 50) и посмотри.
Щелкал, но не увидел ничего, кроме появляющихся ошибок (причём разных)
Пытался найти ошибку в модулях класса - но не осилил (очень много букв)

В случае с объединёнными ячейками скопировать форматирование не получится.
Тут проще макросом прорисовать нужные линии в нужных местах, чем копировать форматирование с таблицы с другой структурой.

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

Короче говоря, из файла я так и не понял, на основании каких данных что создаётся.
В любом случае, Вы сильно усложняете решение.
EducatedFool вне форума Ответить с цитированием
Старый 15.06.2009, 17:39   #6
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

Какие ошибки? у меня полноценно генерируется счет (кроме проблемы с LineStyle'ом таблиц) со всеми корр.счетами и все грамотно, ошибок не вылетает. К тому же он еще не закончен.
Добавлять столбцы будет как раз сложнее, чем сразу выставлять рассчитанные размеры.

а в файле все просто на самом деле:
есть Журнал РХО (Журнал регистрации хозяйственных операций) в каждой строке этого журнала написано когда, с какого счета на какой счет и какая сумма переводится. лист "Счета" генерируются автоматически при щелчке по нему (точнее при активации). Выбирая конкретный счет - создается или находится лист с именем счета (в качестве имени - немер счета) и на этом листе строится таблица. Прообраз этой таблицы нахидится на листе "Образец счета". и все.
tolikman вне форума Ответить с цитированием
Старый 17.06.2009, 16:43   #7
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

Люди, пожалйста помагите
вот прикрепил простой пример, ничего лишнего нет.
Обратите внимание: копируется все кроме того момента, когда линия отсутствует (самая верхняя в диапазоне, она появляется при копировании). Почему?
Вложения
Тип файла: rar test.rar (15.5 Кб, 12 просмотров)
tolikman вне форума Ответить с цитированием
Старый 17.06.2009, 18:41   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
копируется все кроме того момента, когда линия отсутствует (самая верхняя в диапазоне, она появляется при копировании). Почему?
Ну я же объяснял...
Повторить?
Цитата:
Считывая значение одного из свойств границы FromRange.Borders(br), Вы считываете это свойство из первой ячейки этого диапазона.

При записи же свойства: ToRange.Borders(br).свойство = .свойство
оно применяется ко всему диапазону ячеек.
Проведите эксперимент - очистите форматы некоторых ячеек:




PS: Линии рисует строка ToRange.Borders(br).Weight = .Weight

Поменяйте порядок строк в макросе:
сначала ToRange.Borders(br).Weight = .Weight
потом ToRange.Borders(br).LineStyle = .LineStyle

Последний раз редактировалось EducatedFool; 17.06.2009 в 18:44.
EducatedFool вне форума Ответить с цитированием
Старый 17.06.2009, 19:05   #9
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

EducatedFool, спасибо за подсказку в PS, попробую.
Не надо на меня кричать... ))) я прекрасно понимаю, что если в копируемой таблице будут совершенно разные границы между ячейками, то будет копироваться только первая ячейка! мне нужен этот макрос чтобы копировать таблицу с 'одинаковыми' границами.
Меня интересовало только то, почему (даже на вашем эксперименте) "пустая" линия превращается в тоненькую...

проверяю....

УРА! Все отлично заработало!!! БОЛЬШОЕ СПАСИБО!!!
tolikman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка однако! Nixtone Помощь студентам 8 15.11.2007 17:27