Страницы: 1
RSS
Как в VB обойти ошибку "Procedure too large"
 
Структура файла Excel следующая:  
отображаются нужные строки с именами в зависимости от выбранных условий в табличке.  
 
Нашел стандартный код для реализации:  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
If Range("f3").Value = "Да" Then  
Rows("2").EntireRow.Hidden = True  
Rows("3").EntireRow.Hidden = True  
Else  
Rows("2").EntireRow.Hidden = False  
Rows("3").EntireRow.Hidden = False  
End If  
End Sub  
 
 
Все бы ничего, но условий пара десятков, а строк попадающих под Скрыть/Показать около сотни. Т.е код сам простой, но его доволно много, т.к. много If-ов и вот этих строк Rows("N").EntireRow.Hidden = True/False.  
 
В итоге на полпути компилятор стал ругаться, выдавая "Procedure too large".  
 
Стал гуглить, на форумах всплыла подсказка, мол, если свыше 1000 строк в коде, то процедура считается перегруженной и следует разбить код на несколько процедур, а затем соединить их событием клика.  
И описали:  
 
Private Sub A  
...  
End Sub  
 
Private Sub B  
...  
End Sub  
 
Private Sub cmbGo_Click()  
A:B  
End Sub  
 
 
Я было обрадовался, но не тут то было.  
Фигня в том, что Worksheet_SelectionChange - это базовая процедура, обращающаяся к своим переменным и каким-то библиотекам.  
Т.е. переименовать ее на №1, №2 и т.д. - нельзя.  
Тогда напрашивалось очевидное: обернуть блоки кода в новые процедуры, обозначая в каждом блоке, что работаем в этом самом Worksheet_SelectionChange:  
 
Private Sub A  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
...  
End Sub  
End Sub  
 
Private Sub B  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
...  
End Sub  
End Sub  
 
но и так васёк ругается, видимо нельзя содержать процедуру в процедуре:(  
 
 
 
Вот и дошли до вопроса:    
КАК БЫТЬ?  
Если никак иначе кроме разбивки на подпроцедуры не обойти ошибку "Procedure too large", то как грамотно разделять их выполняя по сути все ту же Worksheet_SelectionChange?  
Есть ли другие решения задачи?
 
Решения есть. Вам просто надо выложить файл. С пояснениями - чего хочу. Судя по описанию код у Вас тот еще!
Я сам - дурнее всякого примера! ...
 
Сформулировать алгоритм типа "если значение ячейки номер Х в столбце F равно "Да",то скрыть строки Х и Х-1, иначе отобразить эти строки".  
Реализовать алгоритм с помощью цикла.  
Будет ~10 строк.
 
Леш, так можно в одну строку(скрыть строки с константами). Пока неясно, чего автору надо. Давай подождем.
Я сам - дурнее всякого примера! ...
 
возможно вас интересовали функцией типа    
Sub Mysub1(ByVal Target As Range)  
Sub Mysub2(ByVal Target As Range)  
...  
в них прописать блоки из Worksheet_SelectionChange  
 
при вызове передавать то, что пришло сверху  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
Mysub1 Target  
Mysub2 Target  
...  
End Sub  
 
с циклом конечно будет компактнее
 
Ок, выкладываю файл.  
В нем в зависимости от условий заемщика-юр.лица выбирает пакет документов на кредит.  
Проблемный лист - "к сделке", именно там больше всего документов и соотв. код на строк > 1000. В 3 других листах код работает как надо, т.к. объем меньше.  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
может не пересчитыватьвсе время все диапазоны, а привязаться к событию изменения диапазона и проверять только одиН?  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
 
select case target.address(0,0)  
case "f3" : application.run "sub"& target.address(0,0)
Живи и дай жить..
 
Во-1, Правила: http://www.planetaexcel.ru/forum.php?thread_id=8735  
Во-2, покажу, как оптимизировать код из стартового топика, делайте по аналогии:  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
Rows("2:3").Hidden = Range("f3").Value = "Да"  
End Sub
 
Казанский,  
спасибо, вот это сокращение    
Rows("2:3")  
мне и помогло существенно сэкономить строки
Страницы: 1
Читают тему
Наверх