Daten-Liste in gefilterten Bereich kopieren (VBA)
„Ist doch ganz einfach” dachte ich früher einmal. Markieren, kopieren, in den gefilterten Bereich einfügen. Die Ernüchterung kam rasch, so geht das nämlich nicht. Die gefilterten, die nicht sichtbaren Zellen werden einfach mit ausgefüllt und das Ziel ist damit verfehlt.
Zugegeben, es gibt die eine oder andere Lösung auf reiner Formel-Basis. Aber das empfinde ich als Zumutung, weil recht umständlich handhabbar . Und natürlich muss solch eine Formel jedes Mal neu überprüft und gegebenenfalls angepasst werden. Darum ziehe ich eine „saubere” VBA-Lösung vor. Auch hier räume ich ein, dass diese vorgeschlagene Lösung etwas mehr in die Tiefe geht als ein Gelegenheitsprogrammierer es machen würde. Im Prinzip spricht auch nichts dagegen, den gefilterten Bereich mittels einer Schleife zu durchlaufen und jeweils zu prüfen, ob die Zeile sichtbar ist oder nicht. Aber bei sehr großen Dateien ist meine Lösung doch deutlich schneller und so haben Sie vielleicht eine Gelegenheit, ihren Wissenspool zu erweitern.
Diese Datei enthält in Tabelle1 einige Daten, die Sie filtern können. Ich habe es so eingerichtet, dass großzügiger weise jedes dritte Los gewinnt (siehe die Funktion in Spalte B). Mit dem Filter können Sie nun nur die Gewinner anzeigen lassen und die Verlierer ausblenden. Wenn Sie dann das Makro aufrufen, sollen die Gewinne an die „Auserwählten” per Kopie zugewiesen werden.
Zugegeben, das ganze Makro ließe sich kürzer fassen. Mit weniger Variablen und auch nicht unbedingt allen Prüfroutinen. Aber so ist es besser für Sie zu verstehen und kürzen können Sie immer noch ;-). Ach ja, vielleicht kommen Ihnen die Variablennamen einfach nur kryptisch vor. Aber bei genauerem Hinsehen werden Sie erkennen, dass sich darin ein System verbirgt. „Src” steht für „Source”, „Dst” entsprechend für „Destination”; „wks” kürzt das „WorkSheet” ab und „rng” einfach nur „Range”.
Prinzipiell sind nur wenige Anpassungen erforderlich. Das werden Sie erkennen, wenn Sie den Code Zeile für Zeile durchgehen. Viele Standards sind enthalten, die Zeile
rngDst.Areas(Ze).Offset(0, 2)
könnte Ihnen fremdartig vorkommen. Durch die Funktion Areas() wird die Range in ihre einzelnen Teile, also die einzelne Zelle zerlegt und so wird eine zielgerichtete Adressierung ermöglicht.
[NachObenLetzte Verweis=„ML: Kopie in gefilterten Bereich”]