Exceldatei als Array einlesen und Doppler rausnehmen - ohne Sortierung!

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von joerg_W.

    Exceldatei als Array einlesen und Doppler rausnehmen - ohne Sortierung!

    Hallo liebe Forenmitglieder,

    ich stehe heute wieder einmal vor einem Problem und hoffe, dass ihr mir helfen könnt.

    Ich möchte in ein Array eine Exceldatei einlesen, Beispiel s.u.
    Anschließend sollen aus dem Array alle Doppler entfernt werden, die unter der Spalte Dienstleister aufgelistet sind. Das ganze soll darf jedoch nicht sortiert werden, da wir eine spezifische Rangfolge haben.

    Mit diesem Array nun neu "aufgebauten" Array möchte ich dann weiter arbeiten. Bis dato habe ich die Dienstleister erst immer kopiert, die Doppler via Excel rausgenommen und dann diese bereinigte Datenreihe in ein Tabellenblatt kopiert und im Anschluss als Array eingelesen. Ich denke mir, dass müsste doch mit meinem geplanten Ansatz schneller und weniger fehleranfällig gehen.

    Ich danke euch schon mal für eure Mühen, bis bald

    Jörg


    Projekt
    Dienstleister
    Umsatz Jan
    xxx
    Switzerland AG
    100
    xxx
    Toi SE
    50
    xxx
    ABC GmbH
    50
    yyy
    Switzerland AG
    200
    yyy
    Bären GmbH
    100
    Hi
    normal würde man sowas über ein HashSet machen, das gibt es aber in VBA afaik nicht. Habe im Internet zumindest nichts dazu gefunden. Mein Ansatz sähe daher wie folgt aus:
    • Deklariere einen Index j, der den Index angibt, an den Elemente kopiert werden sollen, nachdem doppelt vorkommende Elemente eliminiert wurden
    • Deklariere und instanziiere ein Dictionary, in dem du im späteren Schritt jeweils "Switzerland AG", "Toi SE", usw. ablegen wirst - das Dictionary ist hier der HashSet-Ersatz
    • Gehe anschließend jede Zeile durch und überprüfe, ob der Wert in der Dienstleister-Spalte bereits im Dictionary enthalten ist.
      Sofern das Element bereits enthalten ist, wird ohne Aktion die nächste Zeile verarbeitet. Andernfalls wird die Zeile an die Position j im Array kopiert und j um 1 erhöht. Außerdem wird in diesem Fall der Wert der Spalte Dienstleister dem Dictionary hinzugefügt (als Schlüssel und mit beliebigem Wert, bspw. 0).
    • Abschließend sollte noch Redim Preserve auf das zugrundeliegende Array angewendet werden, wobei j die Größe das Arrays angibt (d.h. es sollte irgendwie Redim Preserve array(j - 1) oder dergleichen lauten)

    Beachte, dass die Eingaben immer exakt sein müssen, d.h. Switzerland AG und Switzerland Ag würden bspw. nicht als identisch gehandhabt. Sollte aber normal eh nicht passieren. Übrigens klingt das für mich nach was datenbankhaftem. Teilweise rentiert es sich, Datenbanken zu verwenden, statt Excel-Sheets, zumal Excel auch eine Datenbankeinbindung unterstüzt (wie weit, weiß ich allerdings nicht).
    Beachte außerdem, dass das Eingabearray überschrieben wird.

    Ich hoffe, dass das Dictionary in VBA halbwegs gleich arbeitet, wie in .Net. Ich habe bisher nur ausgesprochen wenig mit VBA gemacht. In .Net handelt es sich um eine Struktur, die effizient Schlüssel auf Werte abbildet. Im Fall dieses Problems benutze ich das Dictionary, um zu überprüfen, ob ein Schlüssel bereits im Wörterbuch enthalten ist, da es sich eben um ein redundantes Element handelt. Folglich wird diese Zeile nicht in das Resultat aufgenommen. Der Wert-Eintrag im Dictionary ist egal, da er nicht genutzt wird, es wird nur auf die hoffentlich effiziente Abfrage, ob ein Schlüssel im Wörterbuch enthalten ist zurückgegriffen (in .Net ist diese beinahe unabhängig von der Zahl der Elemente im Wörterbuch und daher extrem effizient, auch für recht große Datenmengen von mehreren hunderttausend Datensätzen).

    Viele Grüße
    ~blaze~
    Hallo -blaze-,

    erstmal vielen Dank für Deine Mühen und Deine Ausarbeitung. Beim lesen hat mir ehrlich gesagt der Kopf etwas geraucht :)

    Nichtsdestotrotz werde ich mich gleich mal hinsetzen und versuchen Deinen Vorschlag nach VBA zu konvertieren. Da ich selber auch (noch) kein großer VBA-Kenner bin, wäre ich nachwievor auf die Hilfe weiterer Foren-Mitglieder dankbar. Aber wie gesagt, ich versuche mal etwas zusammenzustellen.

    Schöne Grüße
    Jörg
    Hey,

    es ist immer ganz gut wenn man selber was zeigt was man schon versucht hat.
    Ein Dictionary ist hierfür definitiv geeignet, aber es gibt auch Excel interne Funktionen zum Entfernen von Duplikaten.
    Das ist eine Methode von Range Objekten:
    msdn.microsoft.com/en-us/library/office/ff193823.aspx

    Was soll denn mit den Werten unter Umsatz Jan passieren?
    Soll das alles einfach weg?
    Das ist meine Signatur und sie wird wunderbar sein!
    Hi Mono,

    danke nochmals für deine Hilfe gestern.

    Aktuell habe ich eine per Hand in eine Tabelle eingetragene Übersicht über die vorkommenden Namen. Hier ermittle ich die Anzahl und übergebe die Namen in ein Array. Mit den Werten aus der Spalte Projekt und den Firmen startet dann ein Reporting, welches mir diese beiden Merkmale in Gruppen gegenüberstellt. Man könnte das auch auf alle Fälle mit einer Pivot-Tabelle machen, ich würde hier jedoch gerne auf ein VBA Makro zurückgreifen.
    Da diese Ursprungstabelle sich aber jeden Monat ändert und ich nicht jeden Monat prüfen will, ob neue Dienstleister mit hinzugekommen sind, dachte ich mir ich bekomme das mit einem Array am besten gebacken - geht schneller und ist wesentlich fehlerfreier als ich. Wenn du noch weiterhin Tipps für mich hast, jederzeit gerne.

    Schöne Grüße

    Jörg