Objektvariable

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm ListBox TextBox
Bild

Betrifft: Objektvariable
von: Rainer
Geschrieben am: 12.10.2015 22:31:48

Guten Abend,
in meinem VBA Projekt nutze ich mehrere UserForms. In manchen der Forms befindet sich die ListBox "LiBoA". Die Prozeduren diese ListBoxes mit Daten zu füllen sind fast immer gleich. Gerne würde ich nur eine LiBoA-Füll-Prozedur verwenden. Dazu müsste aber der Name der UserForm in einer Variablen gespeichert sein. Ich habe es mit "Dim UFoA as Object" probiert aber ich bekomme immer die Fehlermeldung 91: Objekt- oder With-Block-Variable nicht festgelegt. Auch mit der Set-Anweisung habe ich keinen Erfolg gehabt. Kann mir da bitte jemand einen Tipp geben. Vielen Dank.
Gruß Rainer.

Bild

Betrifft: AW: Objektvariable
von: Sepp
Geschrieben am: 12.10.2015 23:00:54
Hallo Rainer,
angenommen, deine UF's heißen "frnOne", bzw. "frmTwo".
Du brauchst der Prozedur nicht die UF mitgeben, sondern die "richtige" ListBox.

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub fill_ListBox(ByRef objListBox As MSForms.ListBox)
Dim lngI As Long

With objListBox
  .Clear
  For lngI = 1 To 10
    .AddItem "Item " & lngI 'nur als Beispiel
  Next
End With
End Sub

Sub test()

With frmOne
  fill_ListBox .LiBoA
  .Show
End With

With frmTwo
  fill_ListBox .LiBoA
  .Show
End With
End Sub

Gruß Sepp


Bild

Betrifft: AW: Objektvariable
von: Rainer
Geschrieben am: 12.10.2015 23:31:49
Hallo Sepp,
vielen Dank für die schnelle Antwort. Ich werde den Code ausprobieren, habe aber einige Zweifel ob dieser meinen Bedürfnissen gerecht wird. Daher möchte ich dir noch mehr Details zu meinem Projekt mitgeben. Ich arbeite an einem Programm für eine Schülerbibliothek. Dabei kommt es sehr oft vor, dass eine Liste mit Schülern oder eine Liste mit Büchern dargestellt werden soll. Ich habe die UserForms UFoA (Bücher ausleihen), UFoB (Bücherverwaltung) UFoR (Buchrücknahme) und UFoS (Schülerverwaltung)genannt. Alles ist eigentlich fertig und funktioniert sehr gut. Nun habe ich festgestellt, dass die Prozeduren zur Auflistung der Schüler bzw. der Bücher fast identisch sind. Ob nur die Daten der ausgeliehen Bücher oder die eines bestimmten Autors gelistet werden soll habe ich gelöst. Ebenso ob alle Schüler oder nur die einer bestimmten Klasse dargestellt werden sollen ist alles kein Problem. Ich möchte eigentlich nur probieren ob ich die Aufgabe zur Auflistung (egal ob Schüler oder Bücher) mit einer einzigen Prozedur oder besser noch mit einer Funktion erledigt werden kann. Dazu müsste ich jedoch der Funktion mitteilen von welcher UserForm sie angesprochen wird und an welche UserForm sie Daten zurückgeben soll. Daher brauche ich eine Variable die den Namen der UserForm speichert. Übrigens jede der o.g. UserForms hat ein TextBox "TeBoSuBe" und eine ListBox "LiBoA".
Ich hoffe, ich habe dich nicht zu sehr zugetextet und freue mich schon auf deinen nächsten Tipp.
LG Rainer.

Bild

Betrifft: AW: Objektvariable
von: Sepp
Geschrieben am: 13.10.2015 19:15:16
Hallo Rainer,
den Namen der UF brauchst du nicht, wenn du die richtige Listbox an die Funktion/Sub übergibst, dann wird auch die richtige angesprochen.
Ansonsten lade mal eine Beispieldate mit Beschreibung hoch.

Gruß Sepp


Bild

