McAfee удаляет код из модуля VBA - PullRequest
5 голосов
/ 27 декабря 2008

Я пытаюсь запрограммировать модуль Excel, в котором он динамически вставляет код в новые объекты в форму, созданную во время разработки.

Я использую этот код, где «Код» содержит строку с реальным кодом, который должен идти в объект DstrFiles.

Dim DstrFiles As Object
 Set DstrFiles = ThisWorkbook.VBProject.VBComponents("DistributeFiles")

 With DstrFiles.CodeModule
    .InsertLines .CountOfLines + 1, Code
 End With

Моя проблема в том, что когда я использую .InsertLines, McAfee удаляет весь код из моего модуля, есть ли способ обойти это?

Сначала я создаю ярлык с:

Form1.Controls.Add("Forms.Label.1", "Label1", True)

Затем я использую .InsertLines, чтобы создать некоторый код для метки.

Например, я хочу, чтобы цвет фона метки стал красным, когда кто-то нажимает на нее. Это было очень легко сделать с помощью .InsertLines.

Уродливый способ обойти эту проблему - просто заранее создать группу кода, готовую в фоновом режиме, а затем ограничить количество меток, которые могут создаваться на лету. - Надеюсь, до этого не дойдет.

Я гуглил, и это, кажется, известная проблема с McAfee.

Кто-нибудь знает способ создания динамической пользовательской формы, которая может добавлять код в новые метки или кнопки, добавляемые с помощью метода Contrls.Add?

Ответы [ 3 ]

7 голосов
/ 08 января 2009

Вы не должны генерировать новые метки путем написания кода, который создает элементы управления.

Вы должны использовать метод .Add в коллекции Controls для создания новых меток.

Например:

UserForm1.Controls.Add("Forms.Label.1", "foo", True)

Вы можете использовать WithEvents для получения событий.

Например, в UserForm1,

Public WithEvents a As MSForms.Label

Private Sub a_Click()

    MsgBox "label clicked"

End Sub

Private Sub CommandButton1_Click()

    Set a = UserForm1.Controls.Add("Forms.Label.1", "foo", True)
    a.Visible = True
    a.Caption = "Hi There"

End Sub

Если вы хотите создать динамический массив вновь добавленных элементов управления, вам нужно создать небольшой класс-оболочку. Пример кода здесь.

1 голос
/ 07 января 2009

Возможно, вы сможете обойти эту версию McAfee. Но следующая версия файлов данных или другой блокировщик вредоносного ПО может в любом случае заблокировать вас.

Таким образом, вы можете создать подобный код для запуска на своей машине разработки, но он никогда не будет (или только временно) работать при распространении среди клиентов.

1 голос
/ 29 декабря 2008

Если возможно, я бы рекомендовал против динамической генерации кода (пахнет как самоизменяющаяся программа?).

Может быть, трудно сказать, не зная вашей конкретной проблемы, но я уверен, что есть лучшее решение, использующее функцию с необходимыми параметрами.

...