Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
560to564
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
560to564
560to564
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

ereignisse werden nicht ausgelöst

ereignisse werden nicht ausgelöst
04.02.2005 16:05:29
marco
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

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

Betreff
Datum
Anwender
Anzeige
ereignisse werden nicht ausgelöst - Nachtrag
04.02.2005 16:15:35
Marco
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
Anzeige
AW: ereignisse werden nicht ausgelöst - Nachtrag
04.02.2005 17:09:03
stefan
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
AW: ereignisse werden nicht ausgelöst - Nachtrag
04.02.2005 21:38:10
Marco
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
Anzeige
AW: ereignisse werden nicht ausgelöst - Nachtrag
05.02.2005 11:53:10
Björn
Hallo Marco,
mach doch mal 'nen Upload, dann kann man dir vielleicht eher helfen.
Gruß
Björn
AW: ereignisse werden nicht ausgelöst - Nachtrag
05.02.2005 14:11:38
Marco
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
Anzeige
AW: ereignisse werden nicht ausgelöst - Nachtrag
05.02.2005 14:31:09
Björn
Hallo Marco,
kannst du dein Tabellenblatt mit den Boxen mal in eine leere Datei kopieren und dann uploaden?
Gruß
Björn
AW: ereignisse werden nicht ausgelöst - Nachtrag
05.02.2005 19:16:55
Marco
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
AW: ereignisse werden nicht ausgelöst - Nachtrag
06.02.2005 14:13:45
Björn
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
Anzeige
AW: ereignisse werden nicht ausgelöst - Nachtrag
07.02.2005 09:55:29
Marco
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.)
Anzeige
AW: ereignisse werden nicht ausgelöst - Nachtrag
19.02.2005 00:31:58
Björn
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
AW: ereignisse werden nicht ausgelöst - Nachtrag
19.02.2005 00:51:50
Björn
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
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige