corinnam
Goto Top

Excel Spalten vergleichen und sortieren - VBA?

Hallo liebe VBA Profis,

Ich muss innerhalb eines Excel-Sheets Spalten vergleichen und sortieren. Das ganze gestaltet sich folgendermassen:

Spalte A-C enthält jeweils Artikelnummer, Artikelbezeichnung, neuer Preis.

Spalte D-F enthält jeweils Artikelnummer, Artikelbezeichnung, ALTER PREIS.

Das Problem ist, dass die Positionierung der Artikel von Spalte A-C nicht dieselbe ist wie in Spalte D-F.

Nun muss Spalte D-F genauso sortiert werden in Bezug auf Artikelnummer und Artikelbezeichnung wie die Spalten A-C und Spalte F soll natürlich weiterhin den alten Preis enthalten zu dem richtigen Produkt.

Als Beispiel:

Artikelnummer: 123
Artikelbezeichnung: Tasse
ALTER PREIS: 5.-

Der Preis über 5.- Euro soll natürlich nach der Sortierung weiterhin bei der Tasse stehen und nicht etwa beim Teller.

Spalten A-C dürfen auf gar keinen Fall geändert werden.

Die Artikelnummern sind dieselben in A-C und D-F, mit wenigen Ausnahmen, die es in A-C entweder nicht mehr oder neu dazu gibt.
In diesen Fällen soll Spalten D-F wie folgt geändert werden:
- Produkt gibt es nicht in A-C: Das Produkt in D-F löschen, und zwar die Zellen nicht die ganze Zeile und die Zellen darunter sollen nach oben geschoben werden.
- Produkt gibt es nicht in D-F: Das Produkt in D-F einfügen durch einfügen von Zellen nicht die ganze Zeile und die darunter liegenden Zellen sollen nach unten geschoben werden.

Im Dokument sind maximal ungefähr 2000 Zeilen.

Nun habe ich leider keinerlei Kenntnisse in Visual Basic und müsste aber ein solches Makro erstellen, was doch eigentlich gehen müsste?

Kann mir vielleicht jemand von euch da weiterhelfen?

Vielen Dank face-smile

Content-Key: 184576

Url: https://administrator.de/contentid/184576

Printed on: April 24, 2024 at 05:04 o'clock

Mitglied: 76109
76109 May 07, 2012 at 23:11:50 (UTC)
Goto Top
Hallo CorinnaM!

Sind die Spalten G:I Leer?

Gruß Dieter
Member: Biber
Biber May 08, 2012 at 04:39:17 (UTC)
Goto Top
Moin CorinnaM,

willkommen im Forum.
Selbst wenn die Spalten G ff nicht leer sind (was ich annehme) ->falls es keine regelmäßige Aktion ist, sondern etwas Einmaliges, dann mach es mit SVERWEIS().
Kopiere dazu die Spalten D-F in ein neues Tabellenblatt, ersetze die Spalten D-F im "richtigen" Sheet durch SVerweis()-Formeln und ersetze dann diese Spalten mit "Kopieren"/"Inhalte einfügen"/"Werte".

Das hast du bei den paar Daten in 10 Minuten fertig - in der Zeit hat nicht mal didi ein Makro zusammengebraten,
->Würde sich nur lohnen, wenn es eine regelmäßige Aktion wäre, aber dann würde sich die Frage stellen, durch welchen Zaubertrick denn die Spalteninhalte D-F in das Sheet gebeamt werden...

Grüße
Biber
Member: CorinnaM
CorinnaM May 08, 2012 at 06:41:47 (UTC)
Goto Top
Vielen Dank für das herzliche willkommen face-smile

Ja die Spalten G:I sind leer und ja das ganze ist eine regelmässige Aktion (monatlich). Im Grunde genommen habe ich 2 Excel Dateien. Eine mit den Preisen vom Vormonat und eine mit den Preisen vom aktuellen Monat, nur ist die Positionierung der Artikel in den Tabellen nicht gleich. Was bis anhin gemacht wurde ist, dass die alte Preisliste in die neue kopiert wurde. Danach wurden die Spalten D-F (alte Preisliste) manuell nach den Spalten A-C sortiert, was nicht nur zeitintensiv sondern auch fehleranfällig ist, daher dachte ich an ein Makro und bin bei dem Versuch schlicht an Visual Basic gescheitert. face-smile
Mitglied: 76109
76109 May 08, 2012 at 07:36:20 (UTC)
Goto Top
Hallo CorinnaM!

@Biber
Das hast du bei den paar Daten in 10 Minuten fertig - in der Zeit hat
nicht mal didi ein Makro zusammengebraten, ...
Solange hat's - wie am Code zu sehen ist - nicht gedauertface-smile

Versuchs mal hiermit:
Option Explicit

Private Const SheetName = "Tabelle1"        'Tabellenname entsprechend anpassen  
Private Const StartZeile = 2                'Artikelnummer ab Zeile ?  

Sub SortToArtikelNr()
    Dim Found As Range, i As Long
    
    With Sheets(SheetName)
        For i = StartZeile To .Cells(.Rows.Count, "A").End(xlUp).Row  
            Set Found = .Columns("D").Find(.Cells(i, "A").Value, LookIn:=xlValues, LookAt:=xlWhole)  
            
            If Not Found Is Nothing Then
                Found.Resize(1, 3).Copy .Cells(i, "G")  
            End If
        Next
    
       .Columns("D:F").Delete  
    End With
End Sub
Unter der Annahme, dass die Daten bereits in die Spalten D:F kopiert wurden, den Quellcode im VB-Editor in ein Modul einfügen und über die Excel-Oberfläche (Extras>Makros...) starten.

Funktion:
ArtikelNr von Spalte A in Spalte D suchen und falls gefunden, die Spalten D:F in die Spalten G:I (Zeile von A) kopieren. Anschließend die Spalten D:F löschen.

Gruß Dieter
Member: CorinnaM
CorinnaM May 08, 2012 at 07:53:15 (UTC)
Goto Top
Juhuuuu! das funktioniert! juhuuu! face-smile super! vielen vielen lieben Dank! Du hast soeben mein Leben erleichtert! juhuu! Vielen Dank Dieter! *vor Freude umherspring* face-smile
Mitglied: 76109
76109 May 08, 2012 at 08:16:19 (UTC)
Goto Top
Hallo CorinnaM!

Juhuuuu! das funktioniert! juhuuu! super! vielen vielen lieben Dank! Du hast soeben mein Leben erleichtert! juhuu!
Vielen Dank Dieter! *vor Freude umherspring*
Jepp, gern geschehen. Deinen Freudentanz hätte ich ja zu gerne gesehenface-smile

Noch einen schönen Tag!

Gruß Dieter
Member: Biber
Biber May 08, 2012 at 17:53:14 (UTC)
Goto Top
Moin didi1954 und CorinnaM,

Zitat von @76109:
Solange hat's - wie am Code zu sehen ist - nicht gedauert face-wink
Na ja, ich finde zwei Zeilen Code pro Minute UND einen Kommentar pro 10 Zeilen Code schon eine durchaus respektable Leistung face-wink
Es gibt eine Menge kohlenstoffbasierte Codegeneratoren z.B. in unserer Firma, denen jedes dieser Qualitätskriterien auf immer unerreichbar bleiben wird.

> Juhuuuu! das funktioniert! juhuuu! super! vielen vielen lieben Dank! Du hast soeben mein Leben erleichtert! juhuu!
> Vielen Dank Dieter! *vor Freude umherspring*
Jepp, gern geschehen. Deinen Freudentanz hätte ich ja zu gerne gesehenface-smile
Jepp, so was Schönes hatte ich auch das letzte Mal in "Harry & Sally" gesehen...


Wenn es denn nun ein regelmäßiger Ablauf/Geschäftsprozess ist (jeden Monat) wieder, dann würde ich empfehlen, den manuellen Vorlaufschritt "Kopieren der drei Spalten D-F" auch noch wegzuautomatisieren.

Das Makro könnte - mit drei weiteren Zeilen + Sicherheitsabfrage - auf Knopfdruck auch diese drei Spalten aus einer zweiten Exceldatei lesen, die jeden Monat wieder unter dem gleichen Namen (oder Namensprefix+Datumsendung) wie zum Beispiel "Preise_2012-06.xls" in einem Verzeichnis X:\Austausch" bereitgestellt wird.

@Didi: Du würdest doch bestimmt gerne noch einmal einen so schönen..ääh .... Freudentanz provozieren, oder? face-wink

Grüße
Biber
Member: BerndZ
BerndZ Feb 09, 2013 at 21:51:47 (UTC)
Goto Top
Hallo Didi,

ich bin auf der Suche nach einer Problemlösung durch Zufall auf dieses Makro gestossen - und muss sagen, dass dieses "kurze" Makro schon nahezu alle meine Probleme gelöst hat.

Lediglich ein Problem bleibt noch:
Wenn jetzt ein Artikel dabei ist, der vorher nicht mit in der Artikelliste aufgeführt war (neuer Artikel), wird dieser Artikel so leider noch nicht berücksichtigt.
Wie müsste ich dieses Makro anpassen, damit ein "neuer" Artikel unten an die Liste angehängt wird.
Spalte "A" ist die "vorhandene" Liste mit Artikelnummern
- In Spalte "B" sortiere ich (mit dem Makro) die aktuelle Liste mit Artikelnummern und
- und in Spalte "C" kommen (auch mit dem Makro) die dazugehörigen Werte (in meinem Fall Verkaufszahlen)

einige Zellen in den Spalten "B" + "C" bleiben leer, da manchmal Artikel vorübergehend oder endgültig rausgenommen werden.
"Neue Artikel" müssen unten angefügt werden (in den Spalten "B" + "C")

Danke im voraus,
Bernd