ereignisse werden nicht ausgelöst

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

Betrifft: ereignisse werden nicht ausgelöst von: marco
Geschrieben am: 04.02.2005 16:05:29

Hallo zusammen,

ich habe ein sehr merkwürdiges Problem, bei dem ich momentan überhaupt nicht weiterkomme:
Ich habe in ein Tabellenblatt eine ListBox und eine ComboBox eingefügt, die per VBA mit Werten gefüllt werden; getriggert habe ich das auf die Ereignisse Worksheet-Activate, unc cmbAbcd_Click.

Das komische ist, dass der VBA-Code überhaupt nicht ausgeführt wird, die Ereignisse anscheinend auch nicht, zumindest passiert gar nichts und meine (in den Ereignis-Prozeduren) gesetzten Haltepunkte halten auch nichts an.

Gestern wurde der Code einmal ausgeführt, nachdem ich nach dem Öffnen der Datei das Blatt einmal aktiviert habe, danach dann wieder gar nicht.
Ich bin nicht im Entwurfsmodus, Berechnung ist zum Zeitpunkt der Aktivierung auf automatisch (auch wenn das wahrscheinlich egal ist).
Ich sollte dazu sagen, dass neben dem Code für das Tabellenblatt noch jede Menge anderer Code existiert, allerdings sehe ich momentan überhaupt keine Fehlerursache.

Falls jemand eine Idee hat oder mir helfen kann, dann erkläre ich ihn zu meinem persönlichen Helden (und wenn das nicht motivierend für Euch ist, dann weiss ich auch nicht ;-))

Vielen Dank für Eure Hilfe im voraus.

Marco

Bild


Betrifft: ereignisse werden nicht ausgelöst - Nachtrag von: Marco
Geschrieben am: 04.02.2005 16:15:35

Hi, nochmal ein kleiner Nachtrag

das Problem liegt wohl hauptsächlich daran, dass ich die Boxen ins Tabellenblatt statt in ein Formular gelegt habe. Wenn ich den Code in ein anderes Tabellenblatt kopiere, dann werden alle Ereignisse ausgelöst; kopiere ich aber die Steuerelemente wieder in das neue Blatt, fangen die Probleme an. Solange sie nicht die im Code benutzten Namen haben, geht es noch. Benenne ich sie jedoch richtig, dann reagiert auch hier nichts mehr.
Wie schon gesagt, ist das merkwürdige, dass das ganze eben manchmal doch funktioniert (am Anfang z.B.). Kann es sein, dass irgendeine Eigenschaft des Tabellenblatts geändert wird, von der ich nichts mitbekommen habe?

Nochmal danke für alle Tipps!

Marco


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: stefan onken
Geschrieben am: 04.02.2005 17:09:03

hallo Marco,
Ursache für solche Phänomene könnten sein:
Variable ohne(den richtigen) Wert
eine durch On Error Resume Next unterdrückte Fehlermeldung
EnableEvents =False

Überprüfe dies, und poste zur Not den Code hier.
Gruß
stefan


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Marco
Geschrieben am: 04.02.2005 21:38:10

hi Stefan,

vielen Dank für die schnelle Antwort und den Tipp. Leider habe die Quelle bisher immer noch nicht genau gefunden, aber Du hast mich schon mal ein wenig auf Spur gebracht. Ich habe nochmal ein paar Sachen überprüft und es scheint, als dass die Steuerelemente nicht sauber initialisiert werden, die eine ListBox ist Null. Kann mir jmd sagen, in welcher guten quelle ich mal nachlesen kann, was bei steuerelementen beachtet werden muss, wenn ich sie nicht in ein formular lege? Ich habe die Elemente bisher nämlich einfach in das Blatt gelegt, benannt und dann im Code darauf referenziert, das hatte ja dann auch geklappt anfangs.
Ich habe zwar einiges an Quellen zu VBA, aber nicht zu Steuerelementen direkt. Scheint, als bräuchte ich noch Nachhilfe.


Gruß

Marco


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Björn B.
Geschrieben am: 05.02.2005 11:53:10

Hallo Marco,

mach doch mal 'nen Upload, dann kann man dir vielleicht eher helfen.

Gruß
Björn


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Marco
Geschrieben am: 05.02.2005 14:11:38

Hi Stefan & Björn,

danke für Eure Hilfsbereitschaft. Das gesamte Projekt ist mehrere MB gross, dehalb hier nur mal das Blatt, das Probleme macht + aufgerufene Fkt. (ganz unten):

Option Explicit
Dim mWB As Workbook
Dim mWS As Worksheet
Dim WithEvents wsscen As Worksheet
Dim intScenarioID As Integer
Private Const strThisSheet As String = strEinzelansichtSheetname

Private Sub Worksheet_Activate()
    Dim rngScens As Range
    Set mWB = ThisWorkbook
    Set mWS = mWB.Sheets(strThisSheet)
    Set wsscen = mWB.Sheets(strScenariosSheetname)
    Set rngScens = wsscen.Cells(2, 4)
    Set rngScens = wsscen.Range(rngScens, rngScens.End(xlDown))
    'listfillrange mit used range setzen
    lstSzenarien.ListFillRange = rngScens
    'LoadScenarios (lstSzenarien)
    'If Not (LoadScenarios(lstSzenarien)) Then
    '    MsgBox "Fehler beim Laden der Szenarien.", vbExclamation, "Ladefehler"
    '    Exit Sub
    If Not (LoadProjects(GetSIDFromListIndex(lstSzenarien), cmbProjects)) Then MsgBox "Fehler beim Laden der Projekte", vbExclamation, "Ladefehler"
        cmbProjects.ListIndex = -1
    'End If
End Sub


'###################################
Public Sub lstszenarien_Change()
UpdateControls
' LoadProjects GetSIDFromListIndex(lstSzenarien), cmbProjects
End Sub

'###################################
Private Sub cmbProjects_Click()
   LoadProjects GetSIDFromListIndex(lstSzenarien), cmbProjects
End Sub


Private Sub cmdShowCashFlow_Click()
    ReadProjectDetails GetSIDFromListIndex(lstSzenarien), GetPIDFromComboBox(cmbProjects)
End Sub



Private Sub cmdWriteCashFlow_Click()
'details aus der einzelansicht in Datenbasis speichern
WriteProjectDetails GetSIDFromListIndex(lstSzenarien), GetPIDFromComboBox(cmbProjects)
End Sub



'###################################
Private Sub wsscen_Change(ByVal Target As Range)
If Not IsEmpty(lstSzenarien) Then LoadScenarios (lstSzenarien)
End Sub



'###################################
Private Sub UpdateControls()
Dim intSID As Integer
Dim intPID As Integer
  intSID = GetSIDFromListIndex(lstSzenarien)
  If intSID = 0 Then
    MsgBox "Ungültiges Szenario ausgewählt.", vbInformation, "Ladefehler"
    Exit Sub
  End If
  
  intPID = GetPIDFromComboBox(cmbProjects)
  
  If Not LoadProjects(intSID, cmbProjects) Then
    MsgBox "Fehler beim Laden der Projekte", vbInformation, "Ladefehler"
    Exit Sub
  ElseIf intPID = 0 Then Exit Sub
  ElseIf Not ReadProjectDetails(intSID, intPID) Then
    MsgBox "Das Projekt konnte unter diesem Szenario nicht geladen werden." _
            & " Eventuell ist es unter diesem Szenario nicht vorhanden.", vbInformation, "Projekt wurde nicht geladen"
    
    'MsgBox "Das Projekt existiert unter diesem Szenario noch nicht!" _
    '       & "Falls nötig, erstellen Sie das Projekt bitte im Projektformular", vbInformation, "Projekt nicht existent"
    Exit Sub
  End If
  
End Sub



'###################################################


Public Function ReadProjectDetails(intSID As Integer, intPID As Integer) As Integer
'liest die details eines projektes aus der datenbasis aus
Dim rngSelected As Range
Dim ws As Worksheet
Dim projs As New Projects
Dim pview As ProjectView
Dim rngsrc As Range
Dim rngdest As Range
Dim r As Range
Application.ScreenUpdating = False
Set ws = Worksheets(strProjectsSheetname)
Set pview = projs.FindView(intSID, intPID)
If pview Is Nothing Then
ReadProjectDetails = -1
Exit Function
End If

Set r = pview.startrow
'Set rng = Worksheets(strThisSheet)
Set rngsrc = r

Set rngdest = ThisWorkbook.Sheets(strEinzelansichtSheetname).rows(8)
Set rngdest = Range(rngdest, rngdest.Offset(intanzahlrows - 1))
'Set rngdest = ws.Range(Cells(8, 1), Cells(8, 1).Offset(intanzahlrows - 1))
Do Until r.row = pview.endrow.row
Set rngsrc = Union(rngsrc, r)
Set r = r.Offset(1, 0)
Loop

'blattschutz aufheben
ThisWorkbook.Sheets(strEinzelansichtSheetname).Unprotect

'aktive markierung merken, um sie später wieder zu setzen
Set rngSelected = Application.ActiveCell
'kopieren
rngsrc.Copy rngdest
'optimale breite der spalten einstellen
rngdest.EntireColumn.Columns.AutoFit

'freien bereich wieder ausblenden
Dim i As Integer
'oberer bereich
For i = 1 To intanzahlfreierowsoben
rngdest.Select
rngdest.Cells(i, 1).EntireRow.Hidden = True
Next i

'linker bereich
For i = 1 To intanzahlfreierowslinks
rngdest.Select
rngdest.Cells(, i).EntireColumn.Hidden = True
Next i

'unteren bereich grau färben
For i = 1 To intanzahlfreierowsunten
rngdest.Cells(i, 1).EntireRow.Interior.ColorIndex = 15
Next i

'vorige auswahl wieder setzen
rngSelected.Select
'blatt wieder schützen
'ThisWorkbook.Sheets(strEinzelansichtSheetname).Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True

ReadProjectDetails = 1

End Function
'##############################################

Public Sub WriteProjectDetails(intSID As Integer, intPID As Integer)
'schreib details eines projektes in die datenbasis
Dim ws As Worksheet
Dim projs As New Projects
Dim pview As ProjectView
Dim rngsrc As Range
Dim rngdest As Range
Dim r As Range
Dim oldCalc As XlCalculation

'berechnung umstellen
oldCalc = Application.Calculation
Application.Calculation = xlCalculationManual

Set ws = Worksheets(strProjectsSheetname)
Set pview = projs.FindView(intSID, intPID)
If pview Is Nothing Then
MsgBox "Es konnte nicht gespeichert werden.", vbExclamation, "Speichern fehlgeschlagen"
Exit Sub
End If
Set r = pview.startrow
'Set rng = Worksheets(strThisSheet)
Set rngdest = r

Set rngsrc = ThisWorkbook.Sheets(strEinzelansichtSheetname).rows(8)
Set rngsrc = Range(rngsrc, rngsrc.Offset(intanzahlrows - 1))
'Set rngdest = ws.Range(Cells(8, 1), Cells(8, 1).Offset(intanzahlrows - 1))
Do Until r.row = pview.endrow.row
Set rngdest = Union(rngdest, r)
Set r = r.Offset(1, 0)
Loop

rngsrc.Copy rngdest

Application.Calculation = oldCalc
'rngdest.PasteSpecial
End Sub

'##########################################
'Code Ende


Jedes Mal, wenn ich die ListBox neu erstelle, dann triggert er das _Activate-Ereignis genau einmal. Ich sehe allerdings nicht, wo der Code die Box in ihren Eigenschaften verändert, abgesehen vom Einlesen der Werte.

Hoffe, es ist einigermaßen verständlich.

Marco


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Björn B.
Geschrieben am: 05.02.2005 14:31:09

Hallo Marco,

kannst du dein Tabellenblatt mit den Boxen mal in eine leere Datei kopieren und dann uploaden?

Gruß
Björn


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Marco
Geschrieben am: 05.02.2005 19:16:55

OK, hier ist der Link. Der Code selbst wird wahrscheinlich nicht funktionieren, aber um die Funktionalität geht es ja auch nicht...

https://www.herber.de/bbs/user/17513.xls


Vielleicht werdet ihr schlau daraus und seht, wo es hängt.

Danke,

Marco


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Björn B.
Geschrieben am: 06.02.2005 14:13:45

Hallo Marco,

wieso vermutest du eigentlich, dass die Ereignisse nicht ausgelöst werden? Hast du mal unter Private Sub Worksheet_Activate() eine Zeile Stop eingefügt? Dann kannst du sehen, ob das Ereignis ausgelöst wird oder nicht.

By the way, hast du deinen Code eigentlich mal kompiliert, um Fehler zu finden?

Das Grundproblem deines Codes scheint mir zu sein, dass du die Listbox (und vermutlich auch die Combobox) über die Symbolleiste Steuerelemente-Toolbox und nicht über Formular erstellt hast. Damit hast du keine MSForms.Listbox mehr, die du direkt im Code ansprechen kannst, sondern ein eingefügtes OLEObject, das die Eigenschaften einer MSForms.Listbox besitzt.

Deshalb musst du

If Not (LoadProjects(GetSIDFromListIndex(Sheets("Einzelprojektansicht").lstSzenarien), cmbProjects)) Then MsgBox "Fehler beim Laden der Projekte", vbExclamation, "Ladefehler"

an Stelle von

If Not (LoadProjects(GetSIDFromListIndex(lstSzenarien), cmbProjects)) Then MsgBox "Fehler beim Laden der Projekte", vbExclamation, "Ladefehler"

verwenden.


Das Befüllen deiner Listbox in Private Sub Worksheet_Activate() funktioniert anscheinend auch nicht richtig.

Nimm doch mal

lstSzenarien.ListFillRange = "'" & rngScens.Parent.Name & "'!" & rngScens.Address

an Stelle von

lstSzenarien.ListFillRange = rngScens

in deinen Code auf, dann füllt er auch die Liste.


Ich hoffe, das hilft dir weiter.

Gruß
Björn


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Marco
Geschrieben am: 07.02.2005 09:55:29

Hi Björn,

hatte Dir gestern schon geantwortet, aber der Beitrag ist irgendwie nicht erschienen. Egal, hier nochmal:

Stop-Befehl und Haltepunkte werden in der Ereignis-Prozedur nicht angesprochen, was mich nur vermuten lässt, dass die Ereignise nicht mehr getriggert werden.

Das Projekt habe ich auch ohne Fehler kompilieren können.

Ich habe die Boxen mal so angesprochen wie Du gesagt hast, ebenso über OLEObjects(...), beides ohne Erfolg. Es scheint aber tatsächlich ein Typenproblem zu sein. Denn wenn ich den Index der Boxen über GetSIDFromListIndex auslese, dann ist das Blatt danach "tot", wenn ich die ListBox einfach als lstSzenarien übergebe (egal, ob mit dem Umweg über Sheets(...).lstSzenarien oder direkt). Wenn ich es als OLE-Objekt übergebe, dann gibt es einen Typenkonflikt, auch wenn ich in der Definition der Funktion nur eine ListBox statt einer MSForms.ListBox erwarte.

Das Problem liegt also vielleicht daran, dass er die ListBox an GetSIDFromListIndex übergibt und dort etwas an dieser geändert wird oder eine implizite Typenumwandlung vorgenommen wird o.ä.

Falls Du weiss, wie ich das umschiffen kann, wäre ich Dir sehr dankbar!!

Mal pragmatisch gefragt: Gibt es eine andere Möglichkeit, den Inhalt der ListBox immer aktuell zu halten, da sich die einzulesenden Werte ändern können?

Gruß

Marco

P.S.: Das Befüllen ging nicht, weil ich da gerade eine anderen Weg eingeschlagen hatte, der war eben noch nicht fertig, als ich das hochgeladen hatte (ich dachte, vielleicht liegt es daran.)


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Björn B.
Geschrieben am: 19.02.2005 00:31:58

Hallo Marco,

so ein Mist, genau das Problem, was du hattest, habe ich nun mit meinem Beitrag auch gehabt.

Ich hatte dir letzte Woche am Freitag Morgen noch geantwortet und war dann in den Urlaub gefahren, mit dem guten Gewissen dir eine Lösung gepostet zu haben.

Nun bin ich gerade wieder zurück und wundere mich, dass keine Antwort von dir da ist - schau in den Archiv-Thread und ... mein Beitrag fehlt!

Ich werde also nochmal versuchen die Lösung von letzter Woche zu rekonstruieren. Tut mir leid, dass du vergeblich auf eine Antwort gewartet hast.

Gruß
Björn


Bild


Betrifft: AW: ereignisse werden nicht ausgelöst - Nachtrag von: Björn B.
Geschrieben am: 19.02.2005 00:51:50

Hallo Marco,

das Problem in deinem Code liegt darin, dass du den Codename des Tabellenblattes nun an erster Stelle deiner Exportdatei abspeicherst, aber die Einleseprozedur dort den Tabellenblattnamen und nicht den Codenamen benötigt.

Ich hab' beide Prozeduren etwas geändert, so dass nun Codename und Blattname gespeichert und wieder eingelesen werden. Beim Einlesen wird zunächst gesucht, ob der gespeicherte Codename vorhanden ist, wenn ja, dann werden die Daten in das Blatt mit dem entsprechenden Codnamen geschrieben. Wird der Codename nicht gefunden, so wird gesucht ob ein Blatt mit dem gespeicherten Tabellenblattnamen vorhanden ist. Ist dieses der Fall, so werden die Daten in das Blatt mit dem entsprechenden Tabellenblattnamen geschrieben.

Vorteil dieser Lösung, wird das Blatt umbenannt, so wird es über den Codenamen wieder identifiziert. Ist das Blatt mit dem richtigen Codenamen aber inzwischen kopiert worden, danach das Original versehentlich gelöscht und die Kopie "um Schaden zu vermeiden" wie das gelöschte Original benannt worden, so wird auch dieses gefunden.

Verwende also folgende Prozeduren:

Option Explicit



Sub exportData()
Dim wks As Worksheet
Dim sFile As String, tmp As String
Dim arr() As Variant
Dim n As Long, m As Integer, j As Long
  Application.ScreenUpdating = False
sFile = Application.GetSaveAsFilename(InitialFilename:=".txt", _
                        FileFilter:="Text Dateien (*.txt), *.txt")
    If sFile = "Falsch" Then Exit Sub
On Error GoTo ERRORHANDLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Open sFile For Output As #1
   For Each wks In ThisWorkbook.Worksheets
      If wks.CodeName <> "Tabelle1" And wks.CodeName <> "Tabelle4" And wks.CodeName <> "Tabelle2" Then
      'hier die Namen der Tabellen die NICHT exportiert werden sollen angeben!
      
      arr = wks.Range("A1:L157").Value
      arr = Application.Transpose(arr)
      
         For m = 1 To UBound(arr, 2)
            For n = 1 To UBound(arr, 1)
               'nachfolgend wird das Komma bei Dezimalzahlen in einen Punkt verwandelt, um beim
               'Import keine fehlerhafte Anzeige zu erhalten
               If IsNumeric(arr(n, m)) Then
                  For j = 1 To Len(arr(n, m))
                     If Mid(arr(n, m), j, 1) = "," Then
                     arr(n, m) = Left(arr(n, m), j - 1) & "." & Right(arr(n, m), Len(arr(n, m)) - j)
                     Exit For
                  End If
                  Next j
               End If
            tmp = tmp & ";" & arr(n, m)
            Next
         Next
      
      Write #1, wks.CodeName & ";" & wks.Name & tmp
      
      wks.Range("A1:L157").ClearContents
      
      End If
   Next
Close #1
MsgBox "Die Daten wurden erfolgreich Exportiert!"
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
.StatusBar = False
End With
Application.Run ("Formeln_einfügen")
Application.Run ("Name_zurücksetzen_1")
Application.Run ("Name_zurücksetzen_2")
Application.Run ("Name_zurücksetzen_3")
Application.Run ("Name_zurücksetzen_4")
Application.Run ("Name_zurücksetzen_5")
Application.Run ("Name_zurücksetzen_6")
Application.Run ("Name_zurücksetzen_7")
Application.Run ("Name_zurücksetzen_8")
Application.Run ("Name_zurücksetzen_9")
Application.Run ("Name_zurücksetzen_10")
Application.Run ("Zusammenfassung_ausblenden")
Application.Run ("Blattschutz")
Application.Run ("inaktive_Blätter_ausblenden")
End Sub





Sub importData()
Dim wks As Worksheet
Dim sFile As String, tmp As String
Dim arr As Variant
Dim n As Long, m As Integer, i As Integer
Application.ScreenUpdating = False
Application.Run ("Blattschutz_aufheben")
Application.Run ("alle_Tabellenblätter_einblenden")
sFile = Application.GetOpenFilename("Text Dateien (*.txt), *.txt")
    If sFile = "Falsch" Then Exit Sub
On Error GoTo ERRORHANDLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Open sFile For Input As #1
   Do While Not EOF(1)
   Input #1, tmp
   
   arr = Split(tmp, ";")
   For Each wks In Sheets
      If wks.CodeName <> arr(0) Then
         Set wks = Nothing
      Else
         Exit For
      End If
   Next
   
   If wks Is Nothing Then
      For Each wks In Sheets
         If wks.Name <> arr(1) Then
            Set wks = Nothing
         Else
            Exit For
         End If
      Next
   End If
    
   If wks Is Nothing Then
      Close #1
      MsgBox "Das Tabellenblatt zum Einfügen der Daten wurde gelöscht!"
      Exit Sub
   End If
   
   i = 1 'Zähler muss um eins höher gesetzt werden, da in arr(0) der codename
         'und in arr(1) der Blattname steht.
      
      For n = 1 To 157
         For m = 1 To 12
         i = i + 1
         wks.Cells(n, m) = arr(i)
         Next
      Next
   
   Loop
Close #1
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With
Application.Run ("Formeln_einfügen")
Application.Run ("inaktive_Blätter_ausblenden")
Application.Run ("Zusammenfassung_ausblenden")
Application.Run ("Blattschutz")
End Sub



Viele Grüße
Björn


 Bild

Beiträge aus den Excel-Beispielen zum Thema "ereignisse werden nicht ausgelöst"