Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 46
1

Несанкционированный выброс из цикла

19.12.2012, 18:21. Показов 1231. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, нужна помощь знающих!
Есть программа, код:
Visual Basic
1
2
3
4
5
6
7
8
9
Sub CmbProg_Click()
 For i = 0 To 6
  If CmbProg.Text = CmbProg.List(i) Then NumberProg = i + 1
 Next i
 If NumberProg <> 7 Then
    For j = 9 To 10
     Rows(j).EntireRow.Hidden = True
    Next j
end if
проблема в том, что при начале второго цикла (где скрываются строки), вместо того,чтобы завершить цикл (скрыть все строки с 9-ой по 16-ую), выполнение программы после j=9 перескакивает снова на самую первую строку программы...а далее, при начале повторного выполнения цикла со скрытием строк-выдается ошибка. Почему так происходит, почему происходит выброс из цикла?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2012, 18:21
Ответы с готовыми решениями:

Выброс числа во время цикла
Такая вот программка - человек вводит первое число(от) и второе (до) куда якобы искать. при...

Несанкционированный доступ
Сегодня ночью по Латвийскому времени, примерно около трёх ночи антивирус заблокировал попытку...

Возможен ли несанкционированный доступ?
Недавно мой ноутбук БЕЗ ВИНЧЕСТЕРА побывал в чужих руках. Есть ли вероятность того что в...

Несанкционированный доступ к компьютеру (RMS)
Доброго времени суток. Собственно, в заголовке вся суть. Доверился человеку, запустил .exe, но...

17
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
19.12.2012, 19:57 2
А если закомментировать строку

Visual Basic
1
Rows(j).EntireRow.Hidden = True
то всё нормально работает?
1
Заблокирован
19.12.2012, 20:29 3
Chiks, распиши цель задачи нашим языком, пожалста
1
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 46
20.12.2012, 10:30  [ТС] 4
Цитата Сообщение от SoftIce Посмотреть сообщение
А если закомментировать строку

Visual Basic
1
Rows(j).EntireRow.Hidden = True
то всё нормально работает?
Да, если закомментить, то все работает нормально...что не правильно в этой строчке-непонятно для меня

Добавлено через 3 минуты
Цитата Сообщение от Апострофф Посмотреть сообщение
Chiks, распиши цель задачи нашим языком, пожалста
Цель: при выборе из выпадающего списка определенного значения -некоторые строки Excel должны отображаться, если выбрано любое другое значение из того же списка, то строки должны скрываться. Но в том коде,что я привел-есть какая-то ошибка,связанная с процедурой скрытия строк-почему то выкидывает из цикла снова на начало выполнения всей процедуры...
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
20.12.2012, 10:44 5
Цитата Сообщение от Chiks Посмотреть сообщение
Да, если закомментить, то все работает нормально..
Со 99% уверенностью могу сказать, что "выброса" из цикла не происходит, а выполнение кода
Visual Basic
1
Rows(j).EntireRow.Hidden = True
вызывает цепь событий (каких, не могу сказать,не посмотрев код), в конце которой событие CmbProg_Click


Так что всё логично
1
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 46
20.12.2012, 10:55  [ТС] 6
Цитата Сообщение от SoftIce Посмотреть сообщение
Со 99% уверенностью могу сказать, что "выброса" из цикла не происходит, а выполнение кода
Visual Basic
1
Rows(j).EntireRow.Hidden = True
вызывает цепь событий (каких, не могу сказать,не посмотрев код), в конце которой событие CmbProg_Click


Так что всё логично
весь код процедуры здесь:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub CmbProg_Click()
 For i = 0 To 6
  If CmbProg.Text = CmbProg.List(i) Then NumberProg = i + 1
 Next i
 If NumberProg <> 7 Then
    For j = 9 To 16
     Rows(j).EntireRow.Hidden = True
    Next j
    Chk1.Visible = False
    Chk2.Visible = False
    Chk3.Visible = False
    Chk4.Visible = False
    Chk5.Visible = False
    Chk6.Visible = False
    Chk7.Visible = False
 Else
    For i = 9 To 16
     Rows(i).EntireRow.Hidden = False
    Next i
    Chk1.Visible = True
    Chk2.Visible = True
    Chk3.Visible = True
    Chk4.Visible = True
    Chk5.Visible = True
    Chk6.Visible = True
    Chk7.Visible = True
 End If
