Страницы: 1
RSS
Выполнение определённых шагов перед сохранением/закрытием/печатью файла, Изменять значение ячеек
 
Есть таблица. Эту таблицу обновляет подрядчик. Однако, при заполнении они часто допускают ошибки, формулы они корректируют вручную, что приводит к тому, что в целом таблица получается не правильная.

Мне надоЯ бы хотел, чтоб перед тем, как отправить на печать, либо перед сохранение файла ячейки с формулами "возвращались" к исправному содержанию.

Я понимаю, что нет такого макроса, который бы сам всё считал.
Поэтому как один из этапов решения данной проблемы я создал копию таблицы.

Теперь мне нужен код я бы хотел найти способ, который бы перед печатью/сохранением копировал ячейки с листа "sheet2" в соответствующие ячейки листа "sheet1".

надеюсь верно изложил проблему.

Пример во вложении.
Изменено: SanShiney - 10.08.2013 14:05:45
 
Дык и запишите Ваше копирование макрорекордером. И повесьте этот макрос на соответствующие события. Что непонятно спросите. А то только указания от Вас: "Мне надо", "Теперь мне нужен код"... Стол заказов у нас в другой ветке: http://www.planetaexcel.ru/forum/?PAGE_NAME=list&FID=7
Я сам - дурнее всякого примера! ...
 
KuklP, извините, что задел Ваше самолюбие. Впредь, постараюсь правильно излагать просьбы.
И спасибо за вариант решения задачи. Однако, это не решает вопроса того, чтоб макрос запускался перед печатью и перед сохранением.
Но всеравно спасибо.
Своё сообщение отредактировал соответственно.
 
Цитата
SanShiney пишет:
Однако, это не решает вопроса того, чтоб макрос запускался перед печатью и перед сохранением.
Как не решает?  Вам ведь Сергей написал:
Цитата
И повесьте этот макрос на соответствующие события
 
Используйте события книги Workbook_BeforeClose и Workbook_BeforePrint.
Где искать модуль книги: Что такое модуль? Какие бывают модули?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Вы никак не задели мое самолюбие. И то, что Вы изменили в посте никак не изменило его тона. Ни те здрасьте, ни пожалуйста. Тут нет Ваших подчиненных.
Цитата
SanShiney пишет:
Однако, это не решает вопроса того, чтоб макрос запускался перед печатью и перед сохранением.
Это если совсем не уметь читать, что Вам советуют.
Цитата
KuklP пишет:
И повесьте этот макрос на соответствующие события.
Вот это как раз об этом. И дальше я добавил:
Цитата
KuklP пишет:
Что непонятно спросите.
Я сам - дурнее всякого примера! ...
 
ВСЕМ СПАСИБО БОЛЬШОЕ! =)
Буду разбираться. А за одно и буду изучать макросы.
До этого вообще ничего в Макросах не читал и не понимаю.
Спасибо.
 
Подскажите, кто в курсе.
Вот что я тут надумал исходя из того, что я прочел и понял:
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Sheets("Master_PMS_formula").Select
    Range("Q13:R1933").Select
    Selection.Copy
    Sheets("Master_PMS").Select
    Range("Q13:R1933").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=True, Transpose:=False
    Application.CutCopyMode = False
    
    Sheets("Master_PMS_formula").Select
    Range("AB13:AC1933").Select
    Selection.Copy
    Sheets("Master_PMS").Select
    Range("AB13:AC1933").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=True, Transpose:=False
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.ScreenUpdating = False
    Sheets("Master_PMS_formula").Select
    Range("Q13:R1933").Select
    Selection.Copy
    Sheets("Master_PMS").Select
    Range("Q13:R1933").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=True, Transpose:=False
    Application.CutCopyMode = False
    
    Sheets("Master_PMS_formula").Select
    Range("AB13:AC1933").Select
    Selection.Copy
    Sheets("Master_PMS").Select
    Range("AB13:AC1933").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=True, Transpose:=False
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

Замеченные ... свойства, которых хотелось бы избежать:
1) Макрос не работает, если хоть один из листов скрыт ("Master_PMS" или "Master_PMS_formula").
Как можно обойти этот пункт и чтоб макрос работал и на скрытых (а так же супер скрытых) листах?
2) После макроса, остаётся выделение копированных/вставленных ячеек.
Что прописать, чтоб после макроса выделение ячеек возвращалось к начальному положению.

Буду благодарен за подскази (желательно со сцылками).

Спасибо.
 
1. Программно менять видимость листов.
2. Application.CutCopyMode = False
3. Избегайте Select'ов - вот это:
Код
Sheets("Master_PMS_formula").Select
    Range("AB13:AC1933").Select
    Selection.Copy
