Select variable object with counter

2019-07-24 05:13发布

Background:
I have a collection of objects (for this example Listbox objects) in a userform using standardized names, I would like to rename them dynamically using a counter cycle. enter image description here


Problem:
I have not figured a way if what I am asking is even possible, however, I would like to confirm it. Solution approach:
Nothing so far, like I said (refer to the image above) I need a way to set the values of the objects within the for cycle, something like this:

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

However, I am clueless on how to do so (or if it is achievable).
Question:
Is there any way to use a counter to cast a variable/object?

3条回答
爷的心禁止访问
2楼-- · 2019-07-24 05:44

No, you can't edit the name while the userform is in use, you'll get error 382

What you'd like to do is this

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

But you'll error when you try to write to the name property. You can print the names or set other properties, but this isn't something you can do as far as I know.

查看更多
Animai°情兽
3楼-- · 2019-07-24 05:51

For use with ListBox controls on a UserForm

If you want to change only certain ListBox controls by number:

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

If you want to change ALL ListBox controls:

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
查看更多
Juvenile、少年°
4楼-- · 2019-07-24 06:00

I treat them like Shapes and test their pre-defined 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

Before:

enter image description here

and after:

enter image description here

You would update this to examine the Shapes in your userform.

You could also do this with an indexing counter.

查看更多
登录 后发表回答