Microsoft Excel

Herbers Excel/VBA-Archiv

Welches Ereignis ist das richtige ??

Betrifft: Welches Ereignis ist das richtige ?? von: Joachim
Geschrieben am: 13.06.2008 21:27:29

Hi ich noch mal,

nach dem ich nun mit meiner Combobox alles hingebracht habe, habe ich noch ein Problem:
Also , in meiner Tabelle habe ich die Combobox , die wird beim Start mit Daten aus einer anderen Tabelle geladen. Wenn ich die Combobox nun öffne und eine Auswahl treffe, dann wir mit dem Befehl :



Private Sub ComboBox2_DropButtonClick()
ActiveCell.Value = ComboBox2.Value
End Sub



in meine aktive Zelle reingeschrieben. So nun das Problem.

Jedesmal, wenn ich nun die Combobox mit dem Pfeil nach unten öffnen will, wird der Code bereits ausgeführt. Danach habe ich mal das Click-Ereignis aubrobiert, da reagiert der Code aber garnicht.

Was für ein Ereignis muss ich wählen, damit der Code erst ausgeführt wird, wenn ich tatsächlich in die Auswahlliste der Combobox klicke, also wenn ich wirklich eine Auswahl getroffen habe und nicht bereits, wenn ich die Combobox überhaupt nur anklicke.

Danke mal
Gruss
Joachim

  

Betrifft: Das Change-Ereignis...oT von: {Boris}
Geschrieben am: 13.06.2008 21:36:04

Grüße Boris


  

Betrifft: AW: Das Change-Ereignis...oT von: Joachim
Geschrieben am: 13.06.2008 23:35:12

Hi,

aber das Change Ereignis wirde auch schon durchgeführt, wenn die Tabelle gestartet und die daten von der einen Tabelle in die Combobox geladen werden. In diesen Moment wird das Ereihnis durchgeführt.
Somit wird beim Start jedes mal die Information in der aktiven Zelle überschrieben, obwohl ich das nicht will.

Gibt es noch eine anderes Ereignis ?

Danke
Joachim


  

Betrifft: AW: Das Change-Ereignis...oT von: Luschi
Geschrieben am: 14.06.2008 06:15:51

Hallo Joachim,

Du mußt vor dem Füllen der 'ComboBox2' die Ereignis-Ausführung deaktivieren und danach wieder freigeben.

Application.EnableEvents = False
'Prozedur zum Schreiben der Daten in die ComboBox
ComboBox2_Fuellen
'nicht vergessen
Application.EnableEvents = True

Gruß von Luschi
aus klein-Paris


  

Betrifft: Problem immer noc da, hier der Code: von: Joachim
Geschrieben am: 14.06.2008 19:25:24

Hi,
habe den Rat befolgt, aber irgend wie scheint das mit dem deaktivieren und wieder aktivieren des Change Ereignisses nicht zu funktionieren. Die Zelle wirde weiterhin bei start der Datei und nach dem laden in die Combobox überschrieben.
Woran kann das noch liegen ? Hier mein Code:


Private Sub Worksheet_Activate()
Call Fuellen
End Sub




Sub Fuellen()

Application.EnableEvents = False

Dim dic As Object
Dim xKey As Variant
Dim iRow As Long, CLetzte As Long
ComboBox1.Clear
CLetzte = IIf(IsEmpty(Range("C65536")), Range("C65536").End(xlUp).Row, 65536)
Set dic = CreateObject("scripting.dictionary")
For iRow = 1 To CLetzte
If Not IsEmpty(Cells(iRow, 3)) Then
xKey = Cells(iRow, 3).Value
dic(xKey) = 0
End If
Next
For Each xKey In dic
ComboBox1.AddItem xKey
Next
dic.RemoveAll
Set dic = Nothing
Call Sortieren1
ComboBox1.ListIndex = 0

Application.EnableEvents = True

End Sub




Sub Sortieren1()
Dim Letzter As Integer, Naechster As Integer
Dim i As String
With ComboBox1
For Letzter = 0 To .ListCount - 1
For Naechster = Letzter + 1 To .ListCount - 1
If .List(Letzter) > .List(Naechster) Then
i = .List(Letzter)
.List(Letzter) = .List(Naechster)
.List(Naechster) = i
End If
Next Naechster
Next Letzter
End With

End Sub




  

Betrifft: AW: Problem immer noc da, hier der Code: von: Tino
Geschrieben am: 14.06.2008 23:27:07

Hallo,
Application.EnableEvents

Damit kann man nur Eventereignisse auf Tabellenblatt abstellen
Beispiel Dein Worksheet_Activate oder Doppelklick in Zelle usw.
Click Ereignis ist meiner Meinung nach richtig.

Mit einer neuen Variablen (Aktion=True oder False) solltest du dies in den griff bekommen.

Option Explicit
Dim Aktion As Boolean
Private Sub ComboBox1_Click()
If Aktion = True Then Exit Sub
Debug.Print ComboBox1.Text
End Sub

Private Sub Worksheet_Activate()
 Call Fuellen
End Sub

Sub Fuellen()
Dim dic As Object
Dim xKey As Variant
Dim iRow As Long, CLetzte As Long
ComboBox1.Clear
CLetzte = IIf(IsEmpty(Range("C65536")), Range("C65536").End(xlUp).Row, 65536)
Set dic = CreateObject("scripting.dictionary")
For iRow = 1 To CLetzte
If Not IsEmpty(Cells(iRow, 3)) Then
xKey = Cells(iRow, 3).Value
dic(xKey) = 0
End If
Next
For Each xKey In dic
ComboBox1.AddItem xKey
Next
dic.RemoveAll
Set dic = Nothing
Call Sortieren1
Aktion = True
ComboBox1.ListIndex = 0
Aktion = False
End Sub

Sub Sortieren1()
Dim Letzter As Integer, Naechster As Integer
Dim i As String
With ComboBox1
For Letzter = 0 To .ListCount - 1
For Naechster = Letzter + 1 To .ListCount - 1
If .List(Letzter) > .List(Naechster) Then
i = .List(Letzter)
.List(Letzter) = .List(Naechster)
.List(Naechster) = i
End If
Next Naechster
Next Letzter
End With

End Sub




Gruß Tino
www.excelvba.eu


  

Betrifft: AW: Problem immer noc da, hier der Code: von: Joachim
Geschrieben am: 15.06.2008 15:30:17

Hallo Tino,

habe Dein Code bei mir so geändert, hatte auch auf das erste mal funktioniert. Beim zweiten hinsehen viel mir auf, dass der Code nur bei Zellen richtig funktioniert, die über die tastatur geschrieben wurden. Sobald ich den Code bei Zellen ausbrobiere, die per Makro mit daten beschrieben wurden, besteht das Problem weiterhin. Komisches Verhalten.

Soll ich Dir mal den kompletten Code kopieren ?

Gruss
Joachim


  

Betrifft: AW: Problem immer noc da, hier der Code: von: Tino
Geschrieben am: 15.06.2008 15:59:30

Hallo,
nur zu vieleicht finden wir noch eine Lösung


Gruß Tino

www.ExcelVba.eu




  

Betrifft: AW:Hinweis von: Tino
Geschrieben am: 15.06.2008 16:36:40

Hallo,
noch ein Hinweis.
Bei Deinem Beispiel, reagiert die die Combo – Click auf diese Zeile
ComboBox1.ListIndex = 0

Daher habe ich diese, durch die neue Variable eingeschränkt
Aktion = True
ComboBox1.ListIndex = 0
Aktion = False


Also bei Aktion = True, wird das Click-Ereignis direkt abgebrochen.

Gibt es in Deinem Code weitere Befehle die dieses Click Ereignis unerwünscht auslösen, so musst du diese ebenfalls abblocken.


Gruß Tino

www.ExcelVba.eu




  

Betrifft: AW: AW:Hinweis von: Joachim
Geschrieben am: 15.06.2008 19:24:49

Hi Tino,
So, nun habe ich den Code so weit gerichtet, dass der Effekt nicht mehr auftaucht. Nun habe ich noch ein kleines Problem: wenn ich die Tabelle starte, werden die Daten eingelesen. Auch wenn ich in der Combobox eine Auswahl treffe, wird sie in die aktive Zelle geschrieben. Soweit so gut.

Wenn ich nun eine andere Zelle anklicke und dort über die Combobox die GLEICHE Auswahl treffe (wie zuvor) , wird nichts in die Zele geschrieben. Wenn ich dagegen immer wieder eine andere Auswahl aus der Combobox treffe , ist das kein Problem. Aber sobald ich zwei mal die gleiche Auswahl treffe, also, wenn ich in zwei Zellen den gleichen Text reinschreiben will, wird die zweite Auswahl aus der Combobox nicht übernommen.

Kannst Du sehen, werum ?

Hier der komplette Code:



Dim Aktion As Boolean

Private Sub ComboBox1_Click()
If Aktion = True Then Exit Sub
Debug.Print ComboBox1.Text
ActiveCell.Value = ComboBox1.Value
End Sub




Private Sub ComboBox2_Click()
If Aktion = True Then Exit Sub
Debug.Print ComboBox2.Text
    Sheets("Initialien").Range("H1") = Me.ComboBox2.Value
            ActiveCell.Value = Sheets("Initialien").Range("I1")
End Sub




Private Sub Worksheet_Activate()
    Call Fuellen
        Call Fuellen2
End Sub




Sub Fuellen()
Aktion = True

Dim dic As Object
Dim xKey As Variant
Dim iRow As Long, CLetzte As Long
ComboBox1.Clear
CLetzte = IIf(IsEmpty(Range("C65536")), Range("C65536").End(xlUp).Row, 65536)
Set dic = CreateObject("scripting.dictionary")
For iRow = 1 To CLetzte
If Not IsEmpty(Cells(iRow, 3)) Then
xKey = Cells(iRow, 3).Value
dic(xKey) = 0
End If
Next
For Each xKey In dic
ComboBox1.AddItem xKey
Next
dic.RemoveAll
Set dic = Nothing
Call Sortieren1

ComboBox1.ListIndex = 0
Aktion = False
End Sub



Sub Sortieren1()
Dim Letzter As Integer, Naechster As Integer
Dim i As String
With ComboBox1
For Letzter = 0 To .ListCount - 1
For Naechster = Letzter + 1 To .ListCount - 1
If .List(Letzter) > .List(Naechster) Then
i = .List(Letzter)
.List(Letzter) = .List(Naechster)
.List(Naechster) = i
End If
Next Naechster
Next Letzter
End With

End Sub




Sub Fuellen2()

Aktion = True
Dim col As New Collection
Dim iRow As Long, aRow As Long
Dim wksA As Worksheet
Set wksA = ThisWorkbook.Worksheets("Initialien")
aRow = IIf(IsEmpty(wksA.Cells(65536, 1)), wksA.Cells(65536, 1).End(xlUp).Row, 65536)
On Error Resume Next
ComboBox2.Clear
For iRow = 1 To aRow
If Not IsEmpty(wksA.Cells(iRow, 1)) Then
col.Add wksA.Cells(iRow, 1), wksA.Cells(iRow, 1)
If Err = 0 Then
ComboBox2.AddItem wksA.Cells(iRow, 1)
Else
Err.Clear
End If
End If
Next iRow
On Error GoTo 0
Call Sortieren2
ComboBox2.ListIndex = 0

Aktion = False
End Sub



Sub Sortieren2()
Dim Letzter As Integer, Naechster As Integer
Dim i As String
With ComboBox2
For Letzter = 0 To .ListCount - 1
For Naechster = Letzter + 1 To .ListCount - 1
If .List(Letzter) > .List(Naechster) Then
i = .List(Letzter)
.List(Letzter) = .List(Naechster)
.List(Naechster) = i
End If
Next Naechster
Next Letzter
End With
End Sub




  

Betrifft: AW: AW:Hinweis von: Tino
Geschrieben am: 15.06.2008 19:51:55

Hallo,
habe mal ein neues Event eingebaut (Worksheet_SelectionChange),
bei Auswahl einer neuen Zelle wird die Cobo auf -1 gesetzt.

Private Sub ComboBox1_Click()
If Aktion = True Then Exit Sub
Debug.Print ComboBox1.Text
ActiveCell.Value = ComboBox1.Value
End Sub


Private Sub ComboBox2_Click()
If Aktion = True Then Exit Sub
Debug.Print ComboBox2.Text
    Sheets("Initialien").Range("H1") = Me.ComboBox2.Value
            ActiveCell.Value = Sheets("Initialien").Range("I1")
End Sub





Private Sub Worksheet_Activate()
    Call Fuellen
        Call Fuellen2
End Sub



Sub Fuellen()
Aktion = True

Dim dic As Object
Dim xKey As Variant
Dim iRow As Long, CLetzte As Long
ComboBox1.Clear
CLetzte = IIf(IsEmpty(Range("C65536")), Range("C65536").End(xlUp).Row, 65536)
Set dic = CreateObject("scripting.dictionary")
For iRow = 1 To CLetzte
If Not IsEmpty(Cells(iRow, 3)) Then
xKey = Cells(iRow, 3).Value
dic(xKey) = 0
End If
Next
For Each xKey In dic
ComboBox1.AddItem xKey
Next
dic.RemoveAll
Set dic = Nothing
Call Sortieren1

ComboBox1.ListIndex = 0
Aktion = False
End Sub




Sub Sortieren1()
Dim Letzter As Integer, Naechster As Integer
Dim i As String
With ComboBox1
For Letzter = 0 To .ListCount - 1
For Naechster = Letzter + 1 To .ListCount - 1
If .List(Letzter) > .List(Naechster) Then
i = .List(Letzter)
.List(Letzter) = .List(Naechster)
.List(Naechster) = i
End If
Next Naechster
Next Letzter
End With

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Aktion = True
ComboBox1.ListIndex = -1
Aktion = False
End Sub



Gruß Tino


  

Betrifft: Vielen Dank , jetzt klapps :-)) von: Joachim
Geschrieben am: 15.06.2008 20:07:06

Danke für Deine ausführliche Hilfe.

Joachim


 

Beiträge aus den Excel-Beispielen zum Thema "Welches Ereignis ist das richtige ??"