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

GrößenProblem Dict? Rudi?

GrößenProblem Dict? Rudi?
15.04.2014 12:38:20
Jack_d
Hallo Gemeinde,
Hallo Rudi
vor geraumer Zeit hast du mich ganz stark bei einem Problem unterstützt bei dem Werte Gesammelt und sortiert werden. (Es war eine Fortlaufende Liste von Kunden mit Verschiedenen Aufträgen, welche in der Lösung in eine Zeile geschrieben wurden.)
Also 1. Tabelle
Kunde 1 Auftrag 1
Kunde 1 Auftrag 2
Kunde 1 Auftrag 3
Kunde 2 Auftrag 1
Kunde 2 Auftrag 2
usw.
2 Tabelle
Kunde 1 Auftrag 1 Auftrag 2 Auftrag 3
Kunde 2 Auftrag 1 Auftrag 2
usw.
Hier der Damalige Quellcode
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 True  'rngC.Offset(, 2).Value
Case rngC.Offset(, 2).Value Like "8-98*"
objANR("8-98") = 0
Case Else
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 = 5 To UBound(arrTmp)
Select Case True
Case arrATyp(i) = "8-98"
If arrTmp(j) Like "8-98*" Then
arrAnz(i) = arrAnz(i) + 1
End If
Case Else
If CInt(Split(arrTmp(j), "-")(0)) = arrATyp(i) Then
arrAnz(i) = arrAnz(i) + 1
End If
End Select
Next
Next
AnzANR = arrAnz
End Function
Jetzt habe ich folgendes Problem. Ich habe einen Datensatz welcher in Tabelle 1 bei mehr als 370.000 Einträgen ist. Es kommt beim Eintragen zu der Fehlermeldung "Index ausherhalb des Gültigen Bereichs"
Wenn ich den Datensatz Splitte in 3x 120.000 Daten funktioniert es. Nun bin ich Stundenlang durch den Debugger gelaufen und bin noch nicht schlauer.
Irgendwo gibt es offensichtlich ein Problem mit der Größe aber ich weiß nicht so recht wo.
Fällt Euch /Dir Rudi spontan ein, woran es liegen kann?
Grüße und vielen Dank für eure Zeit

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: GrößenProblem Dict? Rudi?
15.04.2014 12:46:04
Philipp
Hallo,
veränder doch mal den Datentyp Integer auf Long und schau, ob es dann klappt.
Gruß
Philipp

AW: GrößenProblem Dict? Rudi?
15.04.2014 12:55:17
Jack_d
Hallo Philipp
Danke für deinen Vorschlag. Das habe ich bereits ohne Erfolg probiert. Das hätte ich vielleicht sagen können.
Ich vermute ja das es an dem Dict liegt, ohne aber nur den Ansatz einer Ahnung zu haben
Grüße

in welcher Zeile des Code kommt der Fehler? owT
15.04.2014 12:50:20
robert

AW: in welcher Zeile des Code kommt der Fehler? owT
15.04.2014 12:58:24
Jack_d
Hallo Robert
In keiner der Vorgenannten Zeilen.
Klingt komisch, is aber so.
Es gibt eine Sub die die Functions aufruft
Sinngemäß
Array= OPS(Quellbereich)
Zelle.Resize=Array.transpose
Und beim schreiben in die Zelle tritt dann der Fehler auf.
Die Ursache liegt ja aber in der Function.
Grüße

Anzeige
AW: in welcher Zeile des Code kommt der Fehler? owT
15.04.2014 13:01:52
Philipp
Hallo,
aber wo genau kommt der Fehler?
Wenn Du beim error in den debug mode gehst, ist ja eine Zeile markiert.
Welche ist das?
Und hast Du alle Integer in Long verändert? Im Hauptsub und allen Functions, die genutzt werden?
Gruß
Philipp

AW: in welcher Zeile des Code kommt der Fehler? owT
15.04.2014 13:06:44
Jack_d
Hallo Phillip

Und hast Du alle Integer in Long verändert? Im Hauptsub und allen Functions, die genutzt werden?

Ja
Zelle.Resize=Array.transpose

