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

Calculate-Ereignis nur durch Autofilter auslösen

Calculate-Ereignis nur durch Autofilter auslösen
28.05.2004 14:25:13
Boris
Hi Leute,
um das filtern per Autofilter mit einem Ereignis abzugreifen, habe ich in eine leere Zelle die Funktion =ZUFALLSZAHL() geschrieben.
Dadurch wird das Calculate-Ereignis angestoßen, welches ich wiederum für weitere Dinge benötige.
Allerdings möchte ich das Ereignis nur auslösen, wenn irgendein Filtervorgang vorgenommen wurde.
Normale Aktionen in der Tabelle - z.B. das schlichte Eingeben von Werten etc. - sollen das Ereignis nicht auslösen.
Wie kann ich das realisieren? Eventuell auch mit einem ganz anderen Ansatz?
Grüße Boris
AW: Calculate-Ereignis nur durch Autofilter auslösen
28.05.2004 14:31:54
ANdreas
Hallo Boris,
ich schlage vor:
Menü Extras, Optionen, unter Berechnen die Berechnung auf manuell umzustellen.
Dann wird nur noch berechnet, wenn Du F9 drückst - und das sollte nach einem Filtervorgang ja sehr leicht sein F9 zu drücken.
Hoffe das hilft weiter,
Andreas
O.K. - das ist schonmal ne pragmatische Lösung...
Boris
Hi Andreas,
...das kann ich natürlich machen - jedoch habe ich in der Tabelle auch Formeln, die sich wiederum automatisch bei Änderungen aktualisieren soll(t)en.
Daher interessiert mich, ob es dafür auch ne quasi "vollautomatische" Lösung gibt.
Ich stell die Frage daher nochmals auf "noch offen" ;-)
Danke und Grüße
Boris
Anzeige
AW: wager Denkansatz...
28.05.2004 14:55:30
Matthias
Hallo Boris,
Schade, dass (zumidest mit Excel XP) das Calculate-Eregnis VOR dem Change-Ereignis ausgelöst wird. Ansonsten könnte man mit 'ner Public-Variablen prüfen, ob vorher das Change-Ereignis ausgelöst wurde...
Hab grade ich die Richtung versucht, komm' jetzt aber auch nicht weiter :-(
Grüße,
Matthias
AW: Calculate-Ereignis nur durch Autofilter auslösen
Martin
Hallo Boris,
ob gefiltert ist (nicht ob gerade eine "Filterbefehl" abgesetzt wird) könntest Du unelegant vielleicht so abfangen:

Private Sub Worksheet_Calculate()
On Error GoTo errorhandler
For Each f In ActiveSheet.AutoFilter.Filters
Next
MsgBox "Autofilter gesetzt"
'Call DeinMakro
Exit Sub
errorhandler:
MsgBox "Kein Autofilter gesetzt"
End Sub

Gruß
Martin Beck
Anzeige
Danke - aber es ging mir um den eigentlichen...
Boris
Hi Martin,
...Filtervorgang. Der Autofilter ist eh dauerhaft aktiv.
Grüße Boris
AW: Ansatz
Martin
Hallo Boris,
schau Dir mal die Hilfe zu FILTERS an. Wenn ich Dich recht verstehe, möchtest Du das Calculate-Ereignis ausnutzen, wenn neu gefiltert wird. Dann ändert sich aber die Filters-Auflistung, und Du müßtest "nur" die alte mit der neuen Liste vergleichen.
Zu K.Rolas Vorschlag:
Vorgängerzellen = Zellen, die in der Formel vorkommen; in VBA: DirectPrecedents
Nachfolgerzellen = Zellen, die auf eine Zelle Bezug nehmen; in VBA: DirectDependents
Gruß
Martin Beck
AW: Ansatz - hier auch mal der gesamte Hintergrund
Boris
Hi Martin,
schau Dir mal die Hilfe zu FILTERS an. Wenn ich Dich recht verstehe, möchtest Du das Calculate-Ereignis ausnutzen, wenn neu gefiltert wird. Dann ändert sich aber die Filters-Auflistung, und Du müßtest "nur" die alte mit der neuen Liste vergleichen.
Die Filters-Auflistung muss sich nicht unbedingt ändern.
Wenn ich Spalte C nach Top10 gefiltert habe, dann ist der Filter aktiv. Filtere ich jetzt die gleiche Spalte nach nem anderen Kriterium, dann ist der Filter aber immer noch aktiv - es liegt also keine Änderung in der Filter-Auflistung vor und das Calculate-Ereignis würde nicht angestoßen (was ich aber gerne möchte).
Hintergrund: Es geht mir darum, die Filterkriterien eines mittels Autofilter gefilterten Blattes in einem separaten Blatt auszulesen.
Dazu habe ich inzwischen folgenden Code gebastelt, der mit Hilfe von K.Rola, Nancy und "Well Ness" bereits etwas verfeinert wurde.
Der Code funktioniert soweit fehlerfrei - nur möchte ich ihn nicht manuell starten, sondern eben automatisch in dem Moment, in dem irgendwo gefiltert wird.
Es gibt derzeit nur noch Auswertungsfehler (bei der UDF "Bedingung"), wenn in den gefilterten Zellen die Zeichen ">, Ist sicherlich nur das i-Tüpfelchen, aber ich möchte es eben gerne versuchen.
Hier der gesamte Code (einfach komplett in ein allgemeines Modul):
Option Explicit
Option Base 1

Sub aktive_Filter()
Dim i           As Integer
Dim j           As Integer
Dim iCount      As Integer
Dim Ash         As Worksheet
Dim iCol        As Integer
Dim myArray()   As Variant
Dim strTemp     As String
Dim lRow        As Long
Dim Blatt       As String
Blatt = "AF-Kriterien"
Set Ash = ActiveSheet
With Ash
If .FilterMode Then
iCol = .AutoFilter.Range.Column - 1
lRow = .AutoFilter.Range.Row
For i = 1 To .AutoFilter.Filters.Count
If .AutoFilter.Filters(i).On Then iCount = iCount + 1
Next i
ReDim myArray(iCount, 7)
For i = 1 To .AutoFilter.Filters.Count
If .AutoFilter.Filters(i).On Then
j = j + 1
myArray(j, 1) = Application.Substitute(Cells(1, i + iCol).Address(0, 0), 1, "")
myArray(j, 2) = Trim(Application.Substitute(Application.Substitute(.Cells(lRow, i + iCol), _
Chr(10), " "), "-", ""))
strTemp = .AutoFilter.Filters(i).Criteria1
myArray(j, 3) = Bedingung(strTemp)
myArray(j, 4) = Bereinigen(strTemp)
strTemp = ""
If .AutoFilter.Filters(i).Operator <> 0 Then
myArray(j, 5) = IIf(.AutoFilter.Filters(i).Operator = xlAnd, "und", "oder")
'Behelf, falls z.B. nach Top10 gefiltert wurde (=Operator 3 und größer)
'Da dabei kein 2. Kriterium existiert, käme es zu einem Fehler
If .AutoFilter.Filters(i).Operator < 3 Then strTemp = .AutoFilter.Filters(i).Criteria2
myArray(j, 6) = Bedingung(strTemp)
myArray(j, 7) = Bereinigen(strTemp)
strTemp = ""
End If
End If
Next i
Else
MsgBox "Der Autofiltermodus ist im aktiven Blatt nicht aktiv...", , "Kleiner Hinweis..."
If BlattExistent(Blatt) Then Worksheets(Blatt).Cells.ClearContents
Exit Sub
End If
End With
If BlattExistent(Blatt) = False Then
Application.ScreenUpdating = False
Worksheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Blatt
Ash.Activate
Application.ScreenUpdating = True
End If
With Worksheets(Blatt)
.Cells.ClearContents
.[a1:g1] = Array("Spalte", "Überschrift", "Bedingung 1", "Kriterium 1", "Operator", "Bedingung 2", "Kriterium 2")
.[a1:g1].Font.Bold = True
If iCount Then .Range("A2:G" & iCount + 1) = myArray
.Columns("A:G").AutoFit
End With
End Sub


Function Bedingung(str As String) As String
With WorksheetFunction
If Len(str) - Len(.Substitute(.Substitute(str, "=", ""), "*", "")) = 3 Then Bedingung = "enthält": Exit Function
If Len(str) - Len(.Substitute(.Substitute(str, "<>", ""), "*", "")) = 4 Then Bedingung = "enthält nicht": Exit Function
If InStr(1, str, "<>*") > 0 Then Bedingung = "endet nicht mit": Exit Function
If Len(str) - Len(.Substitute(.Substitute(str, "<>", ""), "*", "")) = 3 Then Bedingung = "beginnt nicht mit": Exit Function
If InStr(1, str, "=*") > 0 Then Bedingung = "endet mit": Exit Function
If Len(str) - Len(.Substitute(.Substitute(str, "=", ""), "*", "")) = 2 Then Bedingung = "beginnt mit": Exit Function
If InStr(1, str, "<=") > 0 Then Bedingung = "kleiner oder gleich": Exit Function
If InStr(str, ">=") > 0 Then Bedingung = "größer oder gleich": Exit Function
If InStr(1, str, "<>") > 0 Then Bedingung = "entspricht nicht": Exit Function
If InStr(1, str, "<") > 0 Then Bedingung = "kleiner als": Exit Function
If InStr(1, str, ">") > 0 Then Bedingung = "größer als": Exit Function
If InStr(1, str, "=") > 0 Then Bedingung = "entspricht": Exit Function
Bedingung = ""
End With
End Function


Function Bereinigen(str As String) As String
With WorksheetFunction
Bereinigen = .Substitute(.Substitute(.Substitute(.Substitute(str, ">", ""), "<", ""), "=", ""), "*", "")
End With
End Function


Function BlattExistent(Blattname As String) As Boolean
Dim Sh As Object
For Each Sh In ThisWorkbook.Sheets
If Sh.Name = Blattname Then BlattExistent = True
Next Sh
End Function

