0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 3
1

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

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

Author24 — интернет-сервис помощи студентам
Скажите пожалуйста! Как можно удалить или очистить тело макроса после его исполнения из самого себя?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2010, 12:30
Ответы с готовыми решениями:

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

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

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

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

4
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
30.06.2010, 08:04 2
Была такая проблема и порывшись в куче книг и Help'ов я пришел к выводу - программно можно считать тело макроса, а вот записать или удалить не получилось ни как и похоже во всех n - кол-вах литературы нет ничего об этом!
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
01.07.2010, 14:37 3
Выполняемый макрос удалить невозможно - любое его программное
изменение вызовет ошибку. Можно удалить модуль (а если несколько
усложнить код - любую процедуру) из макроса, расположенного
в другом модуле (процедуру из другой процедуры) следующим методом:
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(Имя_проекта).VBComponent...
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
01.07.2010, 22:34 4
Появилось время - вернёмся к 'нашим баранам'

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

Заметил опечатку
Правильно (т.к. это коллекция): ...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 5
Продолжаю.

Выводы (см. отв. 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
04.07.2010, 12:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2010, 12:48
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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