Live-Forum - Die aktuellen Beiträge
Datum
Titel
18.04.2024 18:04:29
18.04.2024 16:33:24
Anzeige
Archiv - Navigation
1316to1320
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Höchste Anzahl mehrfacher Werte

Höchste Anzahl mehrfacher Werte
05.06.2013 14:10:47
Jackd
Hallo Gemeinde
ich mal wieder mit einer Aufgabe, die ich nicht umgesetzt bekomme.
Vielleicht kann mir jemand helfend unter die Arme greifen.
Gibt es eine Möglichkeit mittels VBA die höchste mehrung von Duplikaten zu finden...
(die meisten werden jetzt denken .o0(WAAAAS) )
zurecht =)
Folgendermaßen ist der Aufbau
Spalte A Kundennummer
Spalte B Aufträge
Zu jedem Auftrag ist die Kundennummer vermerkt.
Dh. manche Kunden haben 10 Aufträge - somit ist die Kundennummer 10 mal da
manache Kunden haben 3 Aufträge - analog ist die Kundennummer 3 mal da
Nun bräuchte ich für eine Array die höchste Anzahl an Kundennummern um den dann von der 2. Dimension her zu bestimmen..
Oder hat einer eine Idee wie ich das sonst programmatisch umsetzen kann?
Anbei ein Muster mit IST - SOLL

Die Datei https://www.herber.de/bbs/user/85662.xlsx wurde aus Datenschutzgründen gelöscht


Thanks in advance

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Höchste Anzahl mehrfacher Werte
05.06.2013 14:18:33
Rudi
Hallo,
klitzekleine UDF.
Sub aaa()
MsgBox maxAnzahl(Range("B6:B13"))
End Sub
Function maxAnzahl(Rng As Range) As Integer
Dim rngC As Range, objAnz As Object
Set objAnz = CreateObject("Scripting.dictionary")
For Each rngC In Rng
objAnz(rngC.Value) = objAnz(rngC.Value) + 1
Next
maxAnzahl = WorksheetFunction.Max(objAnz.items)
End Function

Gruß
Rudi

AW: Höchste Anzahl mehrfacher Werte
05.06.2013 14:23:32
Jackd
Hallo Rudi
Vielen Dank für deine Hilfe.
Vielleicht sollte ich in Zukunft gleich die Fragen an dich addressieren, da du ja immer einer der ersten bist =)
Ist zwar ne Worksheet lösung, aber die kann ich ja recht einfach auf meine VBA-Lösung anpassen.
Grüße

Anzeige
AW: Höchste Anzahl mehrfacher Werte
05.06.2013 14:38:38
Rudi
Hallo,
Ist zwar ne Worksheet lösung
wieso das?
Die Function kannst du auch an beliebiger Stelle in deinem Code verwenden.
Dabei kommt mir eine Idee! Die Anzahl unterschiedlicher Kunden kann man gleich mit ermitteln.
Sub aaa()
Dim arr(), rngKd As Range, arrKd
Set rngKd = Range(Cells(6, 2), Cells(Rows.Count, 2).End(xlUp))
arrKd = maxAnzahl(rngKd)
ReDim arr(1 To arrKd(0), 1 To arrKd(1))
MsgBox UBound(arr) & "/" & UBound(arr, 2)
End Sub

Function maxAnzahl(Rng As Range)
'maxAnzahl(0)=Anzahl Kunden
'maxAnzahl(1)= höchste Anzahl Aufträge
Dim rngC As Range, objAnz As Object
Set objAnz = CreateObject("Scripting.dictionary")
For Each rngC In Rng
objAnz(rngC.Value) = objAnz(rngC.Value) + 1
Next
maxAnzahl = Array(objAnz.Count, WorksheetFunction.Max(objAnz.items))
End Function

Gruß
Rudi

Anzeige
AW: Höchste Anzahl mehrfacher Werte
05.06.2013 15:19:25
Jackd
Super Vielen Dank Rudi ....
Warum nur eine WS - Lösung.. nun ich bin bisher (offensichtlich Fehlerhaft) davon ausgegangen dass Funktionen nur aus nem WS auszulösen sind.
Könntest du mir beim VErständins des Codes noch kur helfen...?
Dim arr(), rngKd As Range, arrKd

Dimensionierung soweit klar

Set rngKd = Range(Cells(2, 4), Cells(Rows.Count, 4).End(xlUp))

Belegen des Objektes rngKD mit einem Bereich (bis letzte Zeile)

arrKd = maxAnzahl(rngKd)

Funktionsaufruf mit dem Übergabewert des zu Analysierenden Bereichs
"ProzedurUnterbechung"
--
Funktion
 Dim rngC As Range, objAnz As Object

Dimensionierung soweit klar

Set objAnz = CreateObject("Scripting.dictionary")

Damit kann ich nichts anfangen

For Each rngC In Rng

Beginn Schleife

objAnz(rngC.Value) = objAnz(rngC.Value) + 1

Hochzählen der Anzahl der Objekte --VErsteh ich hier auch nicht, hängt aber wahrscheinlich damit zusammen dass ich das scripting Objekt nicht verstehe

Next

Ende Schleife

maxAnzahl = Array(objAnz.Count, WorksheetFunction.Max(objAnz.items))

Rückgabe der Maximalen Anzahl (objAnz.items)
sowie der Gesamtanzahl (objAnz.count)
--
Weiter in Prozedur
arrKd = maxAnzahl(rngKd)
(Doppelt)
Rückgabe des Wertes maxAnzahl (1,2) hier ist 1. GEsamtanzahl im Bereich 2. Maximale Anzahl

ReDim arr(1 To arrKd(0), 1 To arrKd(1))

Neudimensionierung des array in
1 bis Gesamtanzahl in Bereich (Zeilen bzw. vertikaler Vektor)
1 bis maximale Anzahl im Bereich (Spalten bzw. horizontaler Vektor)
  MsgBox UBound(arr) & "/" & UBound(arr, 2)

Ausgabe untere Grenze vertikaler Vektor & untere Grenze horizontaler Vektor
Frage: Ist das Array leer? (nur dimensioniert)
Frage: Hab ich das soweit richtig gedeutet?
Grüße
und vielen Dank für deine Unterstützung

Anzeige
AW: Höchste Anzahl mehrfacher Werte
05.06.2013 15:58:18
Rudi
Hallo,
Set objAnz = CreateObject("Scripting.dictionary")

Damit kann ich nichts anfangen
Das Dictionary-Objekt ist imho eines der nützlichsten Objekte und dazu noch unübertroffen schnell.
Es stellt letztlich Schlüssel-Wert Paare dar.
Im Bsp erhöhe ich jedesmal den Wert eines Schlüssels(Kundennummer) um 1 und habe somit die Anzahl jeder Kundennummer.
Mit ObjAnz.Count wird die Anzahl der Elemente im Objekt ermittelt (untersch. Kundennummern)
Frage: Ist das Array leer? (nur dimensioniert)
Ja. Du wolltest erst mal nur die nötigen Dimensionen ermitteln.
Da ich gerade Bock hatte, eine Funktion, die dir die A uswertung komplett erstellt.
Viel Spaß bei der Analyse ;-)
Sub aaaa()
Dim arrAuftraege, rngAuftraege
Set rngAuftraege = Range(Cells(6, 2), Cells(Rows.Count, 4).End(xlUp))
arrAuftraege = Auftraege(rngAuftraege)
With Worksheets.Add 'neues Blatt
.Cells(1, 1).Resize(UBound(arrAuftraege), UBound(arrAuftraege, 2)) = arrAuftraege
End With
End Sub
Function Auftraege(ByVal rngA As Range)
Dim objKd As Object, rngC As Range, arrTmp, arrItems, arrNeu(), i As Integer, j As Integer,  _
iMax As Integer
Set objKd = CreateObject("Scripting.dictionary")  'Datensammler
For Each rngC In rngA.Columns(1).Cells
If rngC.Offset(, 2) = "Erstauftrag" Then  'Erstauftrag
If objKd.exists(rngC.Value) Then  'Kunde schon gelesen
arrTmp = objKd(rngC.Value)
ReDim arrNeu(UBound(arrTmp) + 2)
arrNeu(0) = arrTmp(0)
arrNeu(1) = rngC.Offset(, 1).Value
arrNeu(2) = rngC.Offset(, 2).Value
For i = 1 To UBound(arrTmp)
arrNeu(i + 2) = arrTmp(i)
Next
objKd(rngC.Value) = arrNeu
iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))
Else  'neuer Kunde
objKd(rngC.Value) = Array(rngC.Value, rngC.Offset(, 1).Value, rngC.Offset(, 2).Value)
iMax = WorksheetFunction.Max(iMax, 2)
End If
Else
If objKd.exists(rngC.Value) Then
arrTmp = objKd(rngC.Value)
ReDim arrNeu(UBound(arrTmp) + 1)
For i = 0 To UBound(arrTmp)
arrNeu(i) = arrTmp(i)
Next
arrNeu(UBound(arrNeu)) = rngC.Offset(, 1).Value
objKd(rngC.Value) = arrNeu
iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))
Else
objKd(rngC.Value) = Array(rngC.Value, rngC.Offset(, 1))
iMax = WorksheetFunction.Max(iMax, 1)
End If
End If
Next rngC
arrItems = objKd.items
ReDim arrNeu(1 To UBound(arrItems) + 2, 1 To iMax + 1)
'Überschriften
arrNeu(1, 1) = "Kundennummer"
arrNeu(1, 2) = "Auftrag"
arrNeu(1, 3) = "Auftragsart"
For i = 4 To UBound(arrNeu, 2)
arrNeu(1, i) = "Folgeauftrag"
Next
'Daten in Array schreiben
For i = 0 To UBound(arrItems)
arrTmp = arrItems(i)
For j = 0 To UBound(arrTmp)
arrNeu(i + 2, j + 1) = arrTmp(j)
Next
Next
Auftraege = arrNeu
End Function

Gruß
Rudi

