McAfee удаляет код из модуля VBA

Я пытаюсь запрограммировать модуль 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".

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

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

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

Здесь есть обсуждение, которое может помочь: vbforums.com/showthread.php?t=358444

Fionnuala 27.12.2008 02:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
1 082
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Ответ принят как подходящий

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

Вы должны использовать метод .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

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

Мне этого мало. Мне также нужен код для ярлыка. Что-то должно произойти при нажатии на ярлык.

Christian 13.01.2009 13:03

@Christian: Джоэл Спольски изобрел возможность VBA / Macro для Excel :) joelonsoftware.com/items/2007/04/25.html

Michael Buen 17.01.2009 06:44

Спасибо за помощь, Джоэл, я наконец-то могу делать то, что задумал, и аккуратно.

Christian 18.01.2009 04:36

Другие вопросы по теме