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





Если возможно, я бы не рекомендовал динамическую генерацию кода (пахнет самомодифицирующейся программой?).
Возможно, трудно сказать, не зная вашей конкретной проблемы, но я уверен, что есть лучшее решение, использующее функцию с необходимыми параметрами.
Возможно, вам удастся обойти эту версию 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: Джоэл Спольски изобрел возможность VBA / Macro для Excel :) joelonsoftware.com/items/2007/04/25.html
Спасибо за помощь, Джоэл, я наконец-то могу делать то, что задумал, и аккуратно.
Здесь есть обсуждение, которое может помочь: vbforums.com/showthread.php?t=358444