在devise视图中操作对象

我曾经在几个项目中工作过,在那里我被MS Excel和MS Access难住,我无法在devise视图中使用VBA来操作对象。 他们是非常简单的任务,例如在MS Excel中更改用户窗体上的标签名称,或者将新的文本框添加到MS Access中的报表中,但它们似乎是不可能的,因为只有在激活所述用户窗体或报表时才会使用任何macros。所以一切都在运行时完成。

要专注于一个,在MS Excel中,我希望能够运行一个代码,将通过我的用户窗体上的所有标签,并将其从“Label1”,“Label2”等重命名为“Lbl1”,“Lbl2 “等等,但我不能只是点击一个button来运行一个macros的用户表单的devise,这将运行通过所有的标签,并改变他们的名字。 如果我能够做到这一点,那么我可以对我的运行时代码的其余部分更有效率。 没有它,我可以select重命名我拥有的每一个标签,但有近100个标签,我想通过VBA来做到这一点,因为我已经可以看到,知道如何在devise视图中运行代码是非常有用的Visual Basic元素。

请你能build议是否可以在devise视图中操纵这些VB对象?

您可以从普通模块运行代码来更改用户窗体的devise。 您必须在信任中心设置中拥有对VBA项目的信任访问权限。 那么这只是一个使用相关VBComponentDesigner属性的问题:

 Sub foo() Dim ctl As MSForms.Control Dim lCounter As Long lCounter = 1 For Each ctl In ThisWorkbook.VBProject.VBComponents("Userform1").Designer.Controls If TypeName(ctl) = "Label" Then ctl.Name = "lbl" & lCounter lCounter = lCounter + 1 End If Next ctl End Sub 

运行这个时,表单不能被加载。

如果您设置了特殊的macros权限,则可以从代码编写项目。

详情请访问Chip的网站: http : //www.cpearson.com/excel/vbe.aspx

不,这是不可能的。 如果您有一个devise器为Form1打开,并在即时窗格中键入Form1.Show ,VBE将在调出devise器之前closuresdevise器。 就是那样子。

现在,如果你有标签Label1Label2Label3 ,你有我喜欢称之为无意义的标识符。 将它们重命名为Lbl1Lbl2Lbl3会使事情变得更糟。

如果你在代码中的任何地方引用它们,重命名它们将会破坏你的代码。 更糟糕的是button或其他事件,你正在处理的事件:重命名Button1Btn1将不会重命名Button1_Click()过程到Btn1_Click()

使用有意义的名字 如果Label1坐在一个文本框上,我不知道,一些用户名 ,然后将其命名为lblUserNameUserNameLabel 。 使用有意义的名字 总是。

我写了一个重构工具来重命名事物,它处理事件处理程序和许多其他事情; 您可以在代码中右键单击对Label1的引用,从上下文菜单中selectRefactor > Rename ,input一个新名称,然后该工具会重命名所有引用以及控件本身。 有问题的工具被称为Rubberduck ,并且不仅仅是让你重命名一些东西。

如果标签在代码中没有被引用,那么它们不需要名称。 何必?