Суть проблемы: есть файл с огромной таблицей. Таблица постепенно заполняется (заносится персонал со своими признаками). в некоторых ячейках вставлены формулы. Но надо чтобы все заполненные строки "фиксировались" (т.е. чтобы в ячейках с формулами с момента заполнения данными формулы больше небыло, а оставалось только значение, которое формула создала; ну чтобы на будущее значение не менялось в зависимости от изменения исходных данных). Я пока не придумал ничего умнее, как вставить макрос, который перед закрытием копирует всю заполненную часть и вставляет только значение.
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Наверное, не самое изящное решение, но и оно, в принципе, устроило бы.
Но обнаружил баг: если в таблице был выставлен какой-то фильтр, копирование и вставка "только значений" происходит некорректно. Не буду описывать подробно; думаю, вы понимаете почему так происходит и без меня =) Я начал думать, как решить проблему. В тот же макрос вставил оператор, раскрывающий все фильтры перед копированием. Получилось так:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Но появилась другая проблема: если фильтры были, то всё отлично - фильтры снялись, всё нужное поле откопировалось как надо. Но если фильтров не было, то при закрытии выходит сообщение: "Run-time error '1004': Метод ShowAllData из класса Worksheet завершен неверно" (ну т.к. нет никаких фильтров) и предлагает либо прекратить работу макроса вообще, либо перейти к его редактированию.
Вопрос: как поставить условие - если есть хоть один выбранный выбранный фильтр, то снять все фильтры; если фильтров не выбрано, то перейти к копированию/вставке? Ну или может быть более грамотное решение основной задачи (в примере, в столбцах E, F и I должны быть значения с момента заполнения ячейки в столбце D, а ниже в тех же столбцах должны оставаться формулы)
Здравствуйте. Прошу помощи знатоков =)
Суть проблемы: есть файл с огромной таблицей. Таблица постепенно заполняется (заносится персонал со своими признаками). в некоторых ячейках вставлены формулы. Но надо чтобы все заполненные строки "фиксировались" (т.е. чтобы в ячейках с формулами с момента заполнения данными формулы больше небыло, а оставалось только значение, которое формула создала; ну чтобы на будущее значение не менялось в зависимости от изменения исходных данных). Я пока не придумал ничего умнее, как вставить макрос, который перед закрытием копирует всю заполненную часть и вставляет только значение.
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Наверное, не самое изящное решение, но и оно, в принципе, устроило бы.
Но обнаружил баг: если в таблице был выставлен какой-то фильтр, копирование и вставка "только значений" происходит некорректно. Не буду описывать подробно; думаю, вы понимаете почему так происходит и без меня =) Я начал думать, как решить проблему. В тот же макрос вставил оператор, раскрывающий все фильтры перед копированием. Получилось так:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Но появилась другая проблема: если фильтры были, то всё отлично - фильтры снялись, всё нужное поле откопировалось как надо. Но если фильтров не было, то при закрытии выходит сообщение: "Run-time error '1004': Метод ShowAllData из класса Worksheet завершен неверно" (ну т.к. нет никаких фильтров) и предлагает либо прекратить работу макроса вообще, либо перейти к его редактированию.
Вопрос: как поставить условие - если есть хоть один выбранный выбранный фильтр, то снять все фильтры; если фильтров не выбрано, то перейти к копированию/вставке? Ну или может быть более грамотное решение основной задачи (в примере, в столбцах E, F и I должны быть значения с момента заполнения ячейки в столбце D, а ниже в тех же столбцах должны оставаться формулы)maverick_77
Private Sub Workbook_BeforeClose(Cancel As Boolean) ActiveSheet.ShowAllData Range(Cells(4, "L"), Cells(Rows.Count, "A").End(xlUp)).Value = _ Range(Cells(4, "L"), Cells(Rows.Count, "A").End(xlUp)).Value End Sub
[/vba]
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) ActiveSheet.ShowAllData Range(Cells(4, "L"), Cells(Rows.Count, "A").End(xlUp)).Value = _ Range(Cells(4, "L"), Cells(Rows.Count, "A").End(xlUp)).Value End Sub