Grüße Boris
Anzeige
AW: Ansatz - hier auch mal der gesamte Hintergrund
Martin
Hallo Boris,
leider fehlt mir gerade die Zeit, mir das genauer anzusehen.
Filters: Du hast recht, aber die Criteria1 und ggf. Criteria2 sowie Operatoren müßten sich doch ändern, oder? Und das könnte man doch abfragen?
Na ja, wahrscheinlich ist K.Rolas Ansatz´ohnehin besser.
Gruß
Martin Beck
AW: Ansatz - hier auch mal der gesamte Hintergrund
Boris
Hi Martin,
danke bisweilen für deine Anregungen.
Wenn du mal Lust und Zeit hast, dann lass den Code doch einfach mal laufen - er funktioniert soweit (bis auf die genannte Einschränkung) einwandfrei.
Und dabei gibt es auch die UDF "Bedingung", die eben genau die von dir genannten Filterkriterien ausliest.
Allerdings denke ich, dass dieser Weg recht umständlich wäre, zumal ich in realo ca. 130 Spalten - und somit 130 Filter - auf Änderungen abfragen müsste. Kann mir vorstellen, dass das nicht sehr elegant und/oder performant wird.
Ich werde also zunächst in K.Rola´s Richtung weiterdenken.
Danke und Grüße
Boris
Anzeige
AW: Calculate-Ereignis nur durch Autofilter auslösen
K.Rola
Hallo Boris,
frag im Change- Ereignis ab, ob die veränderte Zelle einen direkten
Vorgänger oder Nachfolger hat. Wenn nicht, Berechnung manuell, ansonsten
automatisch.
Allerdings wirst du da ohne On Error nicht auskommen.
Gruß K.Rola
Das muss ich erstmal sacken lassen...
Boris
Hi K.Rola,
...und meine kleinen grauen Zellen mal in Gang setzen, da ich ad hoc nicht weiss, was du mit Vorgänger und Nachfolger meinst bzw. wie ich die ermittel.
Aber ich denke nach (weil ich weiss, dass es mich zu Lösung führt) und melde mich wieder.
Danke bisweilen und Grüße
Boris
OffTopic @K.Rola
28.05.2004 16:52:33
Matthias
Halo K.Rola,
könntest Du bitte einen Blick hierauf werfen?
https://www.herber.de/forum/messages/432640.html
Ich weiß, wir hatten das Thema in den letzten Monaten immer mal wieder, aber bin immer noch nicht zu einem befriedigenden Ergebnis gekommen...
Grüße,
Matthias
Anzeige
AW: OffTopic @K.Rola
K.Rola
Hallo,
worum gehts dir genau, ich weiß nicht mehr, was damals gefragt war.
Gruß K.Rola
AW: OffTopic @K.Rola
28.05.2004 17:12:24
Matthias
Hallo K.Rola,
Mein Ziel ist, in Excel 2000 den möglichen Doppelklick in ein freies Feld neben der Symbolleiste zu deaktivieren, damit der Dialog "Anpassen" nicht mehr erscheint.
Ab XP gibt's ja Commandbars.DisableCustomize = True, aber für Excel 2000 nicht...
Erinnerst Du dich?
Gruß Matthias
AW: OffTopic @K.Rola
K.Rola
Hallo,
ich kann das unter Excel 2000 nicht testen, aber da sollte es doch auch
möglich sein, Application.OnDoubleClick zu deaktivieren und in allen
Commandbars das control Anpassen... zu disablen?
Wenn nicht, dann die harte Methode, die Toolbar List disablen.
Gruß K.Rola
Anzeige
AW: OffTopic @K.Rola
28.05.2004 18:27:47
Matthias
Hallo K.Rola,
Ich hab mal gelesen, dass Application.OnDoubleClick eigentlich obsolet ist und nur noch aus Kompatibilitätsgründen unterstützt wird.
Aber du hast recht, so wird es wohl gehen.
Vielen Dank nochmal.
Grüße,
Matthias
AW: OffTopic @K.Rola
K.Rola
Hallo,
obsolet oder nicht, jedenfalls gibts auch unter 2002/2003 dieses
Ereignis noch.
Gruß K.Rola
AW: OffTopic @K.Rola
28.05.2004 19:09:34
Matthias
Hallo K.Rola,
vielleicht sollte ich auch etwas pragmatischer sein ;-)
Danke und Gruß
Matthias
Hilf mir doch mal bitte auf die Sprünge...
Boris
Hi K.Rola,
geht es in der Tat um "DirectPrecedents" und "DirectDependents" ?
Ich komm derzeit von meinem Schlauch nicht runter...
Bin jetzt aber erstmal weg - melde mich erst um einiges später wieder!
Grüße Boris
Anzeige
AW: Hilf mir doch mal bitte auf die Sprünge...
K.Rola
hallo Boris,
Grundgedanke ist, das ja eigentlich eine Berechnung nach Änderung nur erfolgen
soll, wenn sich irgendetwas in Zellen ändert, auf die eine Formel Bezug nimmt
oder wenn sich die geänderte Zelle auf eine andere Zelle bezieht.
Daher nur berechnen, wenn es eine Nachfolgerzelle oder eine Vorgängerzelle
gibt, das kann man ja abfragen.
Gruß K.Rola
The chicken or the egg
28.05.2004 18:51:02
Well
was ist zuerst da ?
Erstelle doch dein Datenblatt vorher und wenn dieses aktiviert wird, lese den Autofilter aus.
Ich sehe wirklich das Problem nicht.
Fare Well
Immer zuerst das Ei...
Boris
Hi Well Ness,
...sonst wär´s ja langweilig;-)
Hast Recht - ist am Einfachsten. Und dennoch würd´s mich grundsätzlich interessieren, wie es denn geht. Ich möchte ja lernen...
Grüße Boris
Anzeige
Das funktioniert perfekt...
Boris
Hi Nepumuk,
...hab´s zwar noch nicht verstanden, aber das kommt hoffentlich noch.
Danke!
Grüße Boris
Japanisch lernen obwohl man nach China fährt
28.05.2004 23:30:56
Well
ist irgendwie unnötig.
Man löst ein Problem und stellt sich nicht Probleme wie man ein Problem lösen könnte wenn es keine Problemlösung gäbe.
Fare Well
P.S.
Warum wird eigentlich hier manchmal ein Problem nicht formuliert sondern in Dateien abgelegt ?
(oder auch Lösungen)
Nur ein Masochist lädt sich fremde Dateien auf den Rechner.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige