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

Как можно удалить или очистить тело макроса после его исполнения из самого себя?

29.06.2010, 12:30. Показов 6308. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажите пожалуйста! Как можно удалить или очистить тело макроса после его исполнения из самого себя?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2010, 12:30
Ответы с готовыми решениями:

Можно ли удалить тело макроса не удаляя книгу, где он находится?
Господа, вопрос! Можно ли удалить тело макроса не удаляя книгу, где он находится. т.е. другими словами макрос должен удалить макрос. ...

Можно ли удалить объект экземпляра класса из самого себя?
Привет! Допустим: class TEST { public: TEST(); ~TEST(); void DelMe() {

Удаление самого себя во время исполнения
Всем привет. Как программа может удалить саму себя во время исполнения без закрытия? Как я думаю (теоретически), можно затереть...

4
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
30.06.2010, 08:04
Была такая проблема и порывшись в куче книг и Help'ов я пришел к выводу - программно можно считать тело макроса, а вот записать или удалить не получилось ни как и похоже во всех n - кол-вах литературы нет ничего об этом!
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
01.07.2010, 14:37
Выполняемый макрос удалить невозможно - любое его программное
изменение вызовет ошибку. Можно удалить модуль (а если несколько
усложнить код - любую процедуру) из макроса, расположенного
в другом модуле (процедуру из другой процедуры) следующим методом:
Visual Basic
1
2
3
4
5
With Application.VBE.ActiveVBProject.VBComponent('Module1').CodeModule
    For i = 1 To .CountOfLines
        .DeleteLines i
    Next i
End With
Вариант: With Application.VBE.VBProject(Имя_проекта).V BComponent...
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
01.07.2010, 22:34
Появилось время - вернёмся к 'нашим баранам'

Корректная формулировка, конечно, не 'удалить модуль', а 'удалить
текст кода в модуле'

Заметил опечатку
Правильно (т.к. это коллекция): ...VBComponents('Module1').CodeModule

Чтобы удалить, например, модуль, содержащий выполняемую процедуру,
в код процедуры необходимо поместить следующее:
Visual Basic
1
2
3
With ThisWorkbook.VBProject
    .VBComponents.Remove .VBComponents(Имя_модуля)
End With
Удачи!
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
04.07.2010, 12:48
Продолжаю.

Выводы (см. отв. 1 и 2):
- Из исполняемой процедуры можно вызвать другую
процедуру, которая удалит первую;
- Из исполняемой процедуры можно удалить модуль, её содержащий,
разместив в ней соответствующий код.

Для реализации первой возможности нужно воспользоваться событием
Excel 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
26
27
28
29
30
31
32
33
34
35
Sub УдаляетсяПослеВыполнения()
 
'Рабочий код процедуры
'_______________________________
'Обеспечиваем удаление процедуры
With ThisWorkbook.Sheets(1)  'Передаём в procRemoverProc имя процедуры и модуля, её содержащего
    .range('A1') = 'УдаляетсяПослеВыполнения'
    .range('A2') = 'Module1'
End With
Application.OnTime Now + TimeValue('0:00:03'), 'procRemoverProc'  ' Можно, наверное, уменьшить задержку до секунды
End Sub
 
Public Sub procRemoverProc()
' Удаляет процедуру
Dim i As Long, lngType As Long, strFindProcName As String, strProcName As String, _
    strModuleName As String
 
With ThisWorkbook   ' Принимаем имя процедуры и модуля, её содержащего
    strFindProcName = .Sheets(1).range('A1')
    strModuleName = .Sheets(1).range('A2')
    .Sheets(1).range('A1') = Empty
    .Sheets(1).range('A2') = Empty
    With .VBProject.VBComponents(strModuleName).CodeModule
        For i = 1 To .CountOfLines
            strProcName = .ProcofLine(i, lngType)  'Присваиваем переменной имя процедуры
            If strProcName = strFindProcName Then  'Проверяем имя процедуры на соответствие искомому
 
                .DeleteLines i - 1, .ProcCountLines(strProcName, lngType)  ' Удаляем процедуру
            Else
                i = i + .ProcCountLines(strProcName, lngType)' Переходим к следующей процедуре
            End If
        Next i
    End With
End With
End Sub
Если используется Excel 2002 (2003), то для обеспечения выполнения действий
по программному изменению кода в Excel необходимо выполнить
Сервис –> Макросы –> Безопасность –> Надёжные источники:
Доверять доступ к Visual Basic Project (ToolsMacroSecurity, Trust access to VB project).

Передать имя процедуры и модуля в procRemoverProc можно и иначе, например, через внешний
файл или реестр. Может быть, можно передать и напрямую (как - не знаю, по-моему OnTime
такую возможность не предусматривает).

Удачи!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.07.2010, 12:48
Помогаю со студенческими работами здесь

Как удалить MovieClip из нутри самого себя
Здрасти. Подскажите. Как удалить MovieClip из нутри самого себя???

Можно ли в StringGrid после создания типизированного файла выделить элемент списка и заменить его или удалить?
Скажите пожалуйста,можно в stringgrid после создания типизированного файла выделить элемент списка и заменить его или удалить? Если да,то...

Можно ли сослаться на самого себя?
Вопрос на засыпку, есть форма 'frm1', в которой есть список lst1, чтобы он делал какое-то действие по изменению (событие onchange) я пишу...

Как делать скрипт не одноразовым, чтобы его выполнение продолжалось и после удачного исполнения?
В Питоне нет меток, я не представляю как сделать, что бы скрипт продолжался и после удачного исполнения.

Класс который можно вложить в самого себя
Как можно создать класс, который может вкладываться в самогосебя? Класс может быть дюбого типа, но вкладываться должны все. Через...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru