简体   繁体   中英

clsCommandButton: Microsoft Excel VBA - Run-Time Error '-2147024809 (80070057)'

I want to add dynamically CommandButtons to my Userform within the For-Loop. How can i get add new CommandButtons in the For-Loop?

 Dim CommandButtons(5) As clsCommandButtons
    Private Sub UserForm_Initialize()
    Dim zaehler As Integer
    For zaehler = 0 To 4
        Set CommandButtons(zaehler) = New clsCommandButtons
        Set CommandButtons(zaehler).cmdCommandButton = Me.Controls(zaehler)
        Next
    End Sub

And This is my class:

Option Explicit

Public WithEvents cmdCommandButton As CommandButton

Private Sub cmdCommandButton_Click()
    Dim sFilepath       As String                       

    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .InitialFileName = ActiveWorkbook.Path & "\"
        .Filters.Add "TextFiles", "*.txt", 1
        .FilterIndex = 1
        If .Show = -1 Then
            sFilepath = .SelectedItems(1)
        End If
    End With

    Cells(c_intRowFilterPathStart, c_intClmnFilterPath) = sFilepath
End Sub

I don't know how to handle this Error. How can i fix this?

I assume you get the error because you're accessing a control that doesn't exist. Note that the controls are counted from 0 to Me.Controls.count-1 , so probably your issue is solved with

Set CommandButtons(zaehler).cmdCommandButton = Me.Controls(zaehler-1)

But I guess a better solution is to name your buttons and assign them by name:

 Set CommandButtons(zaehler).cmdCommandButton = Me.Controls("CommandButton" & zaehler)

Define the CommandButtons collection as a Variant :

  • Dim CommandButtons(15) As Variant , instead of Dim CommandButtons(15) As clsCommandButtons .

In this Variant , you would put your CommandButtons. This is some minimal code, that would help you get the basics of what I mean:

CustomClass :

Private Sub Class_Initialize()
    Debug.Print "I am initialized!"
End Sub

In a module :

Private SomeCollection(4) As Variant    
Public Sub TestMe()        
    Dim cnt As Long
    For cnt = 1 To 4
        Set SomeCollection(cnt) = New CustomClass
    Next cnt        
End Sub

From this small running code, you can start debugging further :)

Dim a() As clsCommandButton

Private Sub UserForm_Initialize()

Dim c As Control

On Error GoTo eHandle

For Each c In Me.Controls
    If TypeName(c) = "CommandButton" Then
        ReDim Preserve a(UBound(a) + 1)
        Set a(UBound(a)) = New clsCommandButton
        Set a(UBound(a)).cmd = c
    End If
Next c

Exit Sub

eHandle:

    If Err.Number = 9 Then
        ReDim a(0)
    End If

    Resume Next

End Sub

With a class as follows

Public WithEvents cmd As commandbutton

Private Sub cmd_Click()
    MsgBox "test"
End Sub

I think your problem is in the Me.Controls(zaehler) part. zaehler starts at 1, but Me.Controls(...) starts at 0.

Set CommandButtons(zaehler).cmdCommandButton = Me.Controls(zaehler - 1)

would probably solve it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM