Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1240to1244
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

Kundennamen zählen

Kundennamen zählen
Kai
Hallo zusammen,
irgendwie steh ich voll aufm Schlauch, evtl. weiß einer von euch Rat.
Ich habe eine Exceldatei in die ich jeden Tag einer Übersicht (Sheet Übersicht) der versandten Pakete pro Kunde bekomme.
In dieser Datei habe ich zusätzlich für jeden Kunden ein Sheet. Ich möchte nun das ein Makro die Anzahl der versandten Pakete zählt und diese Anzahl mit Datum auf das "Kundensheet" schreibt.
Klingt alles verwirrend deshalb lade ich eine Beispielmappe hoch.
Wäre super wenn jemand nen Tipp hat ^^
Danke
https://www.herber.de/bbs/user/77789.xls

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Kundennamen zählen
02.12.2011 22:14:58
Ass
Hallo Kai
das Makro ausführen während die Tabelle Übersicht aktiv ist.
Option Explicit
Sub KopiePakete()
Const TextMode = 1
Dim MyDic As Object, varKey, Bereich As Range, Zelle As Range, i&
With ActiveSheet
Set Bereich = .Range("c1:c" & .Range("c65536").End(xlUp).Row)
End With
Set MyDic = CreateObject("Scripting.Dictionary")
MyDic.CompareMode = TextMode
For Each Zelle In Bereich.Cells
If Not IsEmpty(Zelle) Then
If MyDic.Exists(Zelle.Text) Then
MyDic(Zelle.Text) = MyDic(Zelle.Text) + 1
Else
MyDic.Add Zelle.Text, 1
End If
End If
Next
'Ausgabe
On Error GoTo FEHLER
If MyDic.Count > 0 Then
For Each varKey In MyDic
i = MyDic(varKey)
With Sheets(varKey)
With .Cells(.Range("a65536").End(xlUp).Row + 1, 1)
.Value = Range("a1").Value
.Offset(, 1) = i
End With
End With
Next
End If
Set MyDic = Nothing
Set Bereich = Nothing
Set Zelle = Nothing
Exit Sub
FEHLER:
MsgBox varKey & " ?"
Resume Next
End Sub

Anzeige
AW: Kundennamen zählen
02.12.2011 22:17:52
Ass
das Makro in ein allgemeines Modul kopieren
Gruß
Rudi
AW: Kundennamen zählen
03.12.2011 12:25:50
Kaio
Hallo Rudi,
super! DANKE! Das funktioniert top, so kompliziert habe ich mir das nicht vorgestellt.
Ist es möglich den Code so zu ändern, das er bei gleichem Datum die Werte überschreibt? Momentan ist es ja so das im Sheet des jeweiligen Kunden immer eine Zeile einfügt. Lasse ich das Makro 10 mal laufen habe ich 10 Zeilen im Kundensheet, praktisch wäre es aber nur eine.
Gruß Kai
AW: Kundennamen zählen
03.12.2011 12:52:20
Kai
Noch besser wäre es wenn er die Kunden die er abgearbeitet hat löscht, dann würden mir am Ende nur die Kunden über bleiben die er nicht zuordnen konnte bzw. für die es kein Sheet gibt...
Gruß Kai
Anzeige
AW: Kundennamen zählen
03.12.2011 18:11:09
Ass
Hallo Kai,
vielleicht geht's so:
am Ende wird mit
Sheets("Übersicht").Cells.Clear
der gesamte Inhalt des Blattes gelöscht
schau's dir mal an.
Sub KopiePakete2()
Const TextMode = 1
Dim MyDic As Object, varKey, Bereich As Range, Zelle As Range
Dim dDatum As Date, i As Long, sNeukunde As String
With Sheets("Übersicht")
Set Bereich = .Range("c1:c" & .Range("c65536").End(xlUp).Row)
dDatum = .Range("a1").Value
End With
Set MyDic = CreateObject("Scripting.Dictionary")
MyDic.CompareMode = TextMode
'Liste erstellen mit allen Kunden und der Anzahl ihrer Pakete
For Each Zelle In Bereich.Cells
If Not IsEmpty(Zelle) Then
If MyDic.Exists(Zelle.Text) Then
MyDic(Zelle.Text) = MyDic(Zelle.Text) + 1
Else
MyDic.Add Zelle.Text, 1
End If
End If
Next
'Ausgabe
On Error GoTo FEHLER
If MyDic.Count > 0 Then
For Each varKey In MyDic
i = MyDic(varKey)
With Sheets(varKey) 'Fehler wenn Kunde nicht bekannt
Set Zelle = .Cells(.Range("a65536").End(xlUp).Row, 1)
If Not Zelle.Value = dDatum Then
Zelle.Offset(1, 0) = dDatum
Zelle.Offset(1, 1) = i
End If
WEITER:
End With
Next
End If
Set MyDic = Nothing
Set Bereich = Nothing
Set Zelle = Nothing
MsgBox sNeukunde & "neu angelegt."
Sheets("Übersicht").Cells.Clear
Exit Sub
FEHLER:
sNeukunde = sNeukunde & varKey & vbCrLf
NeuerPaketkunde varKey, i, dDatum
Err.Clear
Resume WEITER
End Sub
Sub NeuerPaketkunde(ByVal Kunde As String, Pakete As Long, pDatum As Date)
Dim ws As Object
On Error Resume Next
Set ws = ThisWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
With ws
'Übernahme des Tabellenkopfes aus dem Tabellenblatt"Kunde 1"
'welches hoffentlich vorhanden ist
.Name = Kunde
.Range("a1") = Sheets("Kunde 1").Range("a1")
.Range("a2") = Kunde
.Range("a4:b4").Value = Sheets("Kunde 1").Range("a4:b4").Value
.Range("a5") = pDatum
.Range("b5") = Pakete
End With
End Sub
Gruß
Rudi
Anzeige
AW: Kundennamen zählen
04.12.2011 13:22:54
Kai
Hallo Rudi,
danke das ist echt gut. Mir ist da aber noch ein Problem eingefallen. Ich bekomme die Daten per SQL aus einer Oracle Datenbank und es kann vorkommen das Kundennamen leer sind (Spalte C). Also wäre es für mich am besten wenn bei jedem Kunden der gezählt und abgearbeitet werden kann die Zeile gelöscht wird und am Ende bleiben nur die übrig die er nicht kann.
Jetzt habe ich eine Verständnisfrage:
Das was dein Code im ersten Schritt macht ist ein Array, richtig? Du arbeitest nicht Zeile für Zeile ab sondern den Bereich, lässt Ihn im Array und wertest aus, oder?!? Ich bin nämlich ständig am weiterlernen bei VBA deswegen interessiert mich das auch so.
Noch mal vielen Dank!
Gruß Kai
Anzeige
AW: Kundennamen zählen
04.12.2011 15:05:59
Ass
Hallo Kai,
dann so :
Sub KopiePaketeMitRest()
Dim wsListe As Dictionary, ws As Worksheet, dDatum As Date
Dim Bereich As Range, Zelle As Range, varKey, i As Long
Set wsListe = CreateObject("Scripting.Dictionary")
'Liste der Tabellenblätter erstellen und jedem den Wert 0 zuordnen
For Each ws In Worksheets
wsListe.Add ws.Name, 0
Next
With Sheets("Übersicht") 'das Blatt, von dem das Makro ausgeführt wird
Set Bereich = .Range("c1:c" & .Range("c65536").End(xlUp).Row)
dDatum = .Range("a1").Value 'Datum von A1 übernehmen
End With
'diese Tabellenblattliste durchlaufen und Anzahl Pakete addieren und Zeile löschen
For Each Zelle In Bereich.Cells
If Not IsEmpty(Zelle) Then
If wsListe.Exists(Zelle.Text) Then
wsListe(Zelle.Text) = wsListe(Zelle.Text) + 1
Zelle.EntireRow.ClearContents
End If
End If
Next
'Kundenliste noch mal durchlaufen und Anzahl Pakete in Kundenblatt eintragen
For Each varKey In wsListe
i = wsListe(varKey) 'Anzahl Pakete
If i > 0 Then
With Sheets(varKey)
Set Zelle = .Cells(.Range("a65536").End(xlUp).Row, 1)  'letzte Zelle
If Not Zelle.Value = dDatum Then
Zelle.Offset(1, 0) = dDatum
Zelle.Offset(1, 1) = i
End If
End With
End If
Next
Set wsListe = Nothing
End Sub

Ja, das Dictionary ist so eine Art Array. Bei Arrays und Listen ist jeder Eintrag unter einem Index abrufbar. Beim Dic. ist es der Key. Der Key ist der Eintrag selbst. Jedem Key kann man einen beliebigen Wert zuordnen. Weitere Vorteile:
Es ist schnell,
es lässt keine Doppelten Einträge zu.
Ich hab' noch ein paar Kommentare hinzugefügt. Wenns nicht reicht weiter fragen.
Gruß
Rudi
Anzeige
AW: Kundennamen zählen
04.12.2011 15:42:28
Kai
Hallo Rudi,
kommt leider ein Fehler. Benutyerdefinierter Typ nicht definiert, wsListe As Dictionary.
Danke
Gruss
Kai
AW: Kundennamen zählen
04.12.2011 16:21:54
Ass
Hallo Kai,
dann fehlt dir vermutlich der Verweis auf die M$scripting runtime.
'kannst ja mal nachsehen im VBA-Editor
Menü Extra - Verweise
Ist aber nicht tragisch
setze einfach:
Dim wsListe As Object
Gruß
Rudi
AW: Kundennamen zählen
04.12.2011 17:05:01
Kai
Hallo Rudi,
sieht sehr gut aus! Klasse, DANKE!
Werde das morgen mal mit Live Daten testen.
Mit den Dummysätzen klappt alles bestens!
Danke noch mal!
Grüße Kai

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige