PDA

Vollständige Version anzeigen : einstellung des autofilters per if abfragen


uqzj
28.06.2006, 11:56
Hallo.

In meiner excel Mappe sind etwa 55 spalten und 2500 zeilen. Ich erstelle nun mit hilfe eines Makros verschiedene diagramme. um diese zu füttern habe ich zusätzlich 10 spalten für einen "Tabellenzwischenspeicher" erstellt, der mir aus einer spalte nur die beschriebenen Felder rauskopiert. so bekomme ich ein diagramm ohne lücken. Diese Zwischenspeicher-Spalten möchte ich aber gerne weglassen und kann den selben effekt erzielen, indem ich den autofilter der daten, die ich brauch auf (Nichtleere) setze, und der daten, die ich nicht benötige auf (Alle). Beim Schließen des Diagramms wird der autofilter aller spalten wieder auf den vorherigen zustand zurückgesetzt. Soweit so gut. Die Makros geschrieben, funktioniert alles. Habe nun ein kleines Problem. Beim erstellen des Diagramms muss das Programm nun 53 Spalten auf (Alle) setzen und 2 Spalten auf (Nichtleere). Es rechnet mir bei 2500 zeilen mal locker 5 minuten. Da die meisten Spalten schon auf (Alle) stehen, wäre es doch sinnvoll diese statt auf (Alle) zu setzen ersteinmal zu prüfen, auf welchen wert diese gesetzt sind.
Habt ihr da eine Idee, wie ich eine IF abfrage von dem Autofilter machen kann?

Mein bisheriger ansatz sieht etwa so aus:
'AutoFilter in der 7.Zeile
Range("A7").Select
For i = 1 To 55
If Selection.AutoFilter(i) Then
Selection.AutoFilter (i)
End If

Leider sortiert der mir trotzdem gnadenlos alle spalten.
Habt ihr eine Lösung?
Danke schonmal

Lumpensammler
28.06.2006, 16:11
Hallo, uqzj,

warum nutzt Du nicht etwas wie ActiveSheet.ShowAllData für das Zurückstellen?

Gruß
LS

uqzj
28.06.2006, 17:28
Hallo Lumpensammler.
Danke für die schnelle Antwort.
Ich programiere seit einer woche mit vba. all mein wissen habe ich aus diesem forum und der Hilfe. Deswegen kenne ich leider nicht alle Möglichkeiten und Befehle.
Dieser Befehl spart mir tatsächlich 4 minuten gegenüber meiner For schleife.
Leider dauert mir das trotzdem noch etwas lange. Liegt wahrscheinlich an der großen Datenmenge.
Zudem noch: je nach diagramm sollen nicht alle auf (Alle) gesetzt werden.
Quasi so:
ActiveSheet.ShowAllData
Range("A2").Select
Selection.AutoFilter Field:=31, Criteria1:="="
Selection.AutoFilter Field:=45, Criteria1:="irgendwas"
Selection.AutoFilter Field:=47, Criteria1:="="
Selection.AutoFilter Field:=51, Criteria1:="irgendwas anderes"
Gibt es denn wirklich keine Überprüfung?

jinx
28.06.2006, 17:39
<font size="2" face="Century Gothic">Moin, uqzj,

da niemand von außen auf Deinen Code sehen kann: eventuell kann das Ausschalten der Neuberechnung und des Bildschirmaufbaus während des Makrolaufes die Zeit verkürzen.

Für verschiedene Bereiche würde ich unterschiedliche Bereiche auf den Tabellen mit Angaben vosehen, die ggf. durch Namen gekennzeichnet sind und die einzelnen Üebrgaben gewährleisten oder die Verwendung eienr Select Case-Anweisung bevorzugen, in der die einzelnen Bereiche durch die Verwendung von Begriffen aufgeschlüsselt werden. Aber ganz ohne Kenntnis der Mappe tue ich mich mit Hilfestellungen schwer...</font>

uqzj
29.06.2006, 12:29
Hallo jinx.

OK. Ich versuchs mal:

Also ich habe ein Herzustellendes Teil, das aus etwa 100 bauteilen besteht. jedes Bauteil steht einmal mit dem anlieferungstermin und einmal mit dem auslieferungstermin in einer zeile. also sind das etwa 200 zeilen pro teil.
in der ersten spalte steht der name des bauteils,
in einer anderen spalte steht der bearbeitungsort, in einer anderen die ordernummer, in einer anderen die Bauteilbezeichung. nun gibt es die möglichkeit über 5 Buttons ein diagramm für die jeweilige spalte zu erstellen.
also beispiel:
Ich kann über button nr.3 (durch combobox) nach bearbeitungsort filtern, und daraus durch die subtraktion von an und ablieferung die bearbeitungszeit für diesen bearbeitungsort darstellen. die x-achsenbeschriftung ist in dem fall die bauteilnamen der dort gefertigten bauteile. das Diagramm wird in eine neue mappe exportiert, um die originalmappe bei dem prozess nicht zu verändern. schließlich wird ein button eingefügt, der mir die neue mappe shließt, ohne zu speichern.

das problem mit dem ursprünglichen Zustand habe ich mitlerweile gelöst.
ich speichere einfach vor dem filtern die mappe, schließe die gefilterte mappe am ende der prozedur und öffne die ungefilterte mappe wieder. so hab ich den ursprungszustand, ohne zurück filtern zu müssen.
das problem ist aber noch gegenwärtig beim filtern der daten für das jeweilige diagramm. da die mappe von verschiedenen personen genutzt wird, wie beispielsweise der einkaufabteilung, die sich für die ordernummern interessieren oder der werkzeugabteilung, die sich für den berabeitungsort interessieren, wird sie von diesen menschen geflitert, nicht zurückgefiltert und gespeichert. also bekomme ich immer wieder eine unterschiedlich gefilterte mappe auf meinem Bildschirm, bei der ich erst alle daten anzeige, dann nach den für das diagramm gewollten daten filtere. wenn nun das controling die mappe als letztes vor mir geöffnet hatte und genau meine benötigten daten gefiltert hat, ich das aber nicht weiß, möcht ich nicht die aufwendige entfilter und neu filter reihenfolge durchlaufen, sondern überprüfen, auf was der filter gesetzt ist und ggf. zu filtern.
das vorerst mal zur kenntnis der mappe.
leider kann ich als gast keine dateien einfügen, deswegen der ganze text.

Mit "...Ausschalten der Neuberechnung und des Bildschirmaufbaus..." ist das gemeint?
Application.ScreenUpdating = False
is drin...
Vielen Dank schon mal

jinx
29.06.2006, 13:46
<font size="2" face="Century Gothic">Moin, uqzj,

das kann doch beim Schließen der Mappe oder dem Öffnen per Makro erledigt werden. ;)

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> ShowAutoFilterCriteria()
<span class="REM">' John Green et. al: Excel 2000 VBA Programmer´s Reference, S. 379f</span>
<span class="TOKEN">Dim</span> oAF <span class="TOKEN">As</span> AutoFilter
<span class="TOKEN">Dim</span> oFlt <span class="TOKEN">As</span> Filter
<span class="TOKEN">Dim</span> sField <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> sCrit1 <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> sCrit2 <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> sMsg <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> i <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
&nbsp;
<span class="REM"> ' Check if the sheet is filtered at all</span>
<span class="TOKEN">If</span> ActiveSheet.AutoFilterMode = <span class="TOKEN">False</span> <span class="TOKEN">Then</span>
MsgBox &quot;The sheet does not have an Autofilter&quot;
<span class="TOKEN">Exit Sub</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="REM"> ' Get the sheet´s Autofilter object</span>
<span class="TOKEN">Set</span> oAF = ActiveSheet.AutoFilter
&nbsp;
<span class="REM"> ' Loop through the Filters of the Autofilter</span>
<span class="TOKEN">For</span> i = 1 <span class="TOKEN">To</span> oAF.Filters.Count
&nbsp;
<span class="REM"> ' Get the field name form the first row</span>
<span class="REM"> ' of the Autofilter range</span>
sField = oAF.Range.Cells(1, i).Value
&nbsp;
<span class="REM"> ' Get the Filter object</span>
<span class="TOKEN">Set</span> oFlt = oAF.Filters(i)
&nbsp;
<span class="REM"> ' If it is on...</span>
<span class="TOKEN">If</span> oFlt.On <span class="TOKEN">Then</span>
&nbsp;
<span class="REM"> ' Get the standard filter criteria</span>
sMsg = sMsg &amp; vbCrLf &amp; sField &amp; oFlt.Criteria1
&nbsp;
<span class="REM"> ' If it´s a special filter, show it</span>
Select Case oFlt.Operator
Case xlAnd
sMsg = sMsg &amp; &quot; <span class="TOKEN">And</span> &quot; &amp; sField &amp; oFlt.Criteria2
Case xlOr
sMsg = sMsg &amp; &quot; <span class="TOKEN">Or</span> &quot; &amp; sField &amp; oFlt.Criteria2
Case xlBottom10Items
sMsg = sMsg &amp; &quot; (bottom 10 items)&quot;
Case xlBottom10Percent
sMsg = sMsg &amp; &quot; (bottom 10%)&quot;
Case xlTop10Items
sMsg = sMsg &amp; &quot; (top 10 items)&quot;
Case xlTop10Percent
sMsg = sMsg &amp; &quot; (top 10%)&quot;
<span class="TOKEN">End</span> Select
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Next</span> i
&nbsp;
<span class="TOKEN">If</span> msg = &quot;&quot; <span class="TOKEN">Then</span>
<span class="REM"> ' No filters are applied, so say so</span>
sMsg = &quot;The range &quot; &amp; oAF.Range.Address &amp; &quot; is not filtered.&quot;
<span class="TOKEN">Else</span>
<span class="REM"> ' Filters are applied, so show them</span>
sMsg = &quot;The range &quot; &amp; oAF.Range.Address &amp; &quot; is filtered by:&quot; &amp; sMsg
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="REM"> ' Display the message</span>
MsgBox sMsg
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)</font>

uqzj
29.06.2006, 14:17
Hallo jinx,
vielen herzlichen Dank. Es klappt!!! Danke.
Hab nur die bedingung der vorletzten if schleife geändert:

If msg = "" Then

in das geändert:

If sMsg = "" Then

damit ist das ei gelegt.
Danke