можно записать так:
Код
Sheets("Master_PMS_formula").Range("AB13:AC1933").Copy

4. Пишите по-русски: нет такого слова "сцылка".
 
Для начала уберем все селекты:
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Sheets("Master_PMS_formula").Range("Q13:R1933").Copy
    Sheets("Master_PMS").Range("Q13").PasteSpecial Paste:=xlPasteFormulas
     Sheets("Master_PMS_formula").Range("AB13:AC1933").Copy
    Sheets("Master_PMS").Range("AB13").PasteSpecial Paste:=xlPasteFormulas
    Application.CutCopyMode = False
    'Application.ScreenUpdating = True - лишнее, мы не отключали.
End Sub
Так же и во втором макросе.
Изменено: KuklP - 03.08.2013 20:49:44
Я сам - дурнее всякого примера! ...
 
Юрий М, KuklP, спасибо большое!
Я пользовался режимом записи макроса. Поэтому так и записал.
Огромное спасибо. Буду знать.
"'Application.ScreenUpdating = True" осталось с предыдущей модификации. (экспериментировал).

Юрий М, извиняюсь. Как то само получилось. =) (насчёт "сцылки" ;)
Изменено: SanShiney - 03.08.2013 20:51:32
 
KuklP, а как быть с "Макрос не работает, если хоть один из листов скрыт ("Master_PMS" или "Master_PMS_formula" ;) ."?
Потому что я не понял Юрий М в части "1. Программно менять видимость листов. "
Изменено: SanShiney - 03.08.2013 20:53:53
 
SanShiney,
Еще лучше(раз уж мы знаем диапазоны) делать так:
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Sheets("Master_PMS").Range("Q13:R1933").Formula = _
    Sheets("Master_PMS_formula").Range("Q13:R1933").Formula
    Sheets("Master_PMS").Range("AB13:AC1933").Formula = _
    Sheets("Master_PMS_formula").Range("AB13:AC1933").Formula
End Sub
Мой и первый и второй варианты работают и с очень скрытыми листами.
Изменено: KuklP - 03.08.2013 21:42:29
Я сам - дурнее всякого примера! ...
 
Вот другой вариант защиты формул. Без скрытых листов и одним макросом. Пробуйте что-то менять в желтых диапазонах.
Я сам - дурнее всякого примера! ...
 
KuklP, воспользовался Вашим 2 примером.
Получил следующее:
1) В первом диапазоне макрос затёр все данные и сверху переписал весь диапазон данных, включая пустые ячейки
2) Во втором диапазоне он поменял только первую ячейку
3) Не перенёс свойство функции массива, изза чего вся таблица в ошибках.
Как исправить? я не понимаю... извините...

1 пример переносит функцию массивов, однако так же "затирает" все данные, а не вставляет только формулы с пропуцском пустых...
В всё, разобрался. Вот так будет то что мне нужно:

Код
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Sheets("Master_PMS_formula").Range("Q13:R1933").Copy
    Sheets("Master_PMS").Range("Q13").PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
    Sheets("Master_PMS_formula").Range("AB13:AC1933").Copy
    Sheets("Master_PMS").Range("AB13").PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
    Application.CutCopyMode = False
    End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Sheets("Master_PMS_formula").Range("Q13:R1933").Copy
    Sheets("Master_PMS").Range("Q13").PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
    Sheets("Master_PMS_formula").Range("AB13:AC1933").Copy
    Sheets("Master_PMS").Range("AB13").PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
    Application.CutCopyMode = False
End Sub

Всем БОЛЬШОЕ СПАСИБО!
Помогли решить проблему! =)
Изменено: SanShiney - 03.08.2013 21:41:45
 
О формулах массива и пустых ячейках слышу от Вас только сейчас. Тогда используйте первый вариант, добавив параметр SkipBlanks:=True.
Логично было бы защищать только те ячейки, к-рые содержат формулы. Я на это и расчитывал. А у Вас там каша  :)
Я сам - дурнее всякого примера! ...
 
Цитата
KuklP пишет:
Логично было бы защищать только те ячейки, к-рые содержат формулы
Абсолютно с Вами согласен.
Но работник у подрядчика настолько ... ну в общем, он не знает excel. И когда я давал ему столбец с перемешанными ячейками (защищённый и не защищенный) его вводило в ступор.
Т.е. когда он пытается 2000 ячеек вставить в один столбец и это (вдруг) выдает ошибку. И путей решения этого он не нашел.
Для чего мне надо было найти способ, чтоб после каждого внесения данных подрядчиком программа за него возвращала все формулы на места.

Спасибо Вам ОГРОМНОЕ!
С меня пиво! ;)
Страницы: 1
Наверх