Anzeige
AW: Höchste Anzahl mehrfacher Werte
05.06.2013 16:30:33
Jackd
Uff..
Vielen Dank dafür Rudi.. und
ja, da werd ich ne weile dran zu tüfteln haben.. zumal du auch sehr "sparsam" programmierst (zb (,1))- also 0 "weglassen"
Ein ertser Versuch an dem Musterdatensatz bestätigt dein Können =)
Jetzt muss ich das nur noch auf meins anpassen =)
Nochmals vielen Dank. Bis dahin
Grüße

AW: Höchste Anzahl mehrfacher Werte
06.06.2013 13:35:08
Jackd
Hallo Rudi
Also du hast mir ja ne ganz schöne Aufgabe gestellt =)
Ich bin jetzt zu weiten Teilen durch den Code und hab auch bissl was verstanden.. =)
Vielleicht schaffst du es mal drüber zu schauen, und meine Notizen zu "würdigen" bzw. zu korrigieren

For Each rngC In rngA.Columns(1).Cells

Schleife

If rngC.Offset(, 2) = "Erstauftrag" Then  'Erstauftrag

Abfrage1: ob in Spalte +2 der Werrt Erstauftrag steht

If objKd.exists(rngC.Value) Then  'Kunde schon gelesen

Abfrage1:positiv Abfrage2: ob Objekt Kunde schon existiert

arrTmp = objKd(rngC.Value)

Abfrage1 & 2: positiv (Codezeile bekomm ich allerdings nicht aktiviert bzw. diese Zwei Bedingungen werden nicht erfüllt) ...?

ReDim arrNeu(UBound(arrTmp) + 2)

Neudimensionierung / Neuanlegen eines Array was 2 Werte Größer als das temporäre Array ist (das müsste hier nur mit der Kundennummer Gefüllt sein)

arrNeu(0) = arrTmp(0)

Übertrag der Kundennummer von Temp auf ArrayNeu

arrNeu(1) = rngC.Offset(, 1).Value
arrNeu(2) = rngC.Offset(, 2).Value
For i = 1 To UBound(arrTmp)
arrNeu(i + 2) = arrTmp(i)
Next
bis hierhin hat der Code bei mir keine Funktion, zumindest nicht erkennbar für mich

objKd(rngC.Value) = arrNeu

ObjKunde mit Werten aus dem neuen Array belegen

iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))

Prüfen ob array größer oder iMAx und dann den größeren weiter geben

Else  'neuer Kunde

Abfrage1: positiv Abfrage2:negativ

objKd(rngC.Value) = Array(rngC.Value, rngC.Offset(, 1).Value, rngC.Offset(, 2).Value)

Objekt kunden Mit Werten Füllen (Kundennummer, Auftrag, Auftragsnummer)

iMax = WorksheetFunction.Max(iMax, 2)

Warum ist das max hier erneut? es legt ja nur das iMax auf mindestens 2 Fest
End If

Else

Abfrage1: negativ

If objKd.exists(rngC.Value) Then 

Abfrage 2:

arrTmp = objKd(rngC.Value)

temporäres Array mit 1 Kundennummer füllen

ReDim arrNeu(UBound(arrTmp) + 1)

neues Array (eins größer als temp. Array)

For i = 0 To UBound(arrTmp)
arrNeu(i) = arrTmp(i)
Next

Übetragen von tempArr in neuesArr

arrNeu(UBound(arrNeu)) = rngC.Offset(, 1).Value

Hinzufügen neue Auftragsart ?

objKd(rngC.Value) =arrNeu
iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))
Else
objKd(rngC.Value) = Array(rngC.Value, rngC.Offset(, 1))
iMax = WorksheetFunction.Max(iMax, 1)
End If
End If
Next rngC
'
Hier seh ich nicht richtig durch

arrItems = objKd.items

Zählen aller Kundennummern (ohne Dubletten?)

ReDim arrNeu(1 To UBound(arrItems) + 2, 1 To iMax + 1)
'Überschriften
arrNeu(1, 1) = "Kundennummer"
arrNeu(1, 2) = "Auftrag"
arrNeu(1, 3) = "Auftragsart"

ArrayNeu neu dimensionieren und in die erste "zeile" die Überschriften einfügen

For i = 4 To UBound(arrNeu, 2)
arrNeu(1, i) = "Folgeauftrag"
Next

"breite" des array nutzen um Folgeaufträge in die Spalte 4 ff zu schreiben könnte man hier nicht auch iMax nehmen?
'Daten in Array schreiben

For i = 0 To UBound(arrItems)
arrTmp = arrItems(i)

Zeilen füllen
    For j = 0 To UBound(arrTmp)
arrNeu(i + 2, j + 1) = arrTmp(j)
Next

Spalten füllen
Next

Auftraege = arrNeu

Rückgabe der Werte an die Sub
End Function
Vielen Dank
und Grüße

Anzeige
AW: mit Hilfsspalten:
05.06.2013 14:25:07
Jackd
Hallo KLaus..
vielen DAnk auch für deinen Vorschlag, sollte aber VBA sein, da es nur ein Teil einer Struktur ist, mit der im Anschluss weiter gearbeitet wird.
Grüße

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige