Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1692to1696
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Wechselwirkung Combobox

Wechselwirkung Combobox
12.05.2019 10:43:56
Markus
Hallo an alle
Es wäre sehr nett, wenn mir jemand weiterhelfen könnte oder mir erklären könnte worin mein Fehler liegt. Ich will mit meinem Code über eine AktiveX Combobox die direkt im Tabellenblatt eingesetzt ist, verschiedene Benutzerdefinierte Sortierungen auslösen. Jetzt habe ich debug.print am Anfang des Codes eingesetzt, um zu sehen wie oft der Code ausgeführt wird. Wenn ich eine Sortierung in der Combobox auswähle. Es ist leider mehr als 1-mal.
Überall steht das man das "ComboBox1_Change“ Ereignis mit „Application.EnableEvents = False „verhindern kann.
Private Sub ComboBox1_DropButtonClick()
Dim wsThis As Worksheet
Set wsThis = ThisWorkbook.Worksheets("Variante1")
Application.EnableEvents = False
Debug.Print "ComboV1_DropButtonClick " & Now
With wsThis.OLEObjects("ComboBox1").Object
.Clear
.List = Array("Sortieren nach", "Datum", "Datum (gefärbt)", "Namen", "Adresse")
End With
Application.EnableEvents = True
End Sub
Private Sub ComboBox1_Change()
Debug.Print "ComboV1_Change " & Now
Dim letzteZ As Long
Dim strKriterium As String
Dim wsThis As Worksheet
Set wsThis = ThisWorkbook.Worksheets("Variante1")
strKriterium = wsThis.OLEObjects("ComboBox1").Object.Value
If strKriterium  "Sortieren nach" Or strKriterium = "" Then
letzteZ = wsThis.Cells(wsThis.Rows.Count, 5).End(xlUp).Row  'Zeilenanzahl
With wsThis.Sort
.SortFields.Clear
Select Case strKriterium
Case "Datum", "Datum (gefärbt)"
.SortFields.Add Key:=Range(Cells(5, 7), Cells(letzteZ, 7)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Datum
.SortFields.Add Key:=Range(Cells(5, 5), Cells(letzteZ, 5)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Name
.SortFields.Add Key:=Range(Cells(5, 6), Cells(letzteZ, 6)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Vorname
Case "Namen"
.SortFields.Add Key:=Range(Cells(5, 5), Cells(letzteZ, 5)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Name
.SortFields.Add Key:=Range(Cells(5, 6), Cells(letzteZ, 6)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Vorname
.SortFields.Add Key:=Range(Cells(5, 7), Cells(letzteZ, 7)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Datum
Case "Adresse"
.SortFields.Add Key:=Range(Cells(5, 10), Cells(letzteZ, 10)), SortOn:=  _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Adresse
.SortFields.Add Key:=Range(Cells(5, 7), Cells(letzteZ, 7)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Datum
.SortFields.Add Key:=Range(Cells(5, 5), Cells(letzteZ, 5)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Name
.SortFields.Add Key:=Range(Cells(5, 6), Cells(letzteZ, 6)), SortOn:=
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Vorname
End Select
.SetRange Range(Cells(3, 1), Cells(letzteZ, 25))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
If strKriterium = "Datum (gefärbt)" Then Call FärbenSpezial(letzteZ)
Application.EnableEvents = False
wsThis.OLEObjects("ComboBox1").Object.Text = "Sortieren nach"
Application.EnableEvents = True
Range("B4").Select
End If
End Sub

Das Funktioniert aber nicht und ich wüsste gerne warum?
Und wüsste vielleicht jemand wie ich es schaffe das der erste Eintrag der auswahlliste in der Auswahl nicht angezeigt wird. Ich will das in der Combobox immer „Sortieren nach‘ steht, es aber nach dem aufklappen nicht in der Liste ist.
Danke schonmal und Grüße
Markus

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Teilantwort: ComboBox1.Text= ...
12.05.2019 10:51:23
Matthias
Hallo
Und wüsste vielleicht jemand wie ich es schaffe das der erste Eintrag der auswahlliste in der Auswahl nicht angezeigt wird. Ich will das in der Combobox immer „Sortieren nach‘ steht, es aber nach dem aufklappen nicht in der Liste ist.
Das kannst Du so realisieren:
ComboBox1.Text="Sortieren nach"
offen gelassen, da nur Teilantwort.
Gruß Matthias
AW: Teilantwort: ComboBox1.Text= ...
12.05.2019 11:49:19
Markus
Hallo Danke für deine Antwort
Also ist es, was zumindest das "Sortieren nach" angeht die einzige Möglichkeit. Es gibt keine Einstellung "ab Zeile 2 anzeigen". Ich hätte es im Prinzip so drinnen:
    Application.EnableEvents = False
wsThis.OLEObjects("ComboBox1").Object.Text = "Sortieren nach"
Application.EnableEvents = True
Nur löst mir das wider das ComboBox1_Change Ereignis aus.
Grüße Markus
Markus
Anzeige
AW: Teilantwort: ComboBox1.Text= ...
12.05.2019 12:20:14
Matthias
Hallo
Nun, Du schreibst es ja hiermit:
 .List = Array("Sortieren nach", "Datum", "Datum (gefärbt)", "Namen", "Adresse")
wieder in die Liste.
Lass doch diesen ersten Eintrag weg.
Gruß Matthias
AW: Teilantwort: ComboBox1.Text= ...
12.05.2019 13:33:17
Markus
Ich hab es raus genommen aber das Change Ereignis wird immer noch ausgelöst.
Ich verstehe das einfach nicht der Code wird mit der Zeile
    Application.EnableEvents = False
wsThis.OLEObjects("ComboBox1").Object.Text = "Sortieren nach"
Application.EnableEvents = True

Dreimal durchlaufen OHNE die Zeile nur einmal. Dabei sollte Application.EnableEvents = False das Change Ereigniss doch ausschalten.
Hast du vielleicht noch irgendeine Idee. oder eine Empfehlung
Grüße
Markus
Anzeige
AW: Teilantwort: ComboBox1.Text= ...
12.05.2019 15:55:28
onur
Du kannst mit
Application.EnableEvents = False
keine Events von Comboboxen oder Buttons abschalten, nur die des Blattes oder des Workbooks.
AW: Wechselwirkung Combobox
12.05.2019 11:04:00
Markus
Noch eine TestMappe damit ihr es besser Nachvollziehen könnt:
https://www.herber.de/bbs/user/129721.xlsm
Die Orginalmappe hat mehrere Tabellenblätter und manche davon haben eben so eine Combobox zum Benutzerdefinierten sortieren. Jeweils auf die Bedürfnisse der jeweiligen Daten angepasst. Das Sortieren funktioniert überall es ist nur das der Code mehrmals ausgeführt wird. und an manchen hängen dann auch noch andere Programme, die zwar nichts mehr mit der Combobox machen aber dann ebenfalls ausgeführt werden.
Wenn ihr in den Direktbereich des Editors schaut nachdem auswählen einer Sortierung, dann seht ihr es.
Grüße Markus
Anzeige
AW: Wechselwirkung Combobox
12.05.2019 11:22:18
Markus
Oder ist es etwa Prinzipiell so das Events immer zwei mal durchlaufen werden?
Grüße Markus
AW: Wechselwirkung Combobox
12.05.2019 19:44:43
Nepumuk
Hallo Markus,
EnableEvents hat keine Auswirkung aus ActiveX-Controls. Versuch es mal so:
Option Explicit

Private mblnChange As Boolean

Private Sub ComboBox1_DropButtonClick()
    If Not Change Then
        Debug.Print "ComboV1_DropButtonClick " & Now
        
        With OLEObjects("ComboBox1").Object
            .Clear
            .List = Array("Sortieren nach", "Datum", "Datum (gefärbt)", "Namen", "Adresse")
        End With
    End If
End Sub

Private Sub ComboBox1_Change()
    
    Debug.Print "ComboV1_Change " & Now
    
    Dim letzteZ As Long
    Dim strKriterium As String
    
    If Not Change Then
        
        Change = True
        
        strKriterium = OLEObjects("ComboBox1").Object.Value
        
        If strKriterium <> "Sortieren nach" Or strKriterium = "" Then
            letzteZ = Cells(Rows.Count, 5).End(xlUp).Row 'Zeilenanzahl
            With Sort
                .SortFields.Clear
                Select Case strKriterium
                    Case "Datum", "Datum (gefärbt)"
                        .SortFields.Add Key:=Range(Cells(5, 7), Cells(letzteZ, 7)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Datum
                        .SortFields.Add Key:=Range(Cells(5, 5), Cells(letzteZ, 5)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Name
                        .SortFields.Add Key:=Range(Cells(5, 6), Cells(letzteZ, 6)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Vorname
                    Case "Namen"
                        .SortFields.Add Key:=Range(Cells(5, 5), Cells(letzteZ, 5)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Name
                        .SortFields.Add Key:=Range(Cells(5, 6), Cells(letzteZ, 6)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Vorname
                        .SortFields.Add Key:=Range(Cells(5, 7), Cells(letzteZ, 7)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Datum
                    Case "Adresse"
                        .SortFields.Add Key:=Range(Cells(5, 10), Cells(letzteZ, 10)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Adresse
                        .SortFields.Add Key:=Range(Cells(5, 7), Cells(letzteZ, 7)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Datum
                        .SortFields.Add Key:=Range(Cells(5, 5), Cells(letzteZ, 5)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Name
                        .SortFields.Add Key:=Range(Cells(5, 6), Cells(letzteZ, 6)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'Vorname
                End Select
                .SetRange Range(Cells(3, 1), Cells(letzteZ, 25))
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            
            If strKriterium = "Datum (gefärbt)" Then Call FärbenSpezial(letzteZ)
            
            OLEObjects("ComboBox1").Object.Text = "Sortieren nach"
            
            Range("B4").Select
        End If
    End If
    Change = False
End Sub

Private Sub FärbenSpezial(letzteZ As Long)
    MsgBox "Programm FärbenSpezial wurde ausheführt. Zeilenanzahl: " & letzteZ
End Sub

Private Property Get Change() As Boolean
    Change = mblnChange
End Property

Private Property Let Change(ByVal pvblnChange As Boolean)
    mblnChange = pvblnChange
End Property

Gruß
Nepumuk
Anzeige
AW: Wechselwirkung Combobox
15.05.2019 15:56:51
Markus
Hallo Nepumuk
Dein Code funktionier. er blockt das zweite ausführen des DropButtonClick() Events. Ich muss mich noch etwas mit den Property auseinandersetzen aber es sollte so gehen. Vielen Dank dafür :)
Grüße
Markus
AW: Wechselwirkung Combobox
12.05.2019 19:54:39
Daniel
Hi
wie schon geschrieben wurde:
das Application.EnableEvents gilt nur die Events der Arbeitsmappe und der Tabellenblätter, sowie deren ActiveX-Steuerelemente, aber nicht für Userformen.
das Change-Event löst bei jeder Änderung am Steuerelement aus, egal was geändert wird und egal wer ändert (Anwender oder Änderung per Code)
Wenn man jetzt nur auf eine Eingabe des Anwenders reagieren will, sollte man daher nicht das Change-Event verwenden, sondern auf andere Events ausweichen, z.B. AfterUpdate, Exit, MouseUp, KeyUp, ggf auch Click
wobei Click auch wieder auf Code reagiert.
Gruß Daniel
Anzeige
AW: Wechselwirkung Combobox
15.05.2019 15:58:53
Markus
Hallo an alle
Ok das sind alles wichtige Schlüsselinformationen. Ich habe die Funktionsweise von Application.EnableEvents vollkommen falsch verstanden.
Danke an alle die sich an der Lösung meines Problems beteiligt haben.
Grüße
Markus

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige