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

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

23.02.2023, 17:35. Показов 489. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
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
424 / 327 / 60
Регистрация: 29.06.2019
Сообщений: 491
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
424 / 327 / 60
Регистрация: 29.06.2019
Сообщений: 491
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
Сообщений: 44
24.02.2023, 10:08  [ТС] 4
SergioJek, Спасибо большое, все работает, но есть одна маленькая проблема - я абсолютно не понимаю, КАК это работает.

Новый код понимаю еще меньше.
0
424 / 327 / 60
Регистрация: 29.06.2019
Сообщений: 491
24.02.2023, 10:14 5
sesna7, какая из строк вызывает замешательство?
1
1 / 1 / 1
Регистрация: 06.04.2021
Сообщений: 44
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
424 / 327 / 60
Регистрация: 29.06.2019
Сообщений: 491
24.02.2023, 10:35 7
sesna7, кнопка F1 у Вас есть?

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

Добавлено через 2 минуты
Цитата Сообщение от SergioJek Посмотреть сообщение
Такой подход приводит к зависанию и переполнению стека вызовов в итоге.
Почитайте про рекурсию...
Я это сразу понял еще со своим кодом и начал думать, как обойти это.
А вот почему ваш код не вызывает рекурсию - этого не пойму пока. Но постараюсь понять. Спасибо.
0
424 / 327 / 60
Регистрация: 29.06.2019
Сообщений: 491
24.02.2023, 10:46 9
Цитата Сообщение от sesna7 Посмотреть сообщение
А вот почему ваш код не вызывает рекурсию
Потому что тут нет рекурсии, процедура идет дальше и заканчивается.
Процедуру "my_Procedure" вызывает не сама процедура, а Application, т.е. Excel.
1
1 / 1 / 1
Регистрация: 06.04.2021
Сообщений: 44
24.02.2023, 10:46  [ТС] 10
Цитата Сообщение от sesna7 Посмотреть сообщение
with UserForm1
Понял. Иду дальше. Просто не сразу понял, что в With можно еще и If засунуть.
0
24.02.2023, 10:46
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2023, 10:46
Помогаю со студенческими работами здесь

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Администрирован­­­ие Git, продвинутые техники работы с Git
InfoMaster 11.01.2025
Основы управления репозиторием Эффективное управление Git-репозиторием требует глубокого понимания механизмов контроля доступа и инструментов администрирования. Рассмотрим ключевые аспекты. . .
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru