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

Зависание программы при попытке запуска CommandButton1_Click из него самого

23.02.2023, 17:35. Показов 461. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Играюсь тут с VBA, сделал программу - маленькая кнопка ползает по userform с замедлением в 1 секунду, влево-вправо-вверх-вниз случайным образом, не вылазя за границы самой формы (500 х 500)

Но при попытке запуска программы она зависает, я наверное что-то не понимаю. По видимому из-за того, что я прямо из
Sub CommandButton1_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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Private Sub Random_Case()
Randomize
caseid = (Int((4 - 1 + 1) * Rnd + 1))
End Sub
 
 
Private Sub CommandButton1_Click()
Random_Case
Select Case caseid
 
Case 1
        If CommandButton1.Left >= 20 Then
        Application.Wait Now + #12:00:01 AM#
        CommandButton1.Left = CommandButton1.Left - 10
        'CommandButton1_Click
        Else
        'CommandButton1_Click
        End If
 
Case 2
        If CommandButton1.Left <= 480 Then
        Application.Wait Now + #12:00:01 AM#
        CommandButton1.Left = CommandButton1.Left + 10
        'CommandButton1_Click
        Else
        'CommandButton1_Click
        End If
 
 
Case 3
        If CommandButton1.Top >= 20 Then
        Application.Wait Now + #12:00:01 AM#
        CommandButton1.Top = CommandButton1.Top - 10
        'CommandButton1_Click
        Else
        'CommandButton1_Click
        End If
 
Case 4
        If CommandButton1.Top <= 480 Then
        Application.Wait Now + #12:00:01 AM#
        CommandButton1.Top = CommandButton1.Top + 10
        'CommandButton1_Click
        Else
        'CommandButton1_Click
        End If
End Select
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2023, 17:35
Ответы с готовыми решениями:

Зависание BIOS при попытке войти в него
Конфигурация ПК: Материнская палата - Gigabyte GA-970A-DS3P; ЦП - QuadCore AMD FX-4300, 3918 MHz;...

Зависание программы при попытке пинга сервера
Доброго времени суток, Написал программу для переделки обычного ПК с ОС Windows в некое подобие...

Ошибка при попытке компиляции и последующего запуска программы
Доброго времени суток! Недавно появился один глюк, который очень сильно напрягает и который я уже...

Отображение скрытого в трее окна программы при попытке запуска ее копий
Имеется код: HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, &quot;MyApp&quot;); if(!hMutex) hMutex =...

9
396 / 319 / 58
Регистрация: 29.06.2019
Сообщений: 480
23.02.2023, 20:10 2
Лучший ответ Сообщение было отмечено sesna7 как решение

Решение

Visual Basic
1
2
3
4
Private Sub CommandButton1_Click()
Randomize
my_Procedure
END SUB
в отдельном модуле
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
29
30
dim caseid as long
 
Sub Random_Case()
caseid = Int(4 * Rnd + 1)
End Sub
 
Sub my_Procedure()
Random_Case
with UserForm1
Select Case caseid
Case 1
        If .CommandButton1.Left >= 20 Then
          .CommandButton1.Left = .CommandButton1.Left - 10
        End If
Case 2
        If .CommandButton1.Left <= 480 Then
          .CommandButton1.Left = .CommandButton1.Left + 10
        End If
Case 3
        If .CommandButton1.Top >= 20 Then
          .CommandButton1.Top = .CommandButton1.Top - 10
        End If
Case 4
        If .CommandButton1.Top <= 480 Then
          .CommandButton1.Top = .CommandButton1.Top + 10
        End If
End Select
Application.OnTime Now + TimeValue("00:00:01"), "my_Procedure"
end with
End Sub
0
396 / 319 / 58
Регистрация: 29.06.2019
Сообщений: 480
24.02.2023, 09:39 3
Но можно и без ONTIME обойтись
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
Option Explicit
Dim B As Boolean
 
Private Sub CommandButton1_Click()
Dim H!, W!, D!
Randomize
H = InsideHeight - CommandButton1.Height
W = InsideWidth - CommandButton1.Width
B = Not B
While B
  DoEvents
  D = Int(Rnd * 4)
  CommandButton1.Left = CommandButton1.Left + Array(0, 0, 10, -10)(D)
  If CommandButton1.Left < 0 Then CommandButton1.Left = 0
  If CommandButton1.Left > W Then CommandButton1.Left = W
  CommandButton1.Top = CommandButton1.Top + Array(-10, 10, 0, 0)(D)
  If CommandButton1.Top < 0 Then CommandButton1.Top = 0
  If CommandButton1.Top > H Then CommandButton1.Top = H
  Application.Wait Now + 1 / 86400
Wend
End Sub
 
Private Sub UserForm_Terminate()
B = False
End Sub
0
1 / 1 / 1
Регистрация: 06.04.2021
Сообщений: 42
24.02.2023, 10:08  [ТС] 4
SergioJek, Спасибо большое, все работает, но есть одна маленькая проблема - я абсолютно не понимаю, КАК это работает.

Новый код понимаю еще меньше.
0
396 / 319 / 58
Регистрация: 29.06.2019
Сообщений: 480
24.02.2023, 10:14 5
sesna7, какая из строк вызывает замешательство?
1
1 / 1 / 1
Регистрация: 06.04.2021
Сообщений: 42
24.02.2023, 10:26  [ТС] 6
Многие . Я новичок совсем.

Цитата Сообщение от SergioJek Посмотреть сообщение
.CommandButton1.Left
- почему с точкой в начале?

with UserForm1
- вообще непонятно, для чего это

Application.OnTime Now + TimeValue("00:00:01"), "my_Procedure"
- т.е. фактически я вызываю процедуру повторно прямо из нее, то, что я делал в своем коде, но тут это не вызывает зависания. И почему в кавычках не просто:

Visual Basic
1
2
Application.OnTime Now + TimeValue("00:00:01")
my_Procedure
0
396 / 319 / 58
Регистрация: 29.06.2019
Сообщений: 480
24.02.2023, 10:35 7
sesna7, кнопка F1 у Вас есть?

Цитата Сообщение от sesna7 Посмотреть сообщение
я вызываю процедуру повторно прямо из нее
Такой подход приводит к зависанию и переполнению стека вызовов в итоге.
Почитайте про рекурсию...
1
1 / 1 / 1
Регистрация: 06.04.2021
Сообщений: 42
24.02.2023, 10:37  [ТС] 8
Ладно, наверное глупые вопросы, пошёл сам разбираться, спасибо еще раз за помощь.

Добавлено через 2 минуты
Цитата Сообщение от SergioJek Посмотреть сообщение
Такой подход приводит к зависанию и переполнению стека вызовов в итоге.
Почитайте про рекурсию...
Я это сразу понял еще со своим кодом и начал думать, как обойти это.
А вот почему ваш код не вызывает рекурсию - этого не пойму пока. Но постараюсь понять. Спасибо.
0
396 / 319 / 58
Регистрация: 29.06.2019
Сообщений: 480
24.02.2023, 10:46 9
Цитата Сообщение от sesna7 Посмотреть сообщение
А вот почему ваш код не вызывает рекурсию
Потому что тут нет рекурсии, процедура идет дальше и заканчивается.
Процедуру "my_Procedure" вызывает не сама процедура, а Application, т.е. Excel.
1
1 / 1 / 1
Регистрация: 06.04.2021
Сообщений: 42
24.02.2023, 10:46  [ТС] 10
Цитата Сообщение от sesna7 Посмотреть сообщение
with UserForm1
Понял. Иду дальше. Просто не сразу понял, что в With можно еще и If засунуть.
0
24.02.2023, 10:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2023, 10:46
Помогаю со студенческими работами здесь

Ошибка "Permission denied" при попытке запуска программы
Не могу запустить свой &quot;Hello world&quot;. Написал программу в текстовом файле, как положено. Hello.cpp...

Зависание компьютера при попытке малейшего разгона
Добрый Вечер, проблема заключается в следующем: При попытке малейшего разгона процессора система...

Зависание системы Windows 10 после запуска файла или программы от имени администратора
При запуске любого файла или приложения от имени администратора пк зависает, не реагирует ни на...

Зависание Visual Studio при попытке остановить отладку
В коде есть ошибка, которую я пытаюсь решить, но при отладке в определенный момент программа тип...

Зависание командной строки при попытке выполнить код
Здравствуйте. Командная строка зависает, как бы пытается что-то выполнить но в скомпилированом...

Зависание Excel-я при попытке копирования небольшого объёма информации
Добрый день! Не могу разобраться с проблемой. Есть файл (во вложении), при попытке копирования из...

Ощибка при попытке запуска проекта
Привет всем! При сборке любого консольного приложения выскакивает предупреждение: ...


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

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