Превращение кода VBA в нечитаемый

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Как известно, для среды разработки VBA существует множество надстроек, подключаемых через Add-In Manager в VBA.

Многие из них я перепробовал, но одной нужной мне функции так и не нашёл... может, кто встречал что-либо подобное:

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

Например, такой код:

Код: Выделить всё

Public Function MyReplace(ByVal Expr As String, ByVal find As String, _
                          ByVal rep As String, Optional ByVal start As Long = 1, _
                          Optional ByVal count As Long = -1, _
                          Optional ByVal compare As VbCompareMethod = vbBinaryCompare) As String
    If start = 1 Then
        MyReplace = Replace(Expr, find, rep, start, count, compare)    'Вызов стандартной функции Replace
    Else
        MyReplace = VBA.Left(Expr, start - 1) & Replace(Expr, find, rep, start, count, compare)
    End If
End Function
превращать в что-то вроде этого:

Код: Выделить всё

Public Function A___(ByVal A____ As String, ByVal A_____ As String, _
                     ByVal A______ As String, Optional ByVal A_______ As Long = 1, _
                     Optional ByVal A________ As Long = -1, _
                     Optional ByVal AA_______ As VbCompareMethod = vbBinaryCompare) As String
    If A_______ = 1 Then
        A___ = Replace(A____, A_____, A______, A_______, A________, AA_______)
    Else
        A___ = VBA.Left(A____, A_______ - 1) & Replace(A____, A_____, A______, A_______, A________, AA_______)
    End If
End Function
Обе версии функций полностью работоспособны, однако разобраться в коде второй версии, и тем более внести в этот код изменения намного сложнее.

Нужно это всё для передачи заказчику временных версий программы (до полной оплаты проекта), чтобы заказчик вдруг не надумал отдать почти готовый код другому исполнителю на доработку за гораздо меньшую сумму. (урезать функциональность не всегда получается)
При наличии в файле нескольких тысяч строк такого кода мало кто захочет в нём ковыряться :)
Компиляцию в ComAddin использовать как-то не хочется (лишнее время отнимает, да и предпочитаю хранить код непосредственно в файле Excel)

Было бы хорошо, если бы код нажатием одной кнопки превращался бы в нечитаемый. Кто-нибудь сталкивался с подобными надстройками?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Код: Выделить всё

Sub test()
  For Each x In Application.VBE.CodePanes
    With x.CodeModule
      If .Name <> "Module2" And .CountOfLines > 0 Then
        s = .Lines(1, .CountOfLines) & vbCrLf & "'добавлено макросом"
        'MsgBox s
        .insertlines 1, " "
        .deletelines 2, .CountOfLines - 1
        .insertlines .CountOfLines, s
      End If
    End With
  Next
End Sub
Если эта процедура стоит в модуле "Module2", то она перевставляет текст всех модулей заново, добавляя к нему еще 1 строку в конце.
.insertlines 1, " "
.deletelines 2, .CountOfLines - 1
.insertlines .CountOfLines, s
- это необходимая манимуляция

Теперь дедо за малым: вместо выражения
.Lines(1, .CountOfLines) & vbCrLf & "'добавлено макросом"
написать что-то, что производит в тексте соответствующую замену :)

PS
Если в каком-то модуле проекта есть синтаксическая ошибка, то на полпути возникнет исключение!
Так что выполнение этого макроса потенциально опасно. Чревато потерей содержимого 1 модуля проекта.
Также будет исключение, если сам этот макрос вставит код с синтаксической ошибкой.
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Теперь дело за малым: вместо выражения
.Lines(1, .CountOfLines) & vbCrLf & "'добавлено макросом"
написать что-то, что производит в тексте соответствующую замену
Хорошая шутка :)
Самостоятельно писать парсер кода VBA, честно говоря, нет ни малейшего желания...
Можно, конечно, но на отладку уйдёт много времени и сил.

Проще в таком случае запутывать код при написании :) (здесь есть целая статья на эту тему)

Хотелось бы найти готовое решение... наверняка, кто-нибудь уже реализовал подобную функциональность.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Конечно парсить VBA-шный код - это задача не для VBA на первый взгляд, но были бы регулярные выражения...
Можно конечно и из макроса запустить скрипт на Perl-е...
А можно, например, DLL-ку найти с функциями для регэкспов, да и импортировать их.
КодописЕц
Сообщения: 2
Зарегистрирован: 27 мар 2009, 23:58

EducatedFool писал(а):Проще в таком случае запутывать код при написании :)
Что если обрамлять переменные метками или писать кириллицей (короче как-то выделить переменные для удобной замены), тогда действительно останется дело за малым, используя вышеуказанную процедуру test?

PS: Мной такой надстройки в просторах Интернет замечено не было, хотя видел календарик, где вместо переменных какой-то "хэш" – неужто вручную прописывали…
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Достаточно спросить Гугля о scrambling+VBA
и в два клика находим
http://www.dailydoseofexcel.com/archive ... ble-basic/
http://invisiblebasic.sourceforge.net/
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Aent, спасибо огромное!

Сам бы не додумался до запроса scrambling+VBA
Вроде то, что надо. (правда пока что процесс обработки файла не успевает завершиться - Excel вылетает раньше :) Но с этим я разберусь - найду ошибку в коде)
КодописЕц
Сообщения: 2
Зарегистрирован: 27 мар 2009, 23:58

EducatedFool писал(а):Сам бы не додумался до запроса scrambling+VBA
Вроде то, что надо. (правда пока что процесс обработки файла не успевает завершиться - Excel вылетает раньше :) Но с этим я разберусь - найду ошибку в коде)
Мож я, конечно, что не так делаю, но если импортировать в проект invisiblebasic.bas, то этот модуль тоже обфуксируется и рушится при пересечении процессов…

В мануале упоминается про Excel'97, поэтому решил проверить visible_names.txt и действительно: многого там нет, например:
[INDENT]CommandBars
WorksheetFunction
VBE
EnableEvents
ThisCell
Shapes
HPageBreaks
Hyperlinks (есть Hyperlink)
MergeArea
Validation[/INDENT]
и сотен других... Так что если наладите контакт, имейте ввиду, - списочек надо пополнить.
Ответить