In der zeile Streikt das Makro.
Wenn man manuell durchgeht sieht man aber das der Fehler irgendwo eher schon auftritt. Hab aber noch nicht die Ursache bzw. Stelle gefunden.
Grüße

Anzeige
AW: GrößenProblem Dict? Rudi?
15.04.2014 12:56:10
Rudi
Hallo,
Es kommt beim Eintragen
ich sehe nicht, wo was eingetragen wird.
Mach mal aus allen Integer Long.
Gruß
Rudi

AW: GrößenProblem Dict? Rudi?
15.04.2014 13:00:42
Jack_d
Hallo Rudi
Also mea culpa
Ich komm grad nicht an den Schreib-Quelltext ran, da ein Umfangreiches Makro läuft, welches seit 2 Stunden Excel am laufen hält.
Aber das schreiben erfolgt Sinngemäß über eine derartige Routine

Array= OPS(Quellbereich)
Zelle.Resize=Array.transpose
Die Integer habe ich schon gegen Long getauscht, jedoch ohne den Gewünschten Erfolg.
Grüße

Anzeige
AW: GrößenProblem Dict? Rudi?
15.04.2014 13:32:33
Rudi
Hallo,
Transpose funtioniert nicht mit mehr als 65535 Zeilen. Dann musst du das Array per Doppelschleife Transponieren.
Motto:
Array= OPS(Quellbereich)
TransposeA Array
Zelle.Resize(Ubound(array),Ubound(array,2)) = Array
Sub TransposeA(ByRef DasArray)
Dim arrTmp, i As Long, j As Long
ReDim arrTmp(1 To UBound(DasArray, 2), 1 To UBound(DasArray))
For i = 1 To UBound(DasArray)
For j = 1 To UBound(DasArray, 2)
arrTmp(j, i) = DasArray(i, j)
Next
Next
DasArray = arrTmp
End Sub

Gruß
Rudi

Anzeige
Sorry
15.04.2014 13:36:18
Jack_d
Rudi.
Wie Phillip schon gemeint hab, er findet kein transpose. Mein Kopf hat mir ein schnippchen geschlagen. Es ist kein Transpose Befehl im Code. Er hatte aber stattdessen einen anderen Vorschlag.
Und zwar die Cint auf Clong zu tauschen.
KLingt für meinen begrenzten Wissensschatz plausibel. Aber das kannst du besser beurteilen.
Grüße

Ergänzend Kompletter Code
15.04.2014 13:10:52
Jack_d
Ergänzend hier der Komplette angepasste und lauffähige Code
Bzw. bis zu einer gewissen Größe Lauffähig

'Bereich Festlegen
Dim rngDiagnosen, arrDiagnosen
Set rngDiagnosen = .Range(Cells(2, 1), Cells(Rows.Count, 4).End(xlUp))
'Funktionsaufruf
arrDiagnosen = ops(rngDiagnosen)
'Tabelle Leeren
Cells.Clear
' Array Eintragen
.Cells(1, 1).Resize(UBound(arrDiagnosen), UBound(arrDiagnosen, 2)) = arrDiagnosen
End With

Function ops(ByVal rngA As Range)
Dim objPat As Object, objANR As Object
Dim rngC As Range
Dim i As Long, j As Long, iMax As Long
Dim arrTmp, arrItems, arrNeu(), arrANR, arrANr2
Set objPat = CreateObject("Scripting.dictionary")   'Datensammler Patienten
Set objANR = CreateObject("Scripting.dictionary")   'Datensammler OPS-Ziffern
'On Error Resume Next
For Each rngC In rngA.Columns(4).Cells '(Patienten ID)
If objPat.exists(rngC.Value) Then
arrTmp = objPat(rngC.Value)
ReDim arrNeu(UBound(arrTmp) + 1)
For i = 0 To UBound(arrTmp)
arrNeu(i) = arrTmp(i)
Next
arrNeu(i) = rngC.Offset(, 2).Value
objPat(rngC.Value) = arrNeu
iMax = WorksheetFunction.Max(iMax, UBound(arrNeu))
Else  'neuer Patient
objPat(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
On Error Resume Next
'Auftragstypen 1er, 2er etc.
Select Case True  'rngC.Offset(, 2).Value
Case rngC.Offset(, 2).Value Like "8-98*"
objANR("8-98") = 0
Case Else
objANR(CInt(Split(rngC.Offset(, 2).Value, "-")(0))) = 0
End Select
Next rngC
arrItems = objPat.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 Long, j As Long
ReDim arrAnz(UBound(arrATyp))
For i = 0 To UBound(arrATyp)
arrAnz(i) = 0
For j = 5 To UBound(arrTmp)
Select Case True
Case arrATyp(i) = "8-98"
If arrTmp(j) Like "8-98*" Then
arrAnz(i) = arrAnz(i) + 1
End If
Case Else
If CInt(Split(arrTmp(j), "-")(0)) = arrATyp(i) Then
arrAnz(i) = arrAnz(i) + 1
End If
End Select
Next
Next
AnzANR = arrAnz
End Function

Anzeige
AW: Ergänzend Kompletter Code
15.04.2014 13:22:18
Philipp
Hallo,
also, den transpose Befehl find ich in deinem code nicht.
Aber: Versuch auch mal, zusätzlich zur Änderung von Integer zu Long auch eine Änderung von CInt auf CLng.
Gruß
Philipp

AW: Ergänzend Kompletter Code
15.04.2014 13:30:42
Jack_d
Hallo Phillip

also, den transpose Befehl find ich in deinem code nicht.
Hast recht, dass hatte ich falsch in Erinnerung. Entschuldige bitte.
 zusätzlich zur Änderung von Integer zu Long auch eine Änderung von CInt auf CLng.
Das könnte tatsächlich eine Idee sein. Das muss ich dann mal Probieren. Problem ist derzeit wie bereits erwähnt das Excel in der einen Instanz seit Stunden zwischen 80% und 100% meine I7 nutzt. Und ich mal ganz stark vermute das wenn ich jetzt eine 2. Instanz aufmache mir der Rechner die biege macht.
Grüße

Anzeige
AW: Ergänzend Kompletter Code
15.04.2014 13:35:25
Philipp
Hallo,
ja, das kenne ich :)
Bin gespannt, ob es hilft.
Gruß
Philipp

Loooft
15.04.2014 13:46:30
Jack_d
Vielen Dank Phillip
das war genau der Richtige Ansatz.
Ich hab es nun doch in einer 2. Instanz probiert und die Finger von allem gelassen.
Excel konnte sich auch kaum zwischen "Ich laufe" und "Keine Rückmeldung" entscheiden, aber er ist durchgelaufen und es Funktioniert.
Der Wechsel von Cint aus CLng war des Rätsels lösung.
Vielen Dank an der Stelle und auch an alle anderen die sich Gedanken gemacht haben.
Grüße

AW: Ergänzend Kompletter Code
15.04.2014 13:50:01
Rudi
Hallo,
hier hast du einen Fehler:
Set rngDiagnosen = .Range(Cells(2, 1), Cells(Rows.Count, 4).End(xlUp))
vor Cells muss auch ein .
Dim gehört immer an den Anfang einer Prozedur!
Gruß
Rudi

Anzeige
AW: Ergänzend Kompletter Code
15.04.2014 13:56:14
Jack_d
Hallo Rudi
Set rngDiagnosen = .Range(Cells(2, 1), Cells(Rows.Count, 4).End(xlUp))
Erscheint mir logisch. Wenn ich auch irgendwas im Hinterkopf habe, dass wir das mal hatten und dann rausgenommen haben.. Aber ich irr mich gerne wenn es um sowas geht ^^

Dim gehört immer an den Anfang einer Prozedur!
Da hast du natürlich recht. Die Dim Anweisung steht natürlich davor (was du nicht wissen kannst, weil ich es unterschlagen hab) Ich dachte es ist damit getan, die imho relevanten Codezeilen zu extrahieren. Hätte ich der Vollständigkeit halber aber mit angeben müssen. Ist richtig.
Des Lösungs Rätsel ist unterdessen der Wechsel von CInt auf CLng gewesen. Zumindest läuft der Code damit einwandfrei.
Grüße und vielen Dank für deine Unterstützung
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige