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

Schleifenauswertung: Collection oder Array?

Schleifenauswertung: Collection oder Array?
23.07.2008 15:11:00
Andreas
Hallo Herber Fans,
in den letzten Tagen häuft sich bei mir die Frage, was in Schleifen günstiger ist, um die Ergebnisse dieser Schleifenprüfungen vom Typ LONG zu sammeln. Ein Array oder eine Collection. Ich lasse nach einem String suchen und alle Fundspaltennummern sollen als Long gespeichert und nach der eigentlichen Suchschleife ausgewertet werden. Hinsichtlich Min(), Max(), Average(), Sum(), Item(i), etc.
Mit einem Array klappt das schon ganz gut, aber leider wird mir das Minimum mit 0 angegeben. Auch habe ich das Problem, das ich im ReDim Befehl angeben muß, wie viel Speicherplatz reserviert werden soll. Aber da die Suche und die Erkenntnis wie viele Fundstellen, deren Spaltennummer ich als Long speichern will, erst nach dem ReDim kommt, kann ich das Array nicht korrekt definieren.
Also dachte ich an eine Collection. Bei der Collection, kann ich die Werte dann hinsichtlich count und item(i) auch auswerten, aber anders als ein Array kann ich kein Min() oder Max() bilden, ohne nicht wieder eine Schleife a’la „For i = 1 to collection.count“ zu kreieren…
Welche Lösungen würdet ihr mit Eurer Erfahrung empfehlen? Collection? Aber wie dann sauber den Average oder die Sum ermitteln?
https://www.herber.de/bbs/user/54086.xls
Vielen Dank und Grüße,
Andreas H.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleifenauswertung: Collection oder Array?
23.07.2008 15:25:49
Kawensmann
Hallo,
1. Schau dir mal den optionalen Parameter "Preserve" für ReDim in der Hilfe an.
2. Du füllst dein Array erst ab dem Index 1, es beginnt aber bei Index 0. Da du in deiner Schleife nichts in arrW(0) schreibst, enthält dieses Feld den Wert 0. Also ist Min= 0 richtig.
Gruß
Kawensmann

AW: Schleifenauswertung: Collection oder Array?
23.07.2008 15:25:56
Kawensmann
Hallo,
1. Schau dir mal den optionalen Parameter "Preserve" für ReDim in der Hilfe an.
2. Du füllst dein Array erst ab dem Index 1, es beginnt aber bei Index 0. Da du in deiner Schleife nichts in arrW(0) schreibst, enthält dieses Feld den Wert 0. Also ist Min= 0 richtig.
Gruß
Kawensmann

Anzeige
AW: Schleifenauswertung: Collection oder Array?
23.07.2008 15:26:47
Kawensmann
Warum dieser Beitrag jetzt zweimal erscheint, ist mir schleierhaft ...

AW: Schleifenauswertung: Collection oder Array?
23.07.2008 15:26:30
Beverly
Hi Andreas,
ein Array kann auch eine variablen Obergrenze haben, wenn man den Befehl Redim Preserve verwendet. Z.B. wird mit diesem Code die Zelladresse und die Füllfarbe der nicht gesperrten Zellen eines Tabellenblattes in ein dynamisches Array geschrieben, da man ja nicht weiß, wie viele Zellen nicht gesperrt sind

Dim stWerte()
Dim raZelle As Range
Dim loZaehler As Long
For Each raZelle In Worksheets(1).UsedRange
If raZelle.Locked = False Then
ReDim Preserve stWerte(0 To 1, 0 To loZaehler)
stWerte(0, loZaehler) = raZelle.Address
stWerte(1, loZaehler) = raZelle.Interior.ColorIndex
loZaehler = loZaehler + 1
End If
Next raZelle




Anzeige
AW: Schleifenauswertung: Collection oder Array?
23.07.2008 18:48:00
Andreas
Hi Karin, Hallo Kawensmann,
Danke für Eure Tipps. Daß mit dem ReDim Preserve war der Knackpunkt. Ich habe mit dem Codebeispiel von Karin ein bißchen experimentiert und dann habe ich es hinbekommen. Und das schöne ist, ich kann die Ergebnisse wunderbar auswerten. Volltreffer.
Eine kleine Frage habe ich jedoch noch. Karin, in Deinem Beispiel startet ReDim Preserve in den Klammern immer bei 0. „0 to xyz.“
Muß ein Array immer bei 0 starten? An sich ist das nicht dramatisch, aber da ich mit den Array Ergebnissen oftmals weiterarbeite und alle anderen „For i = 1 to xyz“ Schleifen bei 1 starten ist das eine ungünstige Kombination. Ich hatte es erst vor wenigen Tagen, daß mich das ziemlich aus dem Konzept gebracht hatte, da ich immer mit einer -1 variieren mußte, um korrekte Ergebnisse zu bekommen. Als ich den Code auf änderte und bei 1 starten ließ, bekam ich eine Fehlermeldung des Index.

Sub SearchTest_Array_2()
Dim FundSt()
Dim iCounter As Long
Dim rgFound As Range, firstAddress As String
Dim MeinTXT As String
MeinTXT = "Europ" 'Mein Suchtext
With ActiveSheet.UsedRange
Set rgFound = .Find("*" & MeinTXT & "*", LookIn:=xlValues)
If Not rgFound Is Nothing Then
firstAddress = rgFound.Address
Do
ReDim Preserve FundSt(0 To iCounter)       'Müssen Arrays immer bei 0 starten?
Set rgFound = .FindNext(rgFound)
FundSt(iCounter) = rgFound.Column
iCounter = iCounter + 1
Loop While Not rgFound Is Nothing And rgFound.Address  firstAddress
End If
End With
Debug.Print "Max    :"; Application.Max(FundSt)
Debug.Print "Min    :"; Application.Min(FundSt)
Debug.Print "4. Item:"; FundSt(4 - 1)
`Das meine ich. Wenn ich das 4. Item mauslesen möchte, muß ich mit -1 auf 3 runtergehen, da das  _
Array bei 0 startet.
End Sub


Wenn ich dieses Detail noch klären könnte, wäre ich wunschlos glücklich und um ein paar sehr wertvolle Erkenntnisse reicher.
Dankeschön Euch beiden und noch einen schönen Mittwoch- Abend.
Viele Grüße, Andreas

Anzeige
AW: Schleifenauswertung: Collection oder Array?
23.07.2008 19:15:37
Andreas
Hallo Ihr Beiden,
eine Frage habe ich noch. Karins Beispiel hat mich mal an den Versuch gebracht, die Werte nicht nur in ein eindimensionales Array zu übertragen, sondern ein Array mit zwei Spalten. In der ersten Spalte werden die jeweiligen Rows der Fundstellen als Long geschrieben. In die zweite Spalte die Column Werte als Long. Wie kann ich diese in den nachfolgenden Auswertungen korrekt ansprechen. Also das Maximum der Row Werte, das Maximum der Column Werte.

Sub SearchTest_Array_MehrfachDimensioniert()
Dim FundSt()
Dim iCounter As Long
Dim rgFound As Range, firstAddress As String
Dim MeinTXT As String
MeinTXT = "Europa" 'Mein Suchtext
With ActiveSheet.UsedRange
Set rgFound = .Find("*" & MeinTXT & "*", LookIn:=xlValues)
If Not rgFound Is Nothing Then
firstAddress = rgFound.Address
Do
ReDim Preserve FundSt(0 To 1, 0 To iCounter)      'Müssen Arrays immer bei 0 starten?
Set rgFound = .FindNext(rgFound)
FundSt(0, iCounter) = rgFound.Column
FundSt(1, iCounter) = rgFound.Row
Debug.Print rgFound.Row, rgFound.Column
iCounter = iCounter + 1
Loop While Not rgFound Is Nothing And rgFound.Address  firstAddress
End If
End With
Debug.Print "MaxColumn      :"; Application.Max((FundSt(0, iCounter)))
Debug.Print "MaxRow         :"; Application.Max((FundSt(1, iCounter)))
Debug.Print "4. ColumnItem  :"; FundSt(0, (4 - 1))
Debug.Print "4. RowItem     :"; FundSt(1, (4 - 1))
End Sub


Geht das überhaupt? Oder habe ich den Code falsch aufgebaut, denn ich bekomme eine Index Fehlermeldung schon in der ersten DebugPrint Zeile?
Vielen Dank und Grüße,
Andreas

Anzeige
AW: Schleifenauswertung: Collection oder Array?
23.07.2008 20:59:03
Uduuh
Hallo,
erstmal: ein Array muss nicht mit 0 beginnen.
Für deine Berechnung musst du mit einer Schleife über das Array gehen. Macht aber nichts, da das ganze sehr schnell ist. Ist nur ein etwas größerer Programmieraufwand.
Gruß aus’m Pott
Udo

AW: Schleifenauswertung: Collection oder Array?
25.07.2008 12:12:00
Andreas
Hallo Udo,
vielen Dank für Deine Antwort. Das Array bei 1 starten zu lassen habe ich hinbekommen. Ich hatte übersehen, daß ich dann den iCounter vor der Schleife auch mit einem Startpunkt, sprich 1, versehen muß. Schusseligkeitsfehler…
Ich habe nun versucht, wie von Dir angeregt, die Auswertung über mehrere Spalten mit einer Schleife zu realisieren. Für das einzeln Auslesen eines Wertes aus dem Array habe ich die Schleife hinbekommen. Ich weiß aber leider nicht, wie ich adressieren soll: „1. Spalte, Gesamtheit aller Werte im Array, in der ersten Spalte“, um die Min/ Max Auswertung mittels Application.Max/ Min zu realisieren. Noch eine Schleife in die Schleife schachteln?

Sub SearchTest_Array_MehrfachDimensioniert()
Dim FundSt()
Dim iCounter, i As Long
Dim rgFound As Range, firstAddress As String
Dim MeinTXT As String
MeinTXT = "Europa" 'Mein Suchtext
With ActiveSheet.UsedRange
Set rgFound = .Find("*" & MeinTXT & "*", LookIn:=xlValues)
If Not rgFound Is Nothing Then
firstAddress = rgFound.Address
iCounter = 1
Debug.Print " Rows          "; "Columns"
Do
ReDim Preserve FundSt(1 To 2, 1 To iCounter)
Set rgFound = .FindNext(rgFound)
FundSt(1, iCounter) = rgFound.Column
FundSt(2, iCounter) = rgFound.Row
Debug.Print rgFound.Row, rgFound.Column
iCounter = iCounter + 1
Loop While Not rgFound Is Nothing And rgFound.Address  firstAddress
End If
End With
i = 1
For i = 1 To 2
Debug.Print "MaxColumn      :"; Application.Max((FundSt(i)))        'Fehler: "Index auß _
erhalb des gültigen Bereiches."
Debug.Print "3. ColumnItem  :"; FundSt(i, 3)
i = i + 1
Debug.Print "MaxRow         :"; Application.Max((FundSt(i)))        'Fehler: "Index auß _
erhalb des gültigen Bereiches."
Debug.Print "3. RowItem     :"; FundSt(i, 3)
Next i
End Sub


Vielen Dank für einen weiteren Hinweis, der mich der Lösung näher bringt.
Grüße und ein schönes Wochenende,
Andreas

Anzeige
AW: Schleifenauswertung: Collection oder Array?
25.07.2008 13:05:19
Rudi
Hallo,
warum speichrst du die Koordinaten der Fundstellen und nicht die Fundstellen selbst?
Packe alle Fundstellen in einen Range. Dann kannst du auch mit Worksheetfunctions arbeiten.

Sub SearchTest_Array_MehrfachDimensioniert()
Dim iCounter, i As Long
Dim rgFound As Range, firstAddress As String
Dim MeinTXT As String
Dim rgValues As Range
MeinTXT = "Europa" 'Mein Suchtext
With ActiveSheet.UsedRange
Set rgFound = .Find("*" & MeinTXT & "*", LookIn:=xlValues, lookat:=xlPart)
If Not rgFound Is Nothing Then
firstAddress = rgFound.Address
Set rgValues = rgFound
Do
Set rgFound = .FindNext(rgFound)
If Not rgFound Is Nothing Then
Set rgValues = Union(rgValues, rgFound)
End If
Loop While Not rgFound Is Nothing And rgFound.Address  firstAddress
End If
End With
If Not rgValues Is Nothing Then
MsgBox WorksheetFunction.Max(rgValues)
MsgBox WorksheetFunction.Min(rgValues)
End If
End Sub


Gruß
Rudi

Anzeige
AW: Schleifenauswertung: Collection oder Array?
25.07.2008 13:58:59
Andreas
Hallo Rudi,
ich benötige die Koordinaten, da aufgrund verschiedener Layouts von den Kooridnaten abhängt, welche Fundstelle genommen wird. Mal muß es die 4. Fundstelle sein, mal die höchste, mal die niedrigste. Und das auch noch unterschieden nach Row und Column. Deswegen hat sich mir die Array Lösung überhaupt erst als Frage gestellt. Um grundsätzliches Wissen zu diesem Thema zu bekommen, arbeite ich gerade an der Datei.
Die Erkenntnisse bisher helfen mir auch schon, aber eben die Frage wie ich ein Maximum/ Minimum entweder der Columns oder der Rows ermitteln kann ist für mich noch offen.
Grüße, Andreas

Anzeige
AW: Schleifenauswertung: Collection oder Array?
25.07.2008 14:33:55
Rudi
Hallo,

Mal muß es die 4. Fundstelle sein, mal die höchste, mal die niedrigste. 


Die einzelnen Zellen im Range geben doch die Reihenfolge des Findens wieder.
rgValues(1) ist der erste Fund, rgValues(rgValues.Count) der letzte, rgValues(4) eben der vierte etc.
Gruß
Rudi

AW: Schleifenauswertung: Collection oder Array?
29.07.2008 12:35:00
Andreas
Hallo Rudi,
bitte entschuldige die späte Antwort. Ich habe mir Deinen Vorschlag mit etwas mehr Ruhe angesehen und konnte ihn umsetzen. Es funktioniert.
Vielen Dank.
Grüße, Andreas

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige