Select variable object with counter

混江龙づ霸主 提交于 2019-12-24 07:07:15

问题


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.


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?


回答1:


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



回答2:


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.




回答3:


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:

and after:

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

You could also do this with an indexing counter.



来源:https://stackoverflow.com/questions/39986941/select-variable-object-with-counter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!