Betrifft: AW: Objektvariable
von: Rainer
Geschrieben am: 17.10.2015 01:28:38
Hallo Sepp,
um die Sache unter realen Bedingungen zu testen habe ich jetzt eine komplette Prozedur mit sehr vielen If-Strukturen gebaut. Ich habe eben viele Möglichkeiten zu verarbeiten. Deshalb muss ich der Sub LiBoAfill() auch ein paar Argumente liefern. Gestartet wird LiBoAfill aus der UserForm "UFoX" heraus mit der Prozedur

  • Private Sub Daten_listen()
    Dim SuBe As String
    SuBe = UFoX.TeBoSuBe.Value
    With UFoX
    .LiBoAfill(S, SuBe, SuTec, VisOpt, WS).LiBoA
    End With
    End Sub
    Leider reklamiert VBA, dass die Argumente mit ByRef nicht verträglich seien. Die Variablen sind bis auf "WS" vom Typ Byte, WS ist mit String deklariert. So weit ich weiß, ist es nicht möglich innerhalb einer Argumentenklammer 2 verschiedene Argumenttypen (ByVal und ByRef) anzuwenden. Wo ist der Fehler?
    Der Vollständigkeit halber hier noch die Prozedur ...
    Sub LiBoAfill(ByRef objListBox As MSForms.ListBox, S, SuBe, SuTec, VisOpt, WS)
    Dim a As Integer
    Dim AnalogStrg As Variant
    Dim Kla As String
    Dim KlaID As Integer
    Dim LiBoS2 As String
    Dim LiBoS3 As String
    Dim LiBoS4 As String
    Dim n As Integer
    Dim nType As Byte
    Dim RgO As Range
    Dim TBS As String
    Dim usedS As Byte
    Dim v As Byte
    Dim VOS2 As Byte
    Dim VOS3 As Byte
    Dim VOS4 As Byte
        n = 0
        nType = Len(SuBe)
        VOS2 = Left(VisOpt, 1)
        VOS3 = Mid(VisOpt, 2, 1)
        VOS4 = Right(VisOpt, 1)
        Application.ScreenUpdating = False
        Windows("SamLibriDat.xlsm").Activate
        Sheets(WS).Select
        ActiveSheet.Range(S & "4").Select
        objListBox.Clear
        For a = 1 To ActiveSheet.UsedRange.Rows.Count
            If Cells(ActiveCell.Row, 1) = "" Then Exit For
            If WS = "Bücher" Or WS = "Schüler" Then
                KlaID = Cells(ActiveCell.Row, 4)
                Kla = FUKreaKla(KlaID)
            End If
            If WS = "Schüler" Then
                If Cells(ActiveCell.Row, 1) = 1100 Then GoTo Sprung
                TBS = "Buch"
                usedS = ActiveCell.Column
                v = FUnBücher(usedS)
                If v > 1 Then TBS = "Bücher"
            End If
            If SuTec = 1 Then
                If SuBe <> Left(Cells(ActiveCell.Row, S), nType) Then GoTo Sprung
            End If
            If SuTec = 2 Then
                Set RgO = Sheets(WS).Cells(ActiveCell.Row, S).Find(SuBe, lookAt:=xlPart)
                If RgO Is Nothing Then GoTo Sprung
            End If
            If SuTec = 3 Then
                If SuBe <> Cells(ActiveCell.Row, S) Then GoTo Sprung
            End If
            LiBoS2 = Cells(ActiveCell.Row, 3) & " " & Cells(ActiveCell.Row, 2)
            If VOS2 = 2 Then LiBoS2 = Cells(ActiveCell.Row, 2) & " " & Cells(ActiveCell.Row, 3)
            Select Case VOS3
                Case 1
                    LiBoS3 = "(" & Kla & ")"
                Case 2
                    LiBoS3 = Left(Cells(ActiveCell.Row, 5), 4) & " (" & Kla & ") " & Right(Cells( _
    ActiveCell.Row, 5), 8)
                Case 3
                    LiBoS3 = Cells(ActiveCell.Row, 7) & " / " & Cells(ActiveCell.Row, 6)
                Case 4
                    LiBoS3 = Cells(ActiveCell.Row, 4)
            End Select
            Select Case VOS4
                Case 1
                    LiBoS4 = "(" & Kla & ")"
                Case 2
                    LiBoS4 = Left(Cells(ActiveCell.Row, 5), 4) & " (" & Kla & ") " & Right(Cells( _
    ActiveCell.Row, 5), 8)
                Case 3
                    LiBoS4 = v & " " & TBS
            End Select
            With objListBox
                .AddItem ""
                .List(n, 0) = Cells(ActiveCell.Row, 1)
                .List(n, 1) = LiBoS2
                .List(n, 2) = LiBoS3
                .List(n, 3) = LiBoS4
                n = n + 1
    Sprung:
            ActiveCell.Offset(1, 0).Select
        Next a
        On Error Resume Next
        objListBox.Selected(0) = True
        ActiveSheet.Range("A1").Select
        Sheets("Start").Select
        Windows("SamLibri.xlsm").Activate
        Application.ScreenUpdating = True
    End Sub
    Ganz schön viel gell. Sorry, aber ganz herzlichen Dank fürs durchlesen und fürs beantworten.
    Liebe Grüße
    Rainer.

    Bild

    Betrifft: AW: Objektvariable
    von: Sepp
    Geschrieben am: 17.10.2015 19:08:07
    Hallo Rainer,
    soll ich jetzt deine Datei nachbauen, um deinen Code ausprobieren zu können?
    das kann so nicht funktionieren

    
    With UFoX
    .LiBoAfill(S, SuBe, SuTec, VisOpt, WS).LiBoA
    End With
    
    Ungeachtet, ob er Code sonnst noch Fehler enthält, sollte das wohl so lauten.
    
    With UFoX
      Call LiBoAfill(.LiBoA, S, SuBe, SuTec, VisOpt, WS)
    End With
    
    Wobei LiBoAfill() als Public in einem allgemeinen Modul stehen muss!
    Gruß Sepp


    Bild

    Betrifft: AW: Objektvariable
    von: Rainer
    Geschrieben am: 17.10.2015 20:35:24
    Hallo Sepp,
    ja, ja, jaja jaaaaa! Es funktioniert. Vielen, vielen Dank. Ich musste nur noch ein paar Leichtsinnsfehler an meinem Code korrigieren und schon hab ich genau das was ich wollte. Ich habe wieder sehr viel gelernt. Vielen Dank.
    Liebe Grüße
    Rainer.

    Bild

    Betrifft: Freut mich! o.T.
    von: Sepp
    Geschrieben am: 17.10.2015 21:03:06

    Gruß Sepp


     Bild

    Beiträge aus den Excel-Beispielen zum Thema "Namen neu vergeben"