Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/23: Рейтинг темы: голосов - 23, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 13.02.2010
Сообщений: 3

VBA - запуск макросов, сообщение об ошибке, цикл

13.02.2010, 04:23. Показов 4445. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи! Есть вопрос по заданию по программированию в универе (уровень знаний - ознакомительный), если поможете и как можно скорее, то буду очень благодарна.

Задача такова:
создать 2 любых макроса в Worde.
создать форму (2 optionButton, 1checkBox, 2commandButton - OK и CANCEL), которая будет запускать эти макросы так:
1. включен OptionButton1 и CheckBox1 => макрос1
2. включен OptionButton2 и CheckBox1 => макрос2
Если ничего не выбрано или выбран только CheckBox1 и нажать ОК, вывести сообщение типа "ошибка".
Позволить ошибаться 4 раза и закрыть форму.
Форма также должна закрываться по CANCEL.

Я кое-что сделала, НО... поскольку нет опыта, то и результаты такие. В общем, как там видно, у меня при ошибке сообщение выскакивает и подряд все 4 раза открывается. Так не должно быть. Может, можете помочь?
Вложения
Тип файла: doc Docum.doc (42.0 Кб, 32 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2010, 04:23
Ответы с готовыми решениями:

Как открыть книгу (Excel) из VBA и при этом отключить запуск макросов в ней
Есть самостоятельный документ (книга Excel с запуском макроса на открытие этой книги) - нужно из другой книги открыть её так, чтобы макрос...

Последовательный запуск макросов
Привет всем. Не много поясню картину: На данный момент у меня 3 компа, на них сразу открываю по 3-4 файла(книги), и запускаю на каждой...

Запуск 10 макросов с 1 файла
Здравствуйте! Такая ситуация имеется 10 папок, в каждой есть по одному WORD файлу с одинаковым макросом (меняет связи в зависимости от...

9
 Аватар для ironegg
1905 / 782 / 31
Регистрация: 11.02.2010
Сообщений: 1,567
13.02.2010, 05:15
в разделе объявления модуля формы необходимо объявить переменную типа Static
это такая переменная которая не исчезает при выходе из процедуры (но изчезает при закрытии формы). в теле обработчика нажатия кнопки следует поместить оператор увеличения этой переменной на единицу и проверку - не превысило ли ее значение 4. если превысило - закрыть форму.


ну и условия твои... вместо того, чтобы перебирать все возможные комбинации давай при входе в процедуру обработки кнопки проверим - установлен ли чекбокс, и если он установлен, проверим оператором Case ... Else какой оптион установлен и установлен ли он вообще.

Добавлено через 2 минуты
потом код можно будет украсить и оптимизировать. чтобы получить хорошую отметку

Добавлено через 3 минуты
если бы ты использовал для отладки клавишу F8, то разобрался бы и сам.
если в режиме останова навести мышу на выражение или переменную, узнаешь текущее значение
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.02.2010, 08:14
innannai,
Вложения
Тип файла: doc Docum.doc (46.0 Кб, 51 просмотров)
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.02.2010, 10:51
Интересно, а в банкоматах также создаётся статичная переменная и если ты 3 раза неправильно ввёл код, то карточка блокируется.
0
 Аватар для ironegg
1905 / 782 / 31
Регистрация: 11.02.2010
Сообщений: 1,567
13.02.2010, 12:13
действительно. с select... case я загнул. перепутал с чем то вроде RadioButtonList (который возвращает номер выбранного элемента)

развивая идею Busine2009... вот вариант без лишнего ветвления. ветвление исключено благодаря включению одного оптионБокса по умолчанию (при загрузке формы программно или в конструкторе в окне свойств), что, кстати, является хорошим стилем
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub CommandButton1_Click()
    Static vError As Long
 
    If OptionButton1 And CheckBox1 Then
        vError = 0
        Macros1Docum
    ElseIf OptionButton2 And CheckBox1 Then
        vError = 0
        Macros2Docum
    ElseIf vError < (4 - 1) Then
        MsgBox "неправильный ввод!"
        vError = vError + 1
    Else
        Unload Me
    End If
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
Private Sub CommandButton1_Click()
    Static vError As Long
 
    If CheckBox1 Then
        If OptionButton1 Then
            vError = 0
            Macros1Docum
            Exit Sub
        ElseIf OptionButton2 Then
            vError = 0
            Macros2Docum
            Exit Sub
        End If
    End If
        
    If vError < (4 - 1) Then
        MsgBox "неправильный ввод!"
        vError = vError + 1
    Else
        CommandButton2_Click
    End If
End Sub
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.02.2010, 12:58
Цитата Сообщение от ironegg Посмотреть сообщение
(4 - 1)
вот это непонятно.
Я вот так ещё сейчас сделал, я на самом деле очень плохо знаю VBA.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub CommandButton1_Click()
Static vОшибка As Long
If (OptionButton1 = True) And (CheckBox1 = True) Then
    Macros1Docum
ElseIf (OptionButton2 = True) And (CheckBox1 = True) Then
    Macros2Docum
Else
    If vОшибка < 4 Then
        MsgBox "Неправильный выбор!"
        vОшибка = vОшибка + 1
    Else
vОшибка  = empty
        Unload Me
    End If
End If
End Sub
0
 Аватар для ironegg
1905 / 782 / 31
Регистрация: 11.02.2010
Сообщений: 1,567
13.02.2010, 13:34
это для читабельности прием. VBA ведет счет от нуля. поэтому можно написать 4-1. будет понятно, что нам надо четыре раза. а компилятор при первом проходе вычислит это выражение и сохранит как константу 3, скорость кода не ухудшается

Добавлено через 10 минут
не обязательно очищать статическую переменную. она и так перестает существовать при закрытии формы. а вот обнулить этот счетчик в случае успешного запуска макроса наверное стоит.


innannai, как насчет автостарта твоей формы при открытии документа. обрати внимание на событие документа Document_Open()

Добавлено через 15 минут
innannai, можно и кнопочку на первой странице для повторного запуска формы.

и макрос ты как то нечестно запускаешь. может вот в таком духе?
Visual Basic
1
Application.Run "'My Document.doc'!ThisModule.ThisProcedure"
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.02.2010, 13:41
ironegg,
кстати ты прав, надо полностью прописывать путь к макросу. Я с этим как-раз вчера столкнулся. Сейчас делаю новый шаблон и вставляю в него модули и коды из старых шаблонов. У меня тоже есть макросы по вызову других макросов, и я их вызывал по имени процедуры. А у меня в проекте оказалось 2, а может и больше (я потом сразу переделал), процедуры с одинаковыми именами. Я сижу делаю работу и вдруг появляется совсем из другой оперы.
0
2 / 2 / 0
Регистрация: 13.02.2010
Сообщений: 3
13.02.2010, 13:43  [ТС]
ой) да, неправильно запускаю, знаю) но это уже ладно.
автооткрытие - это, конечно, хорошо, как и кнопка автозапуска, но абсолютно не нужна по заданию.
а так в дальнейшем - , буду исправляться.
спасибо, ребята, все работает, беру два ваших варианта.
рада, что от лишней моей писанины избавились. и форма Static для меня теперь понятна.
правда, утречком пришлось немного помучаться, разбираясь в select case, хаха
задание выполнено.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.02.2010, 13:54
innannai,
вот это говорят не нужно, так что можешь удалить
Visual Basic
1
vОшибка  = empty
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2010, 13:54
Помогаю со студенческими работами здесь

Поделюсь шаблонами макросов VBA
Кому интересно? Простите за вредность. Я собрал 130 шаблонов макросов со всех форумов, кто поможет мне найти прогу для складского учёта...

Предупреждение системы… Запуск макросов отключен
Здравствуйте! С недавних пор, после запуска и создания нового документа, Word 2016 стал показывать жёлтую ленту с таким сообщением: ...

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

Запуск макросов из Delphi. 1-создание 2-удаление
здравствуйте у меня есть 2 макроса в excel. при экспорте я запускаю один макрос для объединения ячеек . второй макрос ( для удаления...

Создание формы для выполнения макросов VBA
Здравствуйте! Нужно создать форму с полями для ввода и кнопками для выполнения макроса. Имеется 2 таблицы, нужно сделать так, чтобы...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru