PDA

Vollständige Version anzeigen : VBA - Autofilter


sautner
08.05.2001, 15:23
Hallo,

im Rahmen einer Tabellenauswertung mit VBA-Procedur wird in einem Tabellenteil ein Wert ausgelesen, dieser als Kriterium für eine Autofilterauswahl benutzt, die angezeigten Datensätze dann in eine andere Tabelle kopiert.
Problem: Wenn keine Sätze dem Kriterium entsprechen bricht die Procedur mit Fehlermeldung ab. Wie kann man ermitteln, ob ein/kein Datensatz angezeigt wird um die Kopierroutine zu umgehen oder auszuführen?
Sobald 1 Datensatz da ist, funktioniert alles. selection.row.count zeigt immer alle Datensätze der Tabelle.



------------------

jinx
24.06.2001, 21:21
<font size="2" face="Century Gothic">Moin, Klaus,

ich habe ein kleines Problem, zu verstehen, weshalb der Filter aus einem anderen Teil der Tabelle genommen wird als die Daten, die man dann abfragt. Aber die Spechte arbeiten an dem Brett vor dem Kopf...

Sind die Bereiche identisch, ergibt sich zwangsweise, dass eine Übereinstimmung da sein muss....

Also: Einschub in Deinen Code, der prüft, ob im angegebenen Bereich Wert vorhanden, dann Kopieren, wenn nicht, Fehlermeldung, Kopieren übergehen.

Tja, und was die selection.row.count angeht: solange keine Prüfung auf Inhalt erfolgt, wird die Anzahl im ausgewählten Bereich errechnet... und die ist ja wohl immer >1.

In einer Formel hätte ich Zählenwenn genommen...

<font color="#808080" size="3" face="Arial Black">cu
jinx</font>

<font size="1" face="Century Gothic">Moderatorenanmerkung: die Überarbeitung dieses Beitrages ist im Zuge der Arbeiten zu sehen, die durch den Wechsel der Forensoftware zum 01.01.2003 verursacht wurden.

Es wurde in diesem Beitrag die Signatur angepasst...</font>

Pepi
26.06.2001, 07:33
Hallo Klaus,
auch ich kann dem nicht so ganz folgen. Wenn aufgrund des Kriteriums kein Datensatz gefunden wird - wie sieht (wenn du im Einzelschritt durch das Programm gehst) dein Autofilterbereich aus? Hast du Überschriften (Feldnamen)? Ggf. setze dich an den Anfang der gefilterten Liste (oder den ersten - vermuteten - Datensatz und prüfe, ob die ActiveCell="" ist (oder ob IsNull(ActiveCell)). Natürlich kannst du auch anders auf die Zellen zugreifen. Das dürfte den Fehler, der durch nicht-Vorhandensein von Zellen (die demnach auch nicht gezählt werden können) beheben.
Viel Erfolg, Matthias

sautner
27.06.2001, 06:37
Ich muß 2 aus unterschiedlicher Herkunft stammende Tabellen, mit gleichem Inhalt aber unterschiedlichem Aufbau miteinander vergleichen und zwar so, daß ich am Ende weis, ob es in einer der Tabellen einen Datensatz gibt, den es in der anderen Tabelle nicht gibt. Ich füge beiden Tabellen 2 Felder hinzu, wobei das eine eine Schlüsselfeldfunktion übernimmt, da es sich aus dem Inhalt mehrerer Felder zusammensetzt, dessen Aufbau für beide Tabellen gleich ist. Dann vergleiche ich die Schlüsselfelder der einen mit der der anderen Tabelle und trage in das 2. angefügte Feld "Wahr" oder "Falsch" ein wenn der Satz gefunden wurde oder auch nicht. Anschließend erstelle ich ein Protokoll, das alle Datensätze, die "Falsch" sind zunächst aus der einen, dann der anderen Tabelle auflistet. Dies geschieht dadurch, das ich per Kriterium alle "Falsch"en Datensätze anzeigen lasse und die sichtbaren Sätze kopiere. Klappt solange min. 1 Satz "falsch" ist. Zur Zeit prüfe ich, ob in einem Datensatz im Prüffeld "Falsch" steht und es funktioniert auch, aber bei bisher bis zu 30 000 Datensätzen ( i.D. um 1000) je Tabelle, könnte ich mir vorstellen, das der Zeitgewinn nicht unerheblich ist, wenn ich einen internen Filter einsetzten könnte.

Klaus-Dieter
27.06.2001, 18:32
Hallo Klaus,

so etwas habe ich schon öfter gemacht. Am besten schickst Du mir per eMail je eine Beispieltabelle (die Überschriften reichen), dann kann ich Dir was anpassen.

jinx
27.06.2001, 20:42
<font size="2" face="Century Gothic">Hallo, Klaus-Dieter,

ich weiss, Du wolltest es ja sowieso:

Auszug aus Netiquette (http://www.ms-office-forum.net/forum/netiquette.php):
Antworten und Lösungen
...
Werden Beiträge per E-Mail beantwortet, würde es alle
ForumsteilnehmerInnen freuen, wenn die Problemlösung trotzdem im
entsprechenden Forum bekannt gegeben wird. Dann haben alle etwas davon
und die Frage muss ggf. nicht noch einmal neu gestellt werden.
...

Danke
<font color="#808080" size="3" face="Arial Black">jinx</font>

<font size="1" face="Century Gothic">Moderatorenanmerkung: die Überarbeitung dieses Beitrages ist im Zuge der Arbeiten zu sehen, die durch den Wechsel der Forensoftware zum 01.01.2003 verursacht wurden.

Es wurden in diesem Beitrag Links korrigiert, die auf falsche Adressen zeigten und die Signatur angepasst...</font>

sautner
28.06.2001, 08:46
Hallo, ich danke für die Ánworten und versuche nochmal präziser zu beschreiben.
2 aus unterschiedlicher Quelle stammende Tabellen einer Flächenverwaltung (eine aus einer Clipperanwendung, die andere Oracel-Auszug) mit gleichem Inhalt aber unterschiedlichem Aufbau.
Beispiel: 1. Organisation (Betreuer)3stellig, 2. Eigentumsart (privat,staatl.) 2stellig, 3. Eigentümer(EigentümerNr) 6stellig, 4. Abt, 3stellig, 5. Unterabt., 2stellig, 6. Bestand (Untergliederung v. Unterabt.). Alles Zahlenwerte. Alle Werte in beiden Tabellen, aber unterschiedliche Reihenfolge. Im 1. Durchlauf For Each wird nach anfügen des Feldes "Prüffeld" für jeden Datensatz der Prüfschlüssel gebildet.
Nach anfügen des "Suchergebnis"-Feldes wird
in einem weiteren For Each jeder Prüfschlüssel mit den Prüfschlüsseln der anderen Datei verglichen, und zwar über Kreuz, so das jeder Prüfsschlüssel in der anderen Datei gesucht wurde. Wird der Datensatz gefunden/oder nicht erfolgt der Eintrag "Wahr" oder "Falsch" im Suchergebnis-Feld im Datensatz des gesuchten Prüfschlüssels.
Im Kriterienbereich für das Suchergebnis-Feld steht der Wert "Falsch". Daher werden bei der Ausführung eines benutzerdefinierten Filters alle Datensätze gezeigt, die im Suchergebnisfeld ein "Falsch" enthalten.
Zum Übertragen der gefundenen Sätze benutze ich copy visible. Wird kein Satz angezeigt, bekomme ich eine Fehlermeldung. Zur Umgehung dieser Fehlermeldung, lasse ich zur Zeit eine For each laufen, die abgebrochen wird, wenn das erste "Falsch" erscheint um dann erst die Filterung und das copy visible zu starten.
Das heißt aber, das jeder Satz angefaßt wird und es entsprechend lange dauert. Ich suche nach einer Funktion wie "Count", die die Anzahl der Datensätze der DB anzeigt und als interne Funktion wesentlich schneller ist, als eine "For Each"-Schleife.