Excel 使用计数器选择变量对象

Excel 使用计数器选择变量对象,excel,userform,vba,Excel,Userform,Vba,背景: 我有一个使用标准化名称的用户表单中的对象集合(例如Listbox对象),我希望使用计数器循环动态重命名它们。 问题: 我还没有想出一个办法,如果我问的是甚至可能的,但是,我想确认一下。 解决方案方法: 到目前为止还没有什么,正如我所说(参考上图),我需要一种方法来设置for循环中对象的值,类似于这样: For CounterItems = 1 To 18 'Hours in Template ListBox_Time(CounterItems).Value="Dummy" &

背景:
我有一个使用标准化名称的用户表单中的对象集合(例如Listbox对象),我希望使用计数器循环动态重命名它们。


问题:
我还没有想出一个办法,如果我问的是甚至可能的,但是,我想确认一下。 解决方案方法:
到目前为止还没有什么,正如我所说(参考上图),我需要一种方法来设置for循环中对象的值,类似于这样:

For CounterItems = 1 To 18 'Hours in Template
ListBox_Time(CounterItems).Value="Dummy" & CounterItems
Next CounterHours
然而,我不知道如何做到这一点(或者是否可以实现)。
问题:

有没有办法使用计数器来强制转换变量/对象?

我将它们视为
形状
,并测试它们预定义的
名称

Sub ShapeRenamer()
    Dim s As Shape
    For Each s In ActiveSheet.Shapes
        If s.Name = "List Box 6" Then s.Name = "Sixth"
    Next s
End Sub
之前:

及之后:

您可以更新它来检查您的用户表单中的
形状


您也可以使用索引计数器来执行此操作。

我将它们视为
形状
,并测试它们预定义的
名称

Sub ShapeRenamer()
    Dim s As Shape
    For Each s In ActiveSheet.Shapes
        If s.Name = "List Box 6" Then s.Name = "Sixth"
    Next s
End Sub
之前:

及之后:

您可以更新它来检查您的用户表单中的
形状

您也可以使用索引计数器来执行此操作。

用于用户表单上的ListBox控件 如果只想按编号更改某些列表框控件:

Public Sub ListBoxNameChange()
    Dim ctrl As Control
    Dim ctrlName As String, ctrlNum As Integer

    For Each ctrl In Me.Controls
        If TypeName(ctrl) = "ListBox" Then
            ctrlName = ctrl.Name
            ctrlNum = CInt(Replace(ctrlName, "ListBox_Time", "")) 
            If ctrlNum > 0 And ctrlNum < 19 Then
                ctrl.AddItem "Dummy" & ctrlNum, 0
            End If
        End If
    Next ctrl
End Sub
Public Sub ListBoxNameChange2()
    Dim ctrl As Control
    Dim ctrlName As String

    For Each ctrl In Me.Controls
        If TypeName(ctrl) = "ListBox" Then _
            ctrl.AddItem "Dummy" & Replace(ctrl.Name, "ListBox_Time", ""), 0
    Next ctrl
End Sub
用于与UserForm上的ListBox控件一起使用 如果只想按编号更改某些列表框控件:

Public Sub ListBoxNameChange()
    Dim ctrl As Control
    Dim ctrlName As String, ctrlNum As Integer

    For Each ctrl In Me.Controls
        If TypeName(ctrl) = "ListBox" Then
            ctrlName = ctrl.Name
            ctrlNum = CInt(Replace(ctrlName, "ListBox_Time", "")) 
            If ctrlNum > 0 And ctrlNum < 19 Then
                ctrl.AddItem "Dummy" & ctrlNum, 0
            End If
        End If
    Next ctrl
End Sub
Public Sub ListBoxNameChange2()
    Dim ctrl As Control
    Dim ctrlName As String

    For Each ctrl In Me.Controls
        If TypeName(ctrl) = "ListBox" Then _
            ctrl.AddItem "Dummy" & Replace(ctrl.Name, "ListBox_Time", ""), 0
    Next ctrl
End Sub

不,当userform正在使用时,您不能编辑名称,您将获得

你想做的就是这样

Option Explicit

Sub test()
    Dim myForm As UserForm
    Set myForm = UserForm1
    Dim myCtrl As Control
    Dim i As Long
    Dim myCount As Long
    myCount = 1
        For Each myCtrl In myForm.Controls
            If TypeName(myCtrl) = "ListBox" Then
                myCtrl.Name = "Dummy" & myCount 'error
                myCount = myCount + 1
            End If
        Next
End Sub

但是当您尝试写入name属性时会出错。您可以打印名称或设置其他属性,但据我所知,这不是您可以执行的操作。

不,您不能在使用userform时编辑名称,您将获得

你想做的就是这样

Option Explicit

Sub test()
    Dim myForm As UserForm
    Set myForm = UserForm1
    Dim myCtrl As Control
    Dim i As Long
    Dim myCount As Long
    myCount = 1
        For Each myCtrl In myForm.Controls
            If TypeName(myCtrl) = "ListBox" Then
                myCtrl.Name = "Dummy" & myCount 'error
                myCount = myCount + 1
            End If
        Next
End Sub


但是当您尝试写入name属性时会出错。您可以打印名称或设置其他属性,但据我所知,这不是您可以做的。

取决于您是否愿意,我记得我做过类似的事情;我在运行时创建了对象,因此它们具有类似数组的名称。另一种方法是为对象制作类包装器。此外,我认为收藏会起作用。我同意收藏是最好的方式。事实上,我想进一步说的是,收藏品是专门制作的,能够以程序的方式循环使用它的物品。Excel中默认情况下是否没有列表框集合?非常确定有一个对象集合,您可以循环使用并测试每个项目是否为listbox以及相应的操作。我确切知道如何执行此操作,但我想确保操作正确:您希望循环使用18个listbox对象(名为listbox\u TimeX)并将它们重命名为其他对象,对吗?您将得到错误382-当窗体处于打开状态时,您不能写入控件名initialized@JReid如果已经在userform上设置了元素,您如何实现这一点?at.n实际上它们是userforms中的对象,但是,嗯,也许你是对的,只是我需要知道如何调用userform中的项at.tyeler,而不是重命名它们,而是更改它们的值,这取决于你是否愿意我记得做过类似的事情;我在运行时创建了对象,因此它们具有类似数组的名称。另一种方法是为对象制作类包装器。此外,我认为收藏会起作用。我同意收藏是最好的方式。事实上,我想进一步说的是,收藏品是专门制作的,能够以程序的方式循环使用它的物品。Excel中默认情况下是否没有列表框集合?非常确定有一个对象集合,您可以循环使用并测试每个项目是否为listbox以及相应的操作。我确切知道如何执行此操作,但我想确保操作正确:您希望循环使用18个listbox对象(名为listbox\u TimeX)并将它们重命名为其他对象,对吗?您将得到错误382-当窗体处于打开状态时,您不能写入控件名initialized@JReid如果已经在userform上设置了元素,您如何实现这一点?at.n实际上它们是userforms中的对象,但是,嗯,也许你是对的,只是我需要知道如何调用userform中的项at.tyeler,而不是重命名它们,而是更改它们的值hanks!但是,对象在用户表单中,而不是在表单中作为形状;我的意思是在用户表单中有一些列表框我需要使用。谢谢!但是,对象在用户表单中,而不是在表单中作为形状;我的意思是在用户表单中有一些列表框我需要使用。是的,这很有效!不知怎的,我很困惑,因为我试图避免每次都有一个预设的循环,谢谢!我很高兴它起作用了,但我不知道如何。。。我不知道它会像Raystafarian说的那样抛出错误382。我想,如果您想知道如何循环使用userform控件,这确实向您展示了如何。就工作代码而言……@Sgdva我更改了代码,以反映我认为您所要求的内容。因为您实际上不想更改对象名称,只是它的索引0项,所以我更改了代码以反映是的,这起作用了!不知怎的,我很困惑,因为我试图避免每次都有一个预设的循环,谢谢!我很高兴它起作用了,但我不知道如何。。。我不知道它会像Raystafarian说的那样抛出错误382。我想,如果您想知道如何循环使用userform控件,这确实向您展示了如何。就工作代码而言……@Sgdva我更改了代码,以反映我认为您所要求的内容。因为您实际上不想更改对象名称,只不过它是索引0项,我更改代码以反映这是一个很好的提示,而且它也是有效的,我只投票赞成它,但是它也可以被视为解决方案(同样地,几乎同时给出了2个)。