Bin an einem Makro dran in Excel.
Zweck ist an einer bestimmten Spalte alle vorkommenden Dublikate (mehrfacheinträge) rot zu färben.
Diesen Zweck erfüllt das Makro wunderbar.
Nun wollte ich es erweitern mit der Funktion "Zuordnung". Also ich deklariere einen Zuordnungsbegriff z.b. "C". Ich sage dem Script auch per eingabefeld in welcher spalte sich die "Zuordnungs Spalte" befindet. Nun soll das Makro alle Felder die doppelt vorhanden sind rot färben soweit die Zuordnung (also die eingabe) mit der "zuordnungs Spalte" übereinstimmt.
Ergebniss = Es funktioniert bedingt. also nur manchmal und ich bin nicht dahinter gekommen wieso nicht immer.
In der Excel datei hab ich 2 möglichkeiten beschrieben das zu testen um zu sehen das es bei der 1. klappt aber bei der 2. nicht.
(Download entfernt, da Problem gelöst)
Wenn die abfrage kommt beim starten "bereinigen der tabelle"? dann mit Nein antworten. weil da ist mein beispiel drin.
Und nach der 1. möglichkeit alle zellen markieren und die farbe löschen. dann erst mit der 2. möglichkeit beginnen.
Mir sind einige Dinge darin unklar... leider gibts keine Kommentare im Source, was es recht schwierig macht.
Allgemein außerdem der Tip keine Sprungmarken zu verwenden. Sich wiederholende Vorgänge lieber als eigene Funktionen schreiben. Ist sauberer.
ok.. damit ich erst mal verstehe, was du da tust (und warum), folgende Fragen:
Why -1 ? Soweit ich das verstehe, geht es um die Spalte in der die Zuordnung enthalten sein soll... die gibt der User ja selbst ein. Warum ziehst du da 1 ab?
Endgültig verwirrt mich dann
Kann gut sein, dass ich da was überseh, aber mir ists etwas unklar.
Ich bin mir nicht ganz sicher warum du "Spalte + SpaltenZuordnung" verwendest um die Zelle anzusprechen. Du willst doch an der jeweiligen Stelle gezielt auf die Zelle der "Zuordnungsspalte" zugreifen.
Sollte es nicht mit Cells(ReihenSprung, SpaltenZuordnung) eher klappen?
Mir scheint es fast so als würdest du mit diesen zwei Dingen grad im Versuchsbeispiel Glück haben - weil du zuerst eins abziehst und dann (weil im Versuchsbeispiel die zu untersuchende Spalte die 1. ist) wieder 1 dazuzählen. Ich hab sowohl das -1 weggenommen als auch das "Spalte +".
Ergebnis:
Es ist natürlich nicht die Lösung deines Problems.. aber das Ding verhält sich zumindest noch so wie vorher. Ich bin mir also nicht ganz sicher, ob das keine Fehler waren, die sich nur einfach noch nicht gezeigt haben.
Aber wie gesagt: Kann auch gut sein, dass ich mich irre und lasse mich natürlich auch gerne eines Besseren belehren. Bis dahin lass ich den Code aber so.
Zudem glaube ich, dass es besser wäre den Inhalt der Zelle mit .value anzusprechen.
Also
statt
oder wie es in deinem Fall noch steht:
Aber auch das ist nicht der eigentliche Fehler. Es ist nur sauberer IMHO.
Wirklich schwer wirds für mich, nachzuvollziehen warum du "CountIf" einsetzt. Diese Funktion gibt, soweit ich das jetzt rausfinden konnte, zurück WIEVIELE Zellen deiner Auswahl entsprechen. Das bringt aber sowieso insofern IMHO gar nichts, als dass du dadurch eigentlich gar nicht wirklich weißt, WELCHE das nun sind. Dass das Ganze dennoch funktioniert, wundert mich ehrlich gesagt ein wenig.
Ich würde den ganzen Algorithmus ganz anders machen... in zwei Schleifen nämlich. Die erste Schleife geht Zelle für Zelle durch (wie dus ja schon machst) und holt sich immer den Wert der jeweiligen Zelle... darin wird dann nochmals eine "Unterschleife" gestartet, die dann für sich ebenfalls Zelle für Zelle durchgeht und nachsieht ob dieser Wert als solcher ebenfalls woanders vorkommt.
.....
..
Je mehr ich jetzt drüber nachdenke, desto klarer wirds mir:
Du gehst Reihe für Reihe durch, nimmst den Wert immer wieder als einzelnen her und checkst mit der CountIf Funktion von Excel ob dieser Wert öfters vorkommt. Und wenn ja, dann färbst du (obwohl du dann auch IMHO nicht
sondern eher
schreiben solltest... ist zwar eh net möglich, dass der Wert 0 ist (da er sonst gar nicht erst eingelesen hätte werden können).. aber es ist trotzdem sauberer.
Aber genau hier liegt der Fehler:
Du checkst "WAS IST DOPPELT?" und "HAT ZURODNUNGSBEGRIFF [X]".
Und genau das macht er dann auch... er sieht nach, was öfter als 1 Mal gefunden wird und markiert dann all jene von den doppelten Begriffen rot, die als Zuordnung Begriff [X] haben.
In deinem Beispiel:
Du willst alles markieren, was doppelt ist, vorrausgesetzt es hat den Buchstaben "C" in der Zuordnungsspalte. Und zwar ebenfalls mehr als nur einmal.
Dein Makro prüft aber zunächst "was ist doppelt" (zum Beispiel ist ja auch die Zahl 8 doppelt... weil hier ja noch gar nicht berücksichtigt wird, ob die Zahl 8 auch in Zusammenhang mit dem Buchstaben C in der Zuordnungsspalte doppelt vorkommt) und markiert dann bei allen doppelt gefundenen jene, die den Buchstaben "C" drinnen haben.
Deshalb markiert er auch schön brav die Zahl 8 (in Zelle A9). DENN: 8 kommt mehr als einmal vor... und in Zelle A9 hat die Zahl 8 in der Zuordnungsspalte den Buchstaben C.
Ich hoffe dir ist jetzt klar was ich meine.
ALSO:
Verwende, statt die Duplettenprüfung lediglich "CountIf" zu überlassen eine zweite Schleife dafür, die die Zellen für sich nochmals durchgeht.
Beim ersten Fund einer Zahl in Zusammenhang mit der Zuordnung, soll sie deren Zelle in eine Variable schreiben. Findet es sie ein zweites Mal, soll sie sie rot machen (und bei jedem zukünftigem Fund ebenfalls). Am Ende macht Sie noch die rot, die du eben in der Variable gespeichert hast.
Ich weiß, dass das jetzt kompliziert ist.. aber ich kanns net besser beschreiben.
Bin jetzt erst dazu gekommen deinen Post zu lesen. VIELEN DANK!!!!
Es funktioniert perfekt und schnelle Laufzeit. also mir scheint es noch kürzer zu dauern.
Hab noch die Statistikschleife mit der "Reihe" Variable verknüpft mit Step -1 .
Dann geht er nicht alle 65536 Zellen durch. nochmals ein Speed zuwachs.
Hab noch bei der Statistik Message am schluß das " + 1 " entfernt bei
" SpaltenZuordnung + 1 ".
Wirklich beeindruckend das du dich da reingearbeitet hast. Nochmals THX!