Работаю в excel: присутствуют функции листа, UDF, макрос на элемент управления "флажок", макрос вызова формы с поиском по даблклику и макрос на открытие книги, включающий ручной пересчёт формул. Также много УФ на штатных функциях. Проблема: спустя час-два работы, вставка/удаление строк в "умной" таблице (неважно - макросом или руками) начинает жутко тупить (3-7 сек.). Закрываю файл, открываю его заново и всё летает (опять первые час-два). Вопрос: почему так и как побороть без перезапуска файла
P.S.: думал, что это история "откатов", но ведь запуск макроса обнуляет счётчик… Win7
Макросы из книги (файла) для списания спецификации по ведомости:
Код
'макрос на открытие книги
Option Explicit
Private Sub Workbook_Open()
Application.Calculation = xlCalculationManual
End Sub
'основной макрос (лист ведомости)
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i&, r&, c&, temp, txt1$, txt2$
Dim rBal, sBal
Dim minus, strType$
Cancel = 1: Application.ScreenUpdating = 0: Application.Calculate
r = Target.Row: c = Target.Column: If r = 1 Or c < 4 Or c > 5 Then Exit Sub Else strType = Cells(r, 15).Value2
If c = 4 Then
If strType = "Р" Then
If Len(Target.Value2) Then Target.Value2 = "": Target.Interior.Color = xlNone Else Target.Value2 = "a": Target.Interior.Color = PPP_colorGood
ElseIf strType = "С" Then
If Len(Target.Value2) Then Target.Value2 = "": Target.Interior.Color = xlNone Else Target.Value2 = "r": Target.Interior.Color = PPP_colorBad
End If
Else
If strType <> "Р" Then GoTo fin Else rBal = Cells(r, c + 4).Value2
If Len(rBal) Then
If rBal < 0 Then MsgBox "Остаток по расценке не может быть отрицательным!", vbCritical, "ОШИБКА СПИСЫВАНИЯ": GoTo fin
If rBal = 0 Then
If MsgBox("Остаток по расценке равен НУЛЮ!" & vbLf & vbLf & "Вы действительно хотите продолжить?…", vbYesNo + vbExclamation + vbDefaultButton2) = vbNo Then GoTo fin
End If
Else
rBal = Cells(r, c + 2).Value2
End If
If shSpec.bOnlyFree.Value = True Then
Call PRDX_FormSearch_Start(FILE_UpdateSpec(), "СПЕЦИФИКАЦИИ (свободные)", 0, 1)
Else
Call PRDX_FormSearch_Start(FILE_UpdateSpec(), "СПЕЦИФИКАЦИИ (доступные)", 0, 1)
End If
If PPP_FormSearch_index < 0 Then GoTo fin
txt1 = Cells(r, c + 1).Value2: txt2 = PRDX_DelByBorder(PRDX_DelByBorder(PPP_FormSearch_value, "; ["), "]", 1)
If txt1 <> txt2 Then
If MsgBox("Единицы измерения РАСЦЕНКИ «[" & txt1 & "]» и СПЕЦИФИКАЦИИ «[" & txt2 & "]» не равны!" & vbLf & vbLf & "Продолжить?", vbYesNo + vbExclamation + vbDefaultButton2) = vbNo Then GoTo fin
End If
Cells(r + 1, 1).EntireRow.Insert
Cells(r + 1, c).Value2 = PRDX_DelByBorder(PPP_FormSearch_value, " | ID-"): Cells(r + 1, c + 1).Value2 = txt2
sBal = --PRDX_DelByBorder(PRDX_DelByBorder(PPP_FormSearch_value, "] = "), " из ", 1)
If rBal > sBal Then Cells(r + 1, c + 2).Value2 = sBal Else Cells(r + 1, c + 2).Value2 = rBal
Cells(r + 1, c).Resize(1, 5).Interior.Color = PPP_colorBluePurpLight
End If
fin: Application.Calculate: Application.ScreenUpdating = 1
End Sub
'макрос из листа спецификаций
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [_specNo]) Is Nothing Then Exit Sub Else Cancel = 1
If Len(Target.Value2) Then
Target.Value2 = "": Target.Resize(1, 2).Interior.Color = xlNone
Else
Target.Value2 = "a": Target.Resize(1, 2).Interior.Color = PPP_colorGrayLight
End If
Application.Calculate
End Sub
'Отдельный модуль в книге
Option Explicit
'===========================================================================================
Public Function FILE_UpdateSpec()
Dim tempCheck, tempKey, arrKey, x, i&, n&
tempCheck = [_specCheck].Value2: tempKey = [_specKey].Value2: ReDim arrKey(0 To UBound(tempCheck, 1)): i = 0: n = -1
If shSpec.bOnlyFree.Value = True Then
For Each x In tempCheck
i = i + 1: If x = "СВОБОДНО" Then n = n + 1: arrKey(n) = tempKey(i, 1)
Next x
Else
For Each x In tempCheck
i = i + 1: If InStr(1, "СВОБОДНО | ДОСТУПНО", x) Then n = n + 1: arrKey(n) = tempKey(i, 1)
Next x
End If
If n = -1 Then MsgBox "Нет свободных спецификаций!", vbExclamation, "«FILE_UpdateSpec»": Exit Function
ReDim Preserve arrKey(0 To n): FILE_UpdateSpec = PRDX_ArraySort(arrKey)
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, Алексей, ну прям стыдоба. Примера нет.
Цитата
Jack Famous написал: Проблема: спустя час-два работы вставка/удаление строк в "умной" таблице (неважно - макросом или руками) начинает жутко тупить (3-7 сек.).
при каких действиях описания нет. Судя по предыдущему посту, 2016, но разрядность и сборка, включая обновления - тоже нет. Короче, не зачет, перепиcывайте все заново :-).
Jack Famous, у меня была похожая проблема с одним листом в книге, где было не очень много формул и данных, и совсем чуть-чуть УФ. При вставке данных в диапазон через буфер обмена все происходило быстро, но стоит что-то ввести в ячейку руками и начиналось слайд шоу. Как показало вскрытие - виновно УФ.
П.С.: Причем это УФ было в одном столбце + одной ячейке. Что там могло так сильно нагружать комп не понятно...
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
sokol92, работа ровная и монотонная - скачков быть не должно. К тому же, почему в таком случае производительность резко возрастает при перезапуске файла? Может службы накапливаются…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
sokol92, можно подробнее, пожалуйста? Если вы имеете ввиду массивы в макросе, то исключено - публичные переменные отсутствуют, а прочие очищаются при завершении процедуры (если я не ошибаюсь). Именованные диапазоны присутствуют, но все ссылаются на цельные поля умных таблиц или являются этими самыми таблицами (добавил скрины в стартовое сообщение).
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Алексей, исходных данных явно недостаточно для решения задачи. Проверить возможную утечку памяти всегда полезно, даже для программ, которые используются много лет: записываем объем памяти при старте и через час.
Михаил Витальевич С., просто странно, что перезапуск файла, а не всей винды помогает. Получается, что мусор именно Excel'евский (в моём случае)…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
я делаю резет всему компу потому, что гугл начинает притормаживать, и другие программы тоже. Я подозреваю, что с обновлением программ подцепилось несколько разных антивирусов, авст лишний - это точно, а удалять их - проще новую винду поставить.
зы. Забыл сказать, что я, в основном, комп не выключаю - пользуюсь спящим режимом. Такое обычно начинается после 3-4 "сна"
Михаил Витальевич С., комп не выключается м не перегружается неделями на работе. Дома по разному, но как правило пока не попросит не перегружаю и ничего не тормозит. Тем более если это системная ошибка бы была, то она не пропадала б на время после перезапуска приложения, и как я понял даже просто после открытия файла заново.
Цитата
Михаил Витальевич С. написал: это точно, а удалять их - проще новую винду поставить
- годами живут у меня ОС, со времен 7ки, не замечено накопление мусора в таком количестве что блокирует работу.
Jack Famous, надо смотреть файл. Возможно область использования разрастается, а она приводится в соответствие с реально последней использованной ячейкой именно после сохранения о открытия заново.
скрины диспетчера имён и диспетчера правил УФ в стартовом сообщении - ничего там, вроде, не растёт))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
БМВ написал: не понятно почему тормоза набегают со временем
Видимо особенность Excel... Рабочему файлу уже 8-й год пошел. Jack Famous, остаются только UDF во всем из многообразии. Наверняка некоторые из них с принудительным пересчетом, а точнее запускаемые с каждым пересчетом формул. Еще обработчики событий листа стоит глянуть, вдруг там нет отключения EnableEvents перед записью на лист. УФ удалить и заново поселить (если они так нужны), тем более они там все простенькие. Файл многопользовательский, если да то еще и это)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
И все же - что с памятью? Если макросы все же используются, да еще с созданием различных ссылок на объекты - то такое возможно. Как вариант попробовать принудительно ВСЕ объектные переменные(Range, Worksheet, ссылки через CreateObject и т.п.) очищать принудительно через Set myVar = Nothing. Т.к. VB хоть и очищает все переменные по окончании процедуры, не всегда это у него получается удачно и какие-то ссылки могут вести на несуществующую область памяти и в зависимости от структуры кода накапливать общий объем таких ссылок.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