我正在尝试编写一个Excel模块,它在设计时以创建的形式动态地在新对象中插入代码。
我正在使用此代码,其中“Code”包含一个字符串,其中包含应该进入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创建一些与Label一起使用的代码。
例如,当有人点击它时,我希望标签的背景颜色变为红色。使用“.InsertLines”很容易实现这一点。
解决这个问题的一个丑陋方法是事先创建一堆在后台准备好的代码,然后限制可以动态创建的标签数量。 - 我希望不会那样。
我一直在疯狂,这似乎是McAfee的一个已知问题。
有没有人知道一种创建动态用户表单的方法,可以将代码添加到使用Contrls.Add方法添加的新标签或按钮?
答案 0 :(得分:7)
您不应该通过编写创建控件的代码来生成新标签。
您应该使用Controls集合上的.Add方法来创建新标签。
例如:
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
如果要创建新添加的控件的动态数组,则需要创建一个小包装类。 Sample code for that is here.
答案 1 :(得分:1)
如果可能,我建议不要动态生成代码(闻起来像是一个自我修改程序?)。
在不知道具体问题的情况下可能很难说,但我敢打赌,使用具有必要参数的函数有更好的解决方案。
答案 2 :(得分:1)
您可以解决此版本的McAfee问题。但无论如何,下一版本的数据文件或其他恶意软件拦截器可能会阻止您。
因此,您可以创建这样的代码,以便在您的开发机器上运行,但在分发给客户时,它永远不会(或只是暂时的)工作。