Mit Schleife Arrays erstellen

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Mit Schleife Arrays erstellen

    Hallo liebe Forengemeinde,
    ich habe ein kleines Problem mit dem Programmieren eines Codes. Diesmal geht es aber weniger um den Code, sondern eher um die Möglichkeiten die man mit VBA hat.
    Nehmen wir mal, ich arbeite für die Rewe AG und versuche unsere Produktpreise mit denen der Konkurrenz zu vergleichen.
    Ich ziehe mit einem anderen Code die Rohdaten in ein Tabellenblatt, woraufhin ein anderer Code die Preise aus dem Internet holt.
    Gibt es für unsere Produkte ein Vergleichsprodukt von der Konkurrenz, wird unser Produkt und alle Produkte von der Konkurrenz (sofern vorhanden) in ein neues Tabellenblatt kopiert.
    Es ist möglich, dass es nur ein Konkurrenzprodukt gibt, es kann aber auch sein, dass es mehrere gibt.
    Das resultierende Tabellenblatt sieht dann in etwa so aus:



    A B C D E F G H
    1 Rewe 10 toom 9 Penny 12 Real 7

    2 Rewe 8 toom 4

    3 Rewe 14 Penny 12 Real 6

    4 Rewe 4 toom 34 Real 9

    Nun möchte ich sowas wie eine Auswertung vornehmen. Ich möchte in einem letzten Tabellenblatt ein Auswertung der Daten haben.
    Wie geht man hier am besten vor? Mir wäre es am liebsten durch die Zeilen zu gehen und die Preise von uns mit denen der Konkurrenz zu vergleichen. Ist unser Preis höher, dann möchte ich dass unser Preis und der niedrigere Preis der Konkurrenz in ein Tabellenblatt kopiert werden.
    Ist es möglich mit einer Schleife jede Zeile als Array zu definieren und das Minimum daraus zu holen?
    Für Zeile eins bspw. [10,9,12,7] Unser Preis ist IMMER an erster Stelle in meinem Tabellenblatt. Sind in dem Array niedrigere Werte als der erste Wert, dann sollen diese jeweils in das "Auswertungssheet" kopiert werden.
    Ist dieser Weg intelligent oder hat jemand eine einfachere (und vorallem schnellere) Idee?

    JulesM schrieb:

    Nehmen wir mal, ich arbeite für die Rewe AG [...]
    Ich ziehe mit einem anderen Code die Rohdaten in ein Tabellenblatt,

    Ja, selbst die größten Unternehmen sind immer noch der Meinung, dass Excel (TabellenKALKULATION) auch ne prima DATENBANK abgibt ... traurig, aber ist so.

    JulesM schrieb:

    Nun möchte ich sowas wie eine Auswertung vornehmen

    Auch zum AUSWERTEN bietet sich eine Datenbank nachgerade an.

    jede Zeile als Array

    Ein "Array" ist ein Behälter für eine ANZAHL von Objekten. Eine (!) Zelle ist genau EIN Objekt. Wie will man daraus ein Array machen, bzw wozu?

    Ist dieser Weg intelligent

    Intelligent ist es, mit Excel zu RECHNEN. Rechnen tust du aber nicht, das beste ist noch ein simples MinMax und das ist auch mit SQL (Datenbank!) nur ein Befehl.
    danke für deine antwort.
    in der tat arbeite ich nicht wirklich für rewe und es handelt sich nicht direkt um fixe preise, sondern um berechnete preise aus recht komplexen mathematischen modellen. da es sich um live daten handelt, bin ich auf excel angewiesen und kann nicht auf eine datenbank zugreifen.
    Natürlich kannst due jede Zeile in ein Array speichern:

    Visual Basic-Quellcode

    1. dim ALLES as String 'Hier werden alle Beträge der Tabelle vorerst als String gespeichert
    2. for ZEILE = 1 to 10 'Zeile 1 bis 10 durchlaufen
    3. for SPALTE = 1 to 10 'In jeder Zeile die Spalte 1 bis 10 durchlaufen
    4. ALLES = ALLES & ";" & cells(ZEILE,SPALTE).value 'Zellwert dem String alles hinzufügen, die Zellwerte sind durch ein ";" getrennt
    5. NEXT SPALTE ' nächste Spalte der aktuellen Zeile ansehen
    6. ALLES = ALLES & chr(10) 'Alle Spalten einer Zeile durchlaufen,
    7. 'dann String mit Zeilenwechsel (chr(10)) in neue Zeile begeben - so hat jede Zeile deiner Tabelle ein Zeile im String, jede Spalte ist mit ";" getrennt
    8. next ZEILE 'nächste Zeile auswählen
    9. Dim ZEILEN as Array ' Array erstellen, in dem alle Zeilen aufgeteilt werden - jede Zeile ist ein String
    10. Zeilen = Split(ALLES, chr(10)) 'Per Split Array erstellen
    11. for i = 0 to 9 'Jede Zeile im Array Zeilen durchlaufen
    12. Dim Spalten as array '
    13. Spalten = split(Zeilen(i),";") Die mit i ausgewählte Zeile in die Spalten zerlegen mittels Split anhand der Spaltentrennung ";"
    14. ' mit Spalten(zahl) kannst du dann den Spaltenwert wieder auffrufen
    15. next i


    Sieht komplizierter aus, als es ist. Auf jeden Fall hast du so jede Zelle in einem Array, du musst sie nur mit den Indexen ansteuern.

    Ich hab das grad mal ausm Kopf gecodet, und die Profis werden es sicher kritisieren, aber funktioniert zumindest!
    Wenn schon alles im Excel vorhanden ist, brauchst doch nicht zweimal durchlaufen.

    Du baust aus einem Array (Ja, auch Excel-Tabellen kann man als Arrays sehen) einen String und splittest diesen wieder zu einem Array? Das ist ja dreifache Arbeit.

    Entweder gleich im Excel arbeitn (Range und Offset) oder direkt ins Array schreiben, erspart einiges an Arbeit.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Danke Leute, vielen Dank!
    Also ich habe mir nun nochmal den ganzen Arbeitsablauf näher angeschaut.
    Ich denke ich habe mir ein wenig zu viel Arbeit gemacht.
    Leider darf ich hier kein Excel Sheet hochladen (zumal ihr nichts sehen würdet, da es einem Datenfeed angeschlossen ist).

    Vielleicht geht alles aber auch einfacher.

    Nochmal in kürze:

    Sheet 1) Rohdaten werden aus einer Textdatei reingeladen. In der ersten Spalte stehen die Anbieter der jeweiligen Produkte und in den folgenden Spalten die Produktmerkmale. Mit einem Code weise ich den Produkten eine Kennung zu um sie vergleichbar zu machen. Halb so wichtig, da es einwandfrei funktioniert.
    Wichtig ist hierbei: Ich sammel in einem Array alle Namen der Konkurrenten und paste dieses Array in die 1.Zeile von Sheet2)

    Sheet2) Hier wird anhand eines Codes die 1.Spalte aus dem Sheet1 abgesucht und alle Produkte meiner Firma (mit einigen Informationen) in Spalten A-D kopiert. In Spalte D steht die Kennung.
    Der Code geht nun alle Kennungen durch und sucht ob es ein Produkt mit gleicher Kennung von einer anderen Firma gibt.

    Sollte dies der Fall sein, soll der Code es in die richtige Spalte posten.

    Versteht irgendwer was ich vor habe? ;(

    EDIT:
    Gibt es eine Möglichkeit zu sagen: Wenn Produkt gefunden, dann prüfe von wem es ist. Wenn es von Toom ist (Spalte E in Sheet2), dann kopiere es in Spalte E, wenn es von Real ist, dann kopiere es in spalte F. Ich müsste also ausgehend von dem Array in dem ich die Daten sammel die jeweilige Adresse haben.
    Der Code sollte also von dem Array [Toom, Real, Netto, Penny] wissen, dass falls er Toom findet es in die Spalte 1, falls er ein Real-Produkt findet in Spalte 2, bei Netto in 3 usw. pasten