Страница 1 из 1

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

Добавлено: 27 мар 2009, 20:17
EducatedFool
Как известно, для среды разработки 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)

Было бы хорошо, если бы код нажатием одной кнопки превращался бы в нечитаемый. Кто-нибудь сталкивался с подобными надстройками?

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

Добавлено: 27 мар 2009, 21:49
Naeel Maqsudov

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

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 модуля проекта.
Также будет исключение, если сам этот макрос вставит код с синтаксической ошибкой.

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

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

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

Хотелось бы найти готовое решение... наверняка, кто-нибудь уже реализовал подобную функциональность.

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

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

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

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

PS: Мной такой надстройки в просторах Интернет замечено не было, хотя видел календарик, где вместо переменных какой-то "хэш" – неужто вручную прописывали…

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

Добавлено: 28 мар 2009, 00:22
Aent
Достаточно спросить Гугля о scrambling+VBA
и в два клика находим
http://www.dailydoseofexcel.com/archive ... ble-basic/
http://invisiblebasic.sourceforge.net/

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

Добавлено: 28 мар 2009, 01:04
EducatedFool
Aent, спасибо огромное!

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

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

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

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