End Sub
К сожалению, продолжает выкидывать...при пошаговым выполнении, только одна строчка из цикла скрывается а далее процедура начинает выполняться снова...и, когда снова дойдет до цикла с сокрытием строк - вылетает ошибка "Run-time error '1004': Нельзя установить свойство Hidden класса Range"
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
20.12.2012, 11:02 7
Цитата Сообщение от Chiks Посмотреть сообщение
К сожалению, продолжает выкидывать.



Да не выкидывает из цикла.
Причина не в коде этой процедуры.

Где то в другом месте.

Весь код секретный?
1
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 46
20.12.2012, 11:09  [ТС] 8
Да нет, конечно, не секретный))Я весь код дал...ни одной другой строчки кода в данной книге Excel нет...Дело не может быть в настройках Excel на данном конкретном компьютере?
0
Заблокирован
20.12.2012, 11:12 9
Для начала давайте определимся с разделом.
Очевидно речь идёт об VBA?
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
20.12.2012, 11:13 10
Цитата Сообщение от Chiks Посмотреть сообщение
в данной книге Excel
Книга тоже секретная?
0
Заблокирован
20.12.2012, 11:18 11
Chiks, кем и как заполняется список CmbProg?
0
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 46
20.12.2012, 11:27  [ТС] 12
Цитата Сообщение от SoftIce Посмотреть сообщение
Книга тоже секретная?
Книга вот здесь
Вложения
Тип файла: rar Книга1.rar (25.0 Кб, 6 просмотров)
0
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 46
20.12.2012, 11:29  [ТС] 13
Цитата Сообщение от Апострофф Посмотреть сообщение
Chiks, кем и как заполняется список CmbProg?
Список строго задан на том же листе Excel (адреса ячеек прописаны в свойстве ListFillRange списка).
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 449
20.12.2012, 11:33 14
1. попробуйте вынести эту строку в отдельную функцию
2. попробуйте переместить вызывающую кнопку в другую область листа (кнопку, листбукс)
3. запретите EnableEvents
4. когда проходите в дебаге и снова выходите (как вы говорите) на первую строку - нажмите Ctrl+L - и изучите порядок вызовов функций (возможно, между вылетом и переходом отрабатывает что-то еще)
0
Заблокирован
20.12.2012, 11:41 15
Chiks, опустите источник списка ниже 16 строки листа и данная проблема исчезнет.
1
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 46
20.12.2012, 11:46  [ТС] 16
Цитата Сообщение от Апострофф Посмотреть сообщение
Chiks, опустите источник списка ниже 16 строки листа и данная проблема исчезнет.
Да, благодарю))ступил я сильно)

Добавлено через 1 минуту
Цитата Сообщение от StepInLik Посмотреть сообщение
1. попробуйте вынести эту строку в отдельную функцию
2. попробуйте переместить вызывающую кнопку в другую область листа (кнопку, листбукс)
3. запретите EnableEvents
4. когда проходите в дебаге и снова выходите (как вы говорите) на первую строку - нажмите Ctrl+L - и изучите порядок вызовов функций (возможно, между вылетом и переходом отрабатывает что-то еще)
Спасибо за отклик!не могли бы уточнить мне на будущее, что означает пункт 3?где его можно запретить?
0
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
20.12.2012, 12:38 17
В любом месте кода:
Visual Basic
1
Application.EnableEvents=false
Так Эксель не будет реагировать на события, произведённые кодом, да и вообще.
Поэтому не забудьте в конце сделать обратное.
1
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
20.12.2012, 16:02 18
Application.EnableEvents относится к событиям приложения (Worksheet_SelectionChange, Workbook_Open и т.д.).
На события элементов управления эта установка никак не влияет!
Для запрещения обработки событий элементов управления приходится вводить переменную-флаг и проверять ее состояние, например
Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim busy As Boolean 'переменная модуля
 
Private Sub CmbProg_Click()
If busy Then Exit Sub 'немедленный выход из процедуры обработки события
busy = True
 
'здесь код, который может вызвать события и повторный вызов этой процедуры
 
busy = False
End Sub
1
20.12.2012, 16:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2012, 16:02
Помогаю со студенческими работами здесь

Выброс исключений
Всем привет! Не знаю как правильно представить методы через tcy catch. Сама программа просит...

Выброс из top10
У меня ситуация такая, до сегодняшнего дня по ключевому запросу я находился на 2-ом месте у...

Выброс пользователя
Привет всем. ситуация: под одним виндовс-пользователем запускается 2-3 копии 1с, каждая копия под...

Несанкционированный доступ к БД? Загадочный пользователь 'shuntsov'
Ребята, подскажите, а то поддержка reg.ru динамит и сваливает все на меня самого, а я уже начинаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru