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

Extremwert-Sortierer

Extremwert-Sortierer
14.01.2021 08:50:02
Kallipo
Hi,
Ich bin relativ neu in der VBA-Programmierung und auch in anderen Sprachen nur wenig bewandert. Ich hab versucht mir eine Funktion zu schreiben, die mir aus oszilierenden Messdaten die Hoch- und Tiefpunkte der Messdaten gesondert listet. Für kleinere Datensätze klappt das auch schon ganz gut, aber nun habe Ich einen Datensatz mit über 200.000 Messpunkten. Hier bekomme Ich einen Laufzeitfehler ('6' Überlauf).
Kann mir jemand hier weiterhelfen? Ich vermute, dass Ich mit der Deklaration der Variablen ein wenig gepfuscht habe, außerdem glaube Ich das meine Funktion, die mir die Werte zurück ins Datenblatt schreibt eher unschön ist.
Vielen Dank für Antworten
Sub Sort()
Dim i As Integer
Dim bMax(0 To 1) As Integer
Dim Messwert(1 To 10000), Extremwert(1 To 10000), Index(1 To 10000) As Double
Dim sh As Worksheet
Set sh = ActiveWorkbook.ActiveSheet
Range("a1").Select
letzteZeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
i = 0
For i = 1 To letzteZeile
Messwert(i) = sh.Range("b2").Offset(i).Value
Index(i) = sh.Range("a2").Offset(i).Value
Next i
bMax(0) = 0
bMax(1) = 1
For i = 1 To letzteZeile - 1
If Messwert(i) 

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

Betreff
Datum
Anwender
Anzeige
Quadriere doch zum Mittel und sortiere danach
14.01.2021 08:58:22
lupo1
AW: Extremwert-Sortierer
14.01.2021 08:58:51
Kallipo
ok, das war etwas überhastet. Ich bastel seit ein paar Tagen an der Funktion und in dem Moment, wo ich es abschicke fällt mir der offensichtliche Fehler auf:
Den Index i kann Ich nicht als integer deklarieren, weil er für diese Anzahl an Werten nicht genügend Speicher deklariert. Wenn Ich den Array der Messwerte auf 1 bis 10.000 ausweiße, wird er wohl auch nicht mehr als 10.000 Werte aufnehmen können... Yey me!
Wenn Ich i als long deklariere und den Bereich der Messwerte auf eine Zahl größer als die Anzahl der Messwerte erweitere funktioniert es.
Ich würde mich trotzdem freuen, wenn mir jemand erklären könnte, wie Ich die Allokierung des Arrays etwas geschickter gestalten könnte. Fest einprogrammierte Zahlenwerte sind ja eher unschön.
Anzeige
AW: Extremwert-Sortierer
14.01.2021 09:17:30
worti
Hallo Kallipo,
den Array kannst du so passend dimensionieren:
    Dim Messwert(), Extremwert(), Index()
Dim letztezeile As Long
Dim sh As Worksheet
Set sh = ActiveWorkbook.ActiveSheet
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
ReDim Messwert(1 To letztezeile)
ReDim Extremwert(1 To letztezeile)
ReDim Index(1 To letztezeile)

Das Wort Datensatz (statt Daten) tr m z Weißglut
14.01.2021 09:00:02
lupo1
ich finde hier "Datensatz" als Begriff für
14.01.2021 11:04:29
Daniel
eine Messreihe durchaus passend, da es ja mehrere solcher Messreihen gibt.
die Daten einer Messreihe gehören inhaltlich zusammen und bilden somit einen Datensatz.
Dann nenne es =DATENREIHE(), so wie Excel es tut
15.01.2021 10:36:11
lupo1
Datensatz ist als Übersetzung von Record (nicht aber: Recordset!) schon vorbelegt und für nichts anderes.
Zu meiner Zeit (Studium in den 80ern) wäre keiner auf die Idee gekommen, aus "einem Satz von Daten" (das meint eine "Menge") einen "Datensatz" zu machen. Dafür hätte es einen Satz Kopfnüsse gegeben. Genau das aber passiert heute, seit etwa 2010.
Zum Kauf von größeren Immobilien oder auch Fabriken wird heutzutage gern ein "Datenraum" geöffnet (mittels Passwort zugänglich; enthält alles zu der Immobilie). Dagegen habe ich nichts, aber nur, weil es das Wort vorher nicht gab.
Anzeige
AW: Dann nenne es =DATENREIHE(), so wie Excel es tut
15.01.2021 11:31:29
Daniel
Hmm das fände ich jetzt komisch, "=" und "()" als Bestandteil eines Wortes sind jetzt in unserer Sprache eher unüblich
Das ist exakt, ...
16.01.2021 00:46:10
Luc:-?
…Lupo,
denn offensichtlich ist ein Satz von Daten gemeint und kein Datensatz, der seit es DBen gibt in der Bedeutung spezifiert festgelegt wurde. Die WortBildungsregeln des Deutschen führen hier zu einer Vermengung der allgemeinen mit der speziellen Bedeutung von ~satz, was auch daran liegt, dass das Wort Satz im Deutschen eine DoppelBedeutung hat (grammatisch und mengenbezogen), wobei sich die EDV-/DB-Bedeutung eher auf Ersteres, die allgemeinere auf Letzteres bezieht. Im Ggsatz zum Englischen muss das Deutsche öfter mit spezifizierenden Zusätzen arbeiten, wobei es auch zu fachgebietsbezogenen Überschneidungen kommen kann, die auch im Englischen auftreten können, nur nicht immer im gleichen Zusammenhang (vgl record - sentence - set, alle mehrdeutig).
Datenreihe wäre hier ebenfalls keine echte Alternative, denn diese ist ebenfalls fachspezifisch (statistisch) vorbelegt. Der vermehrte Gebrauch fachspezifisch konnotierter Begriffe in anderen als den fachspezifisch üblichen Zusammenhängen deutet auf ein Nicht-Vorhandensein bzw Verlorengehen spezieller Bedeutungen in weiten Kreisen hin und mag symptomatisch für eine eher allgemeine bis rudimentäre, aber dafür weitverbreitete EDV-Kenntnis sein. Wir wdn also mit dieser Art von „Begriffsverwirrnis“ leben und notfalls nachfragen müssen. ;-)
Morhn, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Anzeige
AW: Extremwert-Sortierer
14.01.2021 09:48:07
Daniel
Hi
Dimensionierte die Arrays zuerst nicht oder wenn, dann als Variant.
Verwende dann ReDim Variable(x to y) um die Arrays an die benötigte Größe anzupassen
Bei ReDim dürfen x und y Variablen oder Berechnungen sein.
Liest man Werte aus einen Tabellenblatt, geht das auch direkt:
Dim Messwert
Messwert = SH.Range("B2:B" & letzteZeile).value

Das Array wird dabei auf die passende größe dimensioniert.
Der erste Index ist 1.
Den Wert des letzten Index kannst du mit UBound ermitteln.
Allerdings ist so ein Array dann immer zweidimensional, dh du musst im Code auch immer den 2. index angeben: Messwert(i, 1)
Dafür könntest du Messwert und Index in eine Variable packen
Daten = SH.Range("A2:B" & letzteZeile)

und über den 2. index steuern, ob du Messwert oder Index haben willst (Daten(i, 1), Daten(i, 2)).
Macht aber nur Sinn, wenn die Spalten nebeneinander liegen, such ist der Code nicht mehr so gut lesbar, weil du nur noch Nummern statt sprechender Bezeichnungen hast.
Auch kann man solche Arrays dann direkt in die Tabelle schreiben, man muss nur darauf achten, den Zellbereich entsprechend der Größe anzugeben:
Cells(a, b).Resize(Ubound(X, 1), Ubound(X, 2)).value = X

Das ist schneller als eine Schleife, die jede Zelle einzeln füllt.
Gruß Daniel
Anzeige
PQ Lösung
14.01.2021 10:46:34
ChrisL
Hi
Bei grossen Datenmengen bietet sich Power-Query an. Im Anhang ein möglicher Lösungsweg.
https://www.herber.de/bbs/user/143000.xlsx
Bei Interesse PQ Intro-Video/Tutorial anschauen und bei Bedarf mit Fragen melden.
cu
Chris

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige