Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

VBA: Verschachtelte Sortierung mit Zählenwenn und WENN?





Frage

Ich habe eine große, unsortierte Tabelle mit unzähligen Spalten (Feldern). In Spalte „D“ befinden sich Bezeichnungen unterschiedlicher Waren, in Spalte „N“ der entsprechende Bestand und in Spalte „AO“ das jeweilige Lager. Ich möchte nun automatisch eine Tabelle sortiert nach Lager und innerhalb des Lagers die Waren mit den entsprechenden Beständen (absteigende Sortierung) erstellen. Mit Pivot geht das zwar ganz gut, anschließend muß ich die Daten dann aber manuell in ein vorgefertigtes Formular übertragen. Wie kann ich das mit VBA eleganter lösen? Kann mir bitte jemand helfen? Vielen Dank schon mal im Voraus. Gruß Thorsten

Antwort 1 von coros

Hallo Thorsten,

ich hoffe, ich habe das alles richtig verstanden und das richtig umgesetzt. Kopiere nachfolgendes Makro in ein StandardModul und weise es einer Befehlsschaltfläche zu.

Sub Daten_sortieren()
Dim letzte_beschriebene_Zeile As Long
letzte_beschriebene_Zeile = Range("AO65536").End(xlUp).Offset(1, 0).Row
Range(Cells(1, 4), Cells(letzte_beschriebene_Zeile, 41)).Sort _
Key1:=Range("AO2"), Order1:=xlDescending, Key2:=Range("D2"), _
Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
End Sub


Bei dem Makro wird zunächst nach der Spalte AO absteigend und dann nach Zeile D ebenfalls absteigend sortiert.

Wie schon oben geschrieben, hoffe ich, dass ich das richtig verstanden habe. Wenn nicht und meine Lösung voll daneben liegt, dann melde DIch noch mal und kläre mich auf.

Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von Thorsten12345

Hallo coros,

erstmal vielen Dank für die Mühe. Leider paßt das nicht so ganz. Habe mich ziemlich kompliziert ausgedrück. Sorry. Jetzt mal einfacher:

Voraussetzungen:
- In der Tabelle ist jede Zeile ein Datensatz (die 1. Zeile ist eine Überschriftszeile mit den Feldnamen).
- Die Tabelle hat insges. 43 Felder (Spalten) und (je nach Auswertung) bis zu ca 3.000 Zeilen (Datensätzen).
- Die Sortierung nach dem Lager (AO, bzw S41) und dann nach Waren (N, bzw S14) ist nicht das Problem. Das kam ja aus deinem Makro schon sehr ähnlich raus.

Problem:
Ich möchte aber die Häufigkeit (ANZAHL2?) der Waren innerhalb eines Lagers zählen, da die Waren mehrfach vorkommen (also z.B. "Äpfel" kommen in Spalte N 20x vor und "Birnen" kommen 35x vor usw) und in einer neuen Tabelle, z.B. in der Form "Lager - Ware - Häufigkeit - Gesamtbestand", darstellen
Wie komme ich nun darauf, dass in Spalte N 20x die Äpfel vorkommen usw?

Es ist ein bißchen umständlich. Ich hoffe, dass es diesmal etwas eindeutiger beschrieben ist. Sorry for confusing ;-)
mfg
Thorsten

Antwort 3 von coros

Moin Thorsten,

teste mal nachfolgendes Makro. Kopiere es wieder in ein StandardModul und starte es dann mit einer Schaltfläche.

Sub Warenbestand_erfassen()
Dim Zeilen As Long, Wiederholungen_Übereinstimmungen As Long, _
Übereinstimmungen As Long, Wiederholungen As Long, Lagerort() As String, _
gibt_es_schon As Boolean, Artikel() As String, Menge() As String
Letzte_Zeilen = Sheets("Tabelle1").Range("AO65536").End(xlUp).Row
If Letzte_Zeilen < 2 Then Exit Sub
For Wiederholungen = 2 To Letzte_Zeilen
If Übereinstimmungen = 0 Then
Übereinstimmungen = 1
ReDim Lagerort(1, Übereinstimmungen), Artikel(1, Übereinstimmungen), _
Menge(1, Übereinstimmungen)
Lagerort(1, 1) = Sheets("Tabelle1").Cells(Wiederholungen, 41)
Artikel(1, 1) = Sheets("Tabelle1").Cells(Wiederholungen, 4)
Menge(1, 1) = Sheets("Tabelle1").Cells(Wiederholungen, 14)
Else
gibt_es_schon = False
For Wiederholungen_Übereinstimmungen = 1 To Übereinstimmungen
If Lagerort(1, Wiederholungen_Übereinstimmungen) = _
Sheets("Tabelle1").Cells(Wiederholungen, 41) _
And Artikel(1, Wiederholungen_Übereinstimmungen) = _
Sheets("Tabelle1").Cells(Wiederholungen, 4) Then
Menge(1, Wiederholungen_Übereinstimmungen) = _
Menge(1, Wiederholungen_Übereinstimmungen) _
+ Sheets("Tabelle1").Cells(Wiederholungen, 14)
gibt_es_schon = True
Exit For
End If
Next
If gibt_es_schon = False Then
Übereinstimmungen = Übereinstimmungen + 1
ReDim Preserve Lagerort(1, Übereinstimmungen), Artikel(1, Übereinstimmungen), _
Menge(1, Übereinstimmungen)
Lagerort(1, Übereinstimmungen) = Sheets("Tabelle1").Cells(Wiederholungen, 41)
Artikel(1, Übereinstimmungen) = Sheets("Tabelle1").Cells(Wiederholungen, 4)
Menge(1, Übereinstimmungen) = Sheets("Tabelle1").Cells(Wiederholungen, 14)
End If
End If
Next
For Wiederholungen_Übereinstimmungen = 1 To Übereinstimmungen
Sheets("Tabelle2").Cells(Wiederholungen_Übereinstimmungen + 1, 1) _
= Lagerort(1, Wiederholungen_Übereinstimmungen)
Sheets("Tabelle2").Cells(Wiederholungen_Übereinstimmungen + 1, 2) _
= Artikel(1, Wiederholungen_Übereinstimmungen)
Sheets("Tabelle2").Cells(Wiederholungen_Übereinstimmungen + 1, 3) _
= Menge(1, Wiederholungen_Übereinstimmungen)
Next
End Sub


Bei dem Makro werden die Waren (Spalte D) mit dem Lagerort (Spalte AO) zusammen erfasst und in Blatt "Tabelle2" (Spalte 1 und 2) ausgegeben. Doppelte Waren, die in einem Lagerort vorkommen könnten, werden nicht doppelt aufgeführt, sondern deren Lagermenge wird zusammenaddiert und erscheint dann in dem Blatt "tabelle2" in Spalte C. Damit erhälst Du dann in Tabellenblatt2 eine Auflistung aller in den Lagern befindlichen Waren mit der Gesamtsumme jeder einzellnen Ware.

Ich hoffe, dass ich das nun richtig verstanden habe. Teste mal das Makro, ob das so ist, wie Du es Dir vorstellst. Wenn Du möchtest, dann schicke ich Dir auch gerne mal meine Beispieldatei, mit der ich das Makro getestet habe. Dazu müsstest Du mir Deine Mailadresse mitteilen oder Du schickst eine Mail an meine E-Mailadresse:coros@excelbeispiele.de. Binde bitte in die Betreffzeile das Wort "Supportnet" mit ein, da ich alle Mals, deren Absender ich nicht kenne, ungelesen lösche.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: