Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
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

Ruuuuddddiiii =)

Ruuuuddddiiii =)
07.06.2013 10:45:41
Jackd
Hallo Rudi
Vielen DAnk nochmal für deine bisherige unterstützung
Es funktioniert für die eine Aufgabenstellung auch super.
Nur Wollte ich das jetzt auf eine andere Mappe anpassen, bei der "fast" das gleiche Problem ist, mit einer Ausnahme, dass kein Erstauftrag oder Folgeauftrag gefordert ist.
Und ich bekomm es nicht hin.
Das "Problem ist analog" ich habe eine Kundennummer und verschiedene Aufträge (ohne klassifizierung)
Könntest du mir bitte nochmals helfend unter die Arme greifen
Sub Sortiersub()
Dim rngOPS, arrOPS
Set rngOPS = Range(Cells(2, 1), Cells(Rows.Count, 4).End(xlUp))
'Funktionsaufruf
arrOPS = ops(rngOPS)
'Tabelle Leeren
'Cells.Clear
' Array Eintragen
Cells(5, 12).Resize(UBound(arrOPS), UBound(arrOps, 2)) = arrOPS
End Sub
Function ops(ByVal rngA As Range)
Dim objKD As Object
Dim rngC As Range
Dim i As Integer, j As Integer, iMax As Integer
Dim arrTmp, arrItems, arrNeu()
Set objKD  = CreateObject("Scripting.dictionary")  'Datensammler
For Each rngC In rngA.Columns(4).Cells '(Patienten ID)
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
objKD (rngC.Value) = arrNeu
iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))
Else  'neuer Patient
objKD (rngC.Value) = Array(rngC.Offset(, -3), rngC.Offset(, -2), rngC.Offset(, -1),  _
rngC.Value, _
rngC.Offset(, 1).Value, rngC.Offset(, 2).Value, rngC.Offset(, 3).Value, , , _
rngC.Offset(, 7).Value, rngC.Offset(, 6).Value)
iMax = WorksheetFunction.Max(iMax, 2)
End If
Next rngC
arrItems = objKD .items
ReDim arrNeu(1 To UBound(arrItems) + 2, 1 To iMax + 1)
'Überschriften
arrNeu(1, 1) = "IK"
arrNeu(1, 2) = "Standort"
arrNeu(1, 3) = "Bereich"
arrNeu(1, 4) = "internes-Kennzeichen"
arrNeu(1, 5) = "Version"
'arrNeu(1, 6) = "Kode"
'arrNeu(1, 7) = "Lokalisation"
'arrNeu(1, 8) = "Datum"
'arrNeu(1, 9) = "PErson1"
'arrNeu(1, 10) = "Person2"
For i = 7 To UBound(arrNeu, 2)
arrNeu(1, i) = "OPS " & i - 6
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
ops = arrNeu
End Function
Irgendwie macht er nicht das was er soll -.-
Zudem ist mir nicht klar, warum der einen Fehler bringt, wenn ich den rngOPS setze und die Spaltenanzahl erhöhe (der DAtensatz hat eigentlich mehr Spalten als 4 ) bringt er nen Indexfehler
Funktioniert aber in der Ursprünglichen Problemstellung
Ratlose Grüße
Und Thanks in advance

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ruuuuddddiiii =)
07.06.2013 10:54:36
Matze
Hallo Jackd,
ist es nicht besser gleich eine Muster Datei des Aufbaues hier einzustellen?
mit der Anzahl der Spalten um die es geht, dann kann man den Code direkt anpassen.
Wieviel Spalten sind es denn?
Und diese Zeile
Cells(5, 12).Resize(UBound(arrOPS), UBound(arrOps, 2)) = arrOPS
muss bestimmt auch angepasst werden ?
Matze

AW: Ruuuuddddiiii =)
07.06.2013 11:16:59
Jackd
Hallo Matze
Du hast natürlich Recht eine Mappe ist immer Sinnvoll :-D
Daher anbei =)
https://www.herber.de/bbs/user/85697.xlsm
Da versuch ich ganz dreisst gleich noch die zweite Fragestellung durchzubringen =)
Schritt 1 ist die beschriebene Sortierung
Schritt 2 hingegen soll dann ein "Anzahlfeld je Kunde einfügen" Das kann man evtl gleich mit im Hintergrund laufenden Zählern implementieren..?
Und der Zielbereich (da hast du recht) muss im Anschluss angepasst werden ich hatte es aus bequemlichkeit zum austesten nur immer auf der gleichen Tabelle leicht versetzt gelassen, so dass ich Start und Ziel vergleichen konnte
Grüße

Anzeige
Beispielmappe? owT
07.06.2013 11:15:21
Rudi

AW: Beispielmappe? owT
07.06.2013 12:52:35
Rudi
Hallo,
Schritt1:
Function ops(ByVal rngA As Range)
Dim objKD As Object
Dim rngC As Range
Dim i As Integer, j As Integer, iMax As Integer
Dim arrTmp, arrItems, arrNeu()
Set objKD = CreateObject("Scripting.dictionary")   'Datensammler
For Each rngC In rngA.Columns(4).Cells '(Patienten ID)
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(i) = rngC.Offset(, 2).Value
objKD(rngC.Value) = arrNeu
iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))
Else  'neuer Patient
objKD(rngC.Value) = Array(rngC.Offset(, -3).Value, rngC.Offset(, -2).Value, rngC. _
Offset(, -1).Value, rngC.Value, _
rngC.Offset(, 1).Value, rngC.Offset(, 2).Value)
iMax = WorksheetFunction.Max(iMax, 6)
End If
Next rngC
arrItems = objKD.items
ReDim arrNeu(1 To UBound(arrItems) + 2, 1 To iMax + 1)
'Überschriften
arrNeu(1, 1) = "IK"
arrNeu(1, 2) = "Standort"
arrNeu(1, 3) = "Bereich"
arrNeu(1, 4) = "internes-Kennzeichen"
arrNeu(1, 5) = "Version"
'arrNeu(1, 6) = "Kode"
'arrNeu(1, 7) = "Lokalisation"
'arrNeu(1, 8) = "Datum"
'arrNeu(1, 9) = "PErson1"
'arrNeu(1, 10) = "Person2"
For i = 6 To UBound(arrNeu, 2)
arrNeu(1, i) = "OPS " & i - 5
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
ops = arrNeu
End Function
Schritt2 verstehe ich nicht
Gruß
Rudi

Anzeige
AW: Beispielmappe? owT
07.06.2013 13:02:55
Jackd
Hallo Rudi
Vielen DAnk für deine Anpassung..
Ich werde sie mir gleich reinziehen, wenn ich office neu aufgesetzt hab .. nun letztlich doch die 32 bit variante =)
Auf den ersten blick ist die auch gar nicht so anders wie meine :-D der Teufel liegt halt im Detail ..
Zu Schritt 2 .. soll im Prinzip eine Auswertung der Aufträge je Kunde gemacht werden (also x mal mit 1 beginnend; x mal mit 2 beginnend; x mal mit 3 beginndend ) usw..
Vielleicht fällt dir ja was dazu ein =)
Grüße

Schritt2-Frage
07.06.2013 13:20:34
Rudi
Hallo,
es kommen 1,3,5,6,8,9 vor.
Können alle Ziffern (0-9) vorkommen und sollen alle ausgewertet werden?
Gruß
Rudi

Anzeige
AW: Schritt2-Frage
07.06.2013 13:29:00
Jackd
Hallo Rudi..
freut mich das du mir hilfst.. DAnke
Also zum aktuellen Zeitpunkt gibt es nur
1,3,5,6,8,9
wobei es einen sonderfall gibt
die 8-98 müsse gesondert ausgewertet werden..
Aber das müsste man im Zweifel ja auch anpassen können.. oder? =)
Grüße

AW: Schritt2
07.06.2013 15:13:55
Rudi
Hallo,
teste mal
Function ops(ByVal rngA As Range)
Dim objKD As Object, objANR As Object
Dim rngC As Range
Dim i As Integer, j As Integer, iMax As Integer
Dim arrTmp, arrItems, arrNeu(), arrANR, arrANr2
Set objKD = CreateObject("Scripting.dictionary")   'Datensammler Kunden
Set objANR = CreateObject("Scripting.dictionary")   'Datensammler Auftragsnummern
For Each rngC In rngA.Columns(4).Cells '(Patienten ID)
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(i) = rngC.Offset(, 2).Value
objKD(rngC.Value) = arrNeu
iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))
Else  'neuer Patient
objKD(rngC.Value) = Array(rngC.Offset(, -3).Value, rngC.Offset(, -2).Value, rngC.Offset(,  _
-1).Value, rngC.Value, _
rngC.Offset(, 1).Value, rngC.Offset(, 2).Value)
iMax = WorksheetFunction.Max(iMax, 6)
End If
'Auftragstypen 1er, 2er etc.
'    Select Case CInt(Split(rngC.Offset(, 2).Value, "-")(0))
'      Case 1 To 7
objANR(CInt(Split(rngC.Offset(, 2).Value, "-")(0))) = 0
'    End Select
Next rngC
arrItems = objKD.items
arrANR = objANR.keys
'Auftragstypen sortieren
For i = 0 To UBound(arrANR)
For j = i To UBound(arrANR)
If arrANR(j)  4) * objANR.Count) = arrTmp(j)
Next
arrANr2 = AnzANR(arrANR, arrTmp)
For j = 0 To UBound(arrANR)
arrNeu(i + 2, j + 6) = arrANr2(j)
Next
Next
ops = arrNeu
End Function
Function AnzANR(arrATyp, arrTmp)
Dim arrAnz()
Dim i As Integer, j As Integer
ReDim arrAnz(UBound(arrATyp))
For i = 0 To UBound(arrATyp)
arrAnz(i) = 0
For j = 6 To UBound(arrTmp)
If CInt(Left(arrTmp(j), 1)) = arrATyp(i) Then
arrAnz(i) = arrAnz(i) + 1
End If
Next
Next
AnzANR = arrAnz
End Function

Gruß
Rudi

Anzeige
AW: Schritt2
07.06.2013 16:37:58
Jackd
Mach ich gern Rudi..
Sofern ich dann wieder funktionierendes Office hab. .
Microsoft testet heut meine Leidensfähigkeit... -.-
Ich muss dann erstmal raus.. sonst fliegt noch ein Rechner ausm Fenster.
Vielen Dank dir erstmal und ich berichte =)
Grüße

viel Erfolg bei der Installation
07.06.2013 19:31:30
Rudi
Hallo,
das ist glaub ich gar nicht so einfach, Office wieder los zu werden und eine andere Version zu installieren.
Gruß
Rudi

Sag ich dir
10.06.2013 09:02:21
Jackd
Hallo Rudi..
Also es ist zum aus der Haut fahren...
Ich hab am Freitag angefangen. Und bin nun an dem Punkt, wo ich den Rechner komplett platt machen darfn.
Es hat mir vermutlich die komplette Registry zerschossen..
Es funktionieren nahezu keine Programme mehr..
Und Office natürlich gar nicht
-.-
Nunja Microsoft halt :-D
Bis dann dann

Anzeige
Wieder Online
10.06.2013 13:54:58
JACKD
Hallo Rudi...
Hab es geschafft... Office ist wieder online =)
Hab deinen Code auch ausprobiert..
macht auch genau das was er soll =)Spitze.. vielen DAnk für deine Mühe.. weiss gar nicht wie ich dir Danken kann....
Eine Frage hätte ich allerdings...
Du liesst du die Gruppen (1,3, 5...) in der Funktion AnzANR ein oder?
Das ist ja in dem Fall über ne Schleife gelöst, bei der Links 1 geschaut wird.
Wie kann ich denn jetzt die 8-98 implementieren?
Grüße und Vielen Vielen Dank

AW: Wieder Online
10.06.2013 16:04:59
Rudi
Hallo,
die Funktion hatte eh nen Fehler.

Function AnzANR(arrATyp, arrTmp)
Dim arrAnz()
Dim i As Integer, j As Integer
ReDim arrAnz(UBound(arrATyp))
For i = 0 To UBound(arrATyp)
arrAnz(i) = 0
For j = 5 To UBound(arrTmp)
If CInt(Split(arrTmp(j), "-")(0)) = arrATyp(i) Then
arrAnz(i) = arrAnz(i) + 1
End If
Next
Next
AnzANR = arrAnz
End Function

Gruß
Rudi

Anzeige
AW: Wieder Online
10.06.2013 16:31:46
JACKD
Mh..
Kannst mal sehen was ich alles so nicht mitkriege -.-
auf jeden Fall sehe ich dass du die Methode geändert hast .. von
left auf split..
hat das nen speziellen Hintergrund?
Grüße

Hintergrund
11.06.2013 14:27:38
Rudi
Hallo,
ja natürlich. Sonst hätt ichs nicht gemacht.
Split(arrTmp(j), "-") zerlegt die Auftragsnummer anhand des - in ein Array mit 2 Elementen.
Ich prüfe das erste. Wäre auch mit left(arrtmp(j),instr(arrtmp(j),"-")-1) gegangen.
Gruß
Rudi

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige