Страницы: 1
RSS
Как запретить выполнение Private Sub листа при открытии других книг
 
Добрый день, уважаемые форумчане!
В Экселе на VBA написал код, обрабатывающий события листа (операции с комбобоксами), код работает правильно, быстро и хорошо, но стоит запустить параллельно другой файл Excel (без всяких макросов), как все начинает дико тормозить, и в строке состояния видно, что постоянно выполняются расчеты. Методом проб и ошибок выяснил, что виной код именно на листе (не в отдельном модуле). Как я понял, при открытии другого файла этот код пытается обработать данные другого файла, хотя экранирован с помощью Private Sub. Еще момент, если сделать копию этого же файла и запустить параллельно оба, то никаких тормозов не наблюдается.
Просто у меня 10 таких листов с подобными кодами обрабатывающие каждый свои комбобоксы (данные для комбобоксов берутся из сводных таблиц).
Код прилагаю:
Код
Private Sub ComboBox1_Change()
    On Error Resume Next
    Dim listname As String
    listname = "=Изд1"
    ThisWorkbook.Sheets(listname).Range("a3").Value = ThisWorkbook.Sheets(listname).ComboBox1.Value
    ThisWorkbook.Sheets("Список всех элементов").Range("g1").Value = ThisWorkbook.Sheets(listname).ComboBox1.Value
End Sub

Private Sub ComboBox2_Change()
    On Error Resume Next
    Dim listname As String
    listname = "=Изд1"
    ThisWorkbook.Sheets(listname).Range("a4").Value = ThisWorkbook.Sheets(listname).ComboBox2.Value
End Sub
Прочитал про опцию Option Private Module, но она не работает на листах, а только в отдельных модулях. Но видимо нужно нечто подобное.
Прошу помощи.
 
1. Option Private Module всего лишь предотвращает отображение процедур в листе макросов.
2. Вполне возможно, что проблема и связана с комбобоксами, но не напрямую. Конкретно в этих кодах, что либо этакое отсутствует.
 
RAN, спасибо! Решил проблему только отключением работы комбобоксов на листах по условию с кнопкой-переключателем. В ячейке U5 соответственно кнопкой меняется ЛОЖЬ, ИСТИНА.
Код
If ThisWorkbook.Sheets(listname).Range("u5") = True Then
    ThisWorkbook.Sheets(listname).Range("a3").Value = ThisWorkbook.Sheets(listname).ComboBox1.Value
    ThisWorkbook.Sheets("Список всех элементов").Range("G1").Value = ThisWorkbook.Sheets(listname).ComboBox1.Value
    Else
End If
 
Сир! Пересчет ячеек листа при изменении других открытых книг может быть вызван наличием "летучих" (volatile) функций на листе. Хорошо бы их найти и обезвредить.
Владимир
 
sokol92 (Falcon  ;) ), спасибо за наводку, покопал в этой области, и даже скачал ваш же скрипт TestVolatile.xlsm (отдельное спасибо за него).
Что интересно, когда кнопка (см. пост #3) выключена - показывает, что в книге нет "летучих" функций. Но стоит включить кнопку и снова протестить вашим скриптом, сразу ругается на этот текущий лист. Методом исключения нашел строки в коде, которые он считает как "летучие":
Код
ThisWorkbook.Sheets("Список всех элементов").Range("g1").Value = ThisWorkbook.Sheets(listname).ComboBox1.Value
и во втором сабе соотетственно:
Код
ThisWorkbook.Sheets(listname).Range("a4").Value = ThisWorkbook.Sheets(listname).ComboBox2.Value
Найти их - нашел, но обезвреживать не могу - на этом все строится. Немного перекроил код так, чтоб при включении комбо на одном листе, на остальных листах он отключается, и по умолчанию при открытии файла насильно выключались все комбобоксы. То есть включать его можно только по мере надобности. Эдакий компромисс между скоростью и удобством!
 
Спасибо за исследование, успехов!
Владимир
Страницы: 1
Наверх