Vba 在设计视图中操纵对象

Vba 在设计视图中操纵对象,vba,excel,Vba,Excel,我现在已经在几个项目中工作过,在这些项目中,我被MS Excel和MS Access难住了,在设计视图中,我无法使用VBA来操作对象。它们是非常简单的任务,例如在MS Excel中更改用户表单上标签的名称或在MS Access中向报表添加新文本框,但它们似乎是不可能的,因为任何宏都只能在激活所述用户表单或报表时使用,所以一切都只在运行时完成 为了关注其中一个,在MS Excel中,我希望能够运行一个代码,该代码将遍历我的用户表单上的所有标签,并将它们从“Label1”、“Label2”等重命名。

我现在已经在几个项目中工作过,在这些项目中,我被MS Excel和MS Access难住了,在设计视图中,我无法使用VBA来操作对象。它们是非常简单的任务,例如在MS Excel中更改用户表单上标签的名称或在MS Access中向报表添加新文本框,但它们似乎是不可能的,因为任何宏都只能在激活所述用户表单或报表时使用,所以一切都只在运行时完成

为了关注其中一个,在MS Excel中,我希望能够运行一个代码,该代码将遍历我的用户表单上的所有标签,并将它们从“Label1”、“Label2”等重命名。。。到“Lbl1”、“Lbl2”等。。。例如,但我不能仅仅单击一个按钮就在用户表单的设计上运行一个宏,该宏将遍历所有标签并更改它们的名称。如果我能够做到这一点,那么我可以更有效地使用其余的运行时代码。如果没有它,我可以选择重命名我拥有的每个标签,但有近100个标签,我想通过VBA实现这一点,因为我已经看到,了解如何在这些Visual Basic元素的设计视图中运行代码将非常有用


请告知是否可以在“设计”视图中操作这些VB对象?

如果设置了特殊的宏权限,则可以通过代码对项目进行编程


详细信息在芯片的网站上:

不,不可能。如果为
Form1
打开设计器,并在即时窗格中键入
Form1.Show
,VBE将在调出窗体之前关闭设计器。事情就是这样

现在,如果你有标签
Label1
Label2
Label3
,你就有了我喜欢称之为无意义的标识符。将它们重命名为
Lbl1
Lbl2
Lbl3
会让事情变得更糟

如果您在代码中的任何地方引用它们,重命名它们将破坏您的代码。更糟糕的是,在处理按钮或其他事件时:将
Button1
重命名为
Btn1
不会将
Button1\u-Click()
过程重命名为
Btn1\u-Click()

使用有意义的名称。如果
Label1
位于某个用户名的文本框顶部(我不知道),则将其命名为
lblUserName
usernamelab
。使用有意义的名称。总是

我已经编写了一个用于重命名事物的重构工具,它处理事件处理程序和许多其他事情;您可以右键单击代码中对
Label1
的引用,从上下文菜单中选择
Refactor>Rename
,输入新名称,然后工具重命名所有引用以及控件本身。所讨论的工具被称为,它的作用远不止是让你重命名东西


如果标签在代码中的任何地方都没有被引用,那么它们就不需要名称。何必麻烦呢?

您可以从普通模块运行代码来更改用户表单的设计。您必须在信任中心设置中具有对VBA项目的受信任访问权限。然后就是使用相关
VBComponent
Designer
属性的问题:

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

运行此操作时不得加载表单。

Hello Mat,我知道为所有控件指定有意义的名称是最佳做法,但在本例中,我实际上会在代码中使用“label”一词后面的数字。例如:控件(“标签”&i&j)。标题=。。。因为这会使整个过程对我的工作更有效率。我很失望,你不能编写代码用于设计阶段,我认为这将大大提高我处理事情的速度。@Sammir或者你可以放弃设计阶段,在运行时生成UI。