用计数器选择变量对象

时间:2016-10-11 21:21:01

标签: excel excel-vba userform vba

背景
我使用标准化名称在userform中有一组对象(对于此示例Listbox对象),我想使用计数器循环动态重命名它们。 enter image description here


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

For CounterItems = 1 To 18 'Hours in Template
ListBox_Time(CounterItems).Value="Dummy" & CounterItems
Next CounterHours

然而,我对如何这样做(或者如果它是可以实现的)毫无头绪。
问题:
有没有办法使用计数器来投射变量/对象?

3 个答案:

答案 0 :(得分:5)

不,您在使用用户表单时无法修改名称,您将获得error 382

您要做的就是这个

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属性时,您会发生错误。您可以打印名称或设置其他属性,但据我所知,这不是您可以做的事情。

答案 1 :(得分:4)

用于UserForm

上的ListBox控件

如果您只想按编号更改某些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

如果要更改所有ListBox控件:

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

答案 2 :(得分:1)

我将它们视为Shapes并测试其预定义的Names

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

在:

enter image description here

之后:

enter image description here

您需要更新此内容以检查用户表单中的Shapes

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