Daten mittels VBA sortieren

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Daten mittels VBA sortieren

    Hallo zusammen!



    Zunächst eine "Hallo" meinerseits in die Forum-Runde! :)



    Ich habe folgendes Anliegen: Ich habe in einer Excel-Arbeitsmappe verschiedene Daten in "Input"-Blättern, welche anders sortiert in "Data"-Blätter transportiert werden sollen. Eine Beispielsarbeitsmappe habe ich angefügt.

    Es soll in den "Input"-Blättern gesucht werden, ob in Spalte "K" etwas steht. Wenn ja, soll wenn dort ein "A" steht dieser Datensatz in das Blatt "dataA" geschrieben werden, wenn "PE" dann in "dataB" und wenn "PV", dann in "dataC".

    Ich habe schon diverse VBA-Makros gesehen und denke, dass für mein Bedürfnis VBA genau das richtige ist.



    Würde mich riesig freuen,wenn ich eine Lösung aufgezeigt bekommen könnte....



    DANKE!!!!
    Dateien
    • example.zip

      (15,66 kB, 124 mal heruntergeladen, zuletzt: )
    Reicht da nicht ein einfacher sverweis? Dann kannst du dir das ganze mit VBA sparen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    xde10358 schrieb:

    wie soll ich mittels sverweis die Datensätze untereinander bekommen?
    Mit Array-Formeln. ;)

    Mit VBA:
    Pack das in den Code-Bereich des Worksheet "input1"

    Visual Basic-Quellcode

    1. Sub CopyData()
    2. For r = 1 To Cells(Rows.Count, 11).End(xlUp).Row
    3. Select Case Cells(r, 11).Value
    4. Case "A": Range("A" & r & ":J" & r).Copy Sheets("dataA").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    5. Case "PE": Range("A" & r & ":J" & r).Copy Sheets("dataB").Cells(Rows.Count, 2).End(xlUp).Offset(1)
    6. Case "PV": Range("A" & r & ":J" & r).Copy Sheets("dataC").Cells(Rows.Count, 2).End(xlUp).Offset(1)
    7. End Select
    8. Next
    9. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Perfekt, für das Blatt "input1" funktioniert das!

    Wie kann ich den Befehl auf alle Inputblätter erweitern?

    Ich würde dann in meiner Datei vorne noch ein Blatt einfügen und dann über einen Button das Makro für alle input-Blätter laufen lassen.
    Wenn deine Input-Sheets alle gleich aussehen würden, wäre das relativ einfach:

    Visual Basic-Quellcode

    1. Sub CopyData()
    2. For Each ws In Worksheets
    3. If ws.Name Like "input#" Then
    4. For r = 1 To ws.Cells(Rows.Count, 11).End(xlUp).Row
    5. Select Case ws.Cells(r, 11).Value
    6. Case "A": ws.Range("A" & r & ":J" & r).Copy Sheets("dataA").Cells(Rows.Count, 1).End(xlUp).Offset(1)
    7. Case "PE": ws.Range("A" & r & ":J" & r).Copy Sheets("dataB").Cells(Rows.Count, 2).End(xlUp).Offset(1)
    8. Case "PV": ws.Range("A" & r & ":J" & r).Copy Sheets("dataC").Cells(Rows.Count, 2).End(xlUp).Offset(1)
    9. End Select
    10. Next
    11. End If
    12. Next
    13. End Sub

    Da deine Sheets aber unterschiedlich sind, musst du dir da halt die passende Verschiebung einfallen lassen.
    Das wäre doch eine Aufgabe, bei der du endlich mal nachdenken kannst und nicht einfach blind den Code übernehmen musst, ohne ihn zu verstehen.

    Stell dich der Herausforderung!
    Du wirst sehen, es macht Spaß.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Super, hat bestens funktiioniert - und ich musste sogar einiges an Transferleistung aufbringen, um das in meine Datei einzuarbeiten. Habe zwar etwas rumprobieren müssen, hat aber schlussendlich geklappt. ;)



    Nur eine Sache schaffe ich noch nicht. Er nimmt momentan die Formel und schreibt diese in die "data"-Blätter. Wie schafft man es, dass nur der Wert geschrieben werden soll, die Formel in den Input-Blättern aber erhalten bleibt?

    Danke und Gruß,

    Joe

    xde10358 schrieb:

    Wie schafft man es, dass nur der Wert geschrieben werden soll, die Formel in den Input-Blättern aber erhalten bleibt?
    In dem Fall lmüsstest du anstatt mit Copy mit Einzelzuweisung starten oder das unsaubere Kopieren über den Pastebuffer ausführen.
    Wenn du in dem Sheet grundsätzlich nur Werte benötigst, ist es aber das einfachste, du überschreibst am Schluss alle Formeln mit deren Werten.

    Visual Basic-Quellcode

    1. Sheets("dataA").Cells.Formula=Sheets("dataA").Cells.Value
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Anbei nun das aktuelle File. Hier wird das Problem hoffentlich klar.



    Im Blatt "input1" ziehe ich mir für die Spalten H bis J über Formeln meine Werte, dann soll das Makro laufen und die Daten in die "data"-Blätter schreiben.



    Jetzt sieht man, wenn das Makro läuft, dass beispielsweise im Blatt "data", im ersten Datensatz nun in G2, H2, I2 0 steht, weil die Formeln kopiert werden.



    Leider habe ich es nicht hinbekommen den Code "Sheets("dataA").Cells.Formula=Sheets("dataA").Cells.Value" an geeigneter Stelle einzubauen ... ?(
    Dateien
    • example v2.zip

      (32,19 kB, 141 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „xde10358“ ()

    Visual Basic-Quellcode

    1. Sub CopyData()
    2. For Each ws In Worksheets
    3. If ws.Name Like "data*" Then ws.Rows("2:" & Rows.Count).Delete xlUp 'Bereich löschen
    4. Next
    5. For Each ws In Worksheets
    6. If ws.Name Like "input#" Then
    7. For r = 1 To ws.Cells(Rows.Count, 12).End(xlUp).Row
    8. Select Case ws.Cells(r, 12).Value
    9. Case "A"
    10. r2 = Sheets("dataA").Cells(Rows.Count, 1).End(xlUp).Row + 1
    11. Sheets("dataA").Range("A" & r2 & ":J" & r2).Formula = ws.Range("A" & r & ":J" & r).Value
    12. Case "PE"
    13. r2 = Sheets("dataB").Cells(Rows.Count, 1).End(xlUp).Row + 1
    14. Sheets("dataB").Range("B" & r2 & ":K" & r2).Formula = ws.Range("A" & r & ":J" & r).Value
    15. Case "PV"
    16. r2 = Sheets("dataC").Cells(Rows.Count, 1).End(xlUp).Row + 1
    17. Sheets("dataC").Range("B" & r2 & ":K" & r2).Formula = ws.Range("A" & r & ":J" & r).Value
    18. End Select
    19. Next
    20. End If
    21. Next
    22. End Sub
    Und jetzt tu mir dir den Gefallen und geh den Code Schritt für Schritt durch bis du alles verstanden hast, dann brauchst du diesbezüglich keine Trivialfragen mehr stellen.
    Es nützt dir nichts, wenn du nur Code kopierst, ohne ihn verinnerlicht zu haben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    xde10358 schrieb:

    Müsste mal ein Seminar besuchen.

    Von Seminaren halte ich nicht viel.
    Obwohl ich jahrelang in einem der grössten Schulungsunternehmen arbeitete.

    Wenn du in den obigen Code drei Stunden im Debugger investierst, hast du mehr gelernt, als du aus drei Tagen Seminar mitnimmst.

    Noch weniger nachhaltig als das Vorkauen in Seminaren ist eigentlich nur, jemandem fertigen Code zu präsentieren.
    In deinem Fall habe ich natürlich genau das gemacht und irgendwie ärgert es mich.
    Böse Zungen behaupten, ich mache das nur, um die Leute von Eigeninitiative abzuhalten, damit keine Konkurrenz nachwächst. ;)
    Tatsächlich mache ich es nur bei Problemen, die mir trivial vorkommen und im Sekunden- oder maximal Minutenbereich erschlagen sind.
    Dass ich damit dem Fragesteller Stunden wertvoller Selbstlerneffekte vernichte, wird mir manchmal zu spät bewusst.
    Sorry dafür.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Gute Antwort! ;)



    Aber um was zu lernen, muss man ja die Vokabeln geliefert bekommen. Auf diese VBA-Befehle wäre ich ja selber nie gekommen. Und das anwenden auf meine Datei (die schon anderes aussieht als die Beispieldatei) konnte ich das anwenden.



    Deswegen nochmals vielen Dank, hat mir sehr geholfen! Vieleicht muss ich mir mal ein gutes VBA-Buch zulegen, sozusagen ein Vokableheft. :)

    xde10358 schrieb:

    Aber um was zu lernen, muss man ja die Vokabeln geliefert bekommen.
    Es gibt mehrere Wege, eine Fremdsprache zu lernen.
    In der Schule geht das mit Vokabeln und Grammatik pauken.

    Effizienter ist die Methode des Learning By Doing.
    Geh in ein fremdes Land und du wirst wesentlich schneller die Sprache erlernen (Willen vorausgesetzt).
    Wenn du dann einige Erfahrung hast, schadet es nicht, zur Perfektionierung auch noch die grammatikalischen Hintergründe beigebracht zu bekommen.

    Deine Muttersprache hast du nämlich auch nicht in der Schule erlernt.
    Zumindest nicht das Grundvokabular.
    Die Feinheiten, Regeln und Strukturen hat man dir erst nach 5-15 Jahren Praxis beigebracht.

    Das ist jetzt alles sehr philosophisch und OffTopic, aber zumindest einen Gedankengang wert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --