Diagramm aus 50.000 wertepaaren generieren-makro?!

hallo excel-fachleute,

folgendes problem:
ich habe messwertpaare (~50.000 stück) eines elektronischen gerätes nach excel importiert.
spalte A: datum inkl. uhrzeit
spalte B: spannung (0,000 bis 1,000 V)
das ganze will ich als diagramm darstellen. weil dort aber nur ~32000 wertepaare darstellbar sind, möchte ich nur jedes 10-te wertepaar verwenden.
nun meine frage: wie kann ich jedes 10. (bzw. n-tes) wertepaar „automatisch“ in ein zweites arbeitsblatt kopieren???

habe von makros bisher keinen plan.

danke sagt der paragliders

nun meine frage: wie kann ich jedes 10. (bzw. n-tes) wertepaar
„automatisch“ in ein zweites arbeitsblatt kopieren???

Hi Paraglider,
Alt+F11, Einfügen Modul, Code reinkopiern, Editor schliessen, Aufruf in Excel über Extras–Makros—Makro—tt—Ausführen.

Option Explicit

Sub tt()
Dim n As Byte, start As Byte, pos2 As Long
n = 10
start = 1 'oder 2 wenn du Überschrift hast
While Worksheets("Tabelle1").Range("A" & start) ""
 pos2 = pos2 + 1
 Worksheets("Tabelle2").Range("A" & pos2) = Worksheets("Tabelle1").Range("A" & start)
 start = start + n
 pos2 = pos2 + 1
Wend
End Sub

Gruß
Reinhard

hallo reinhard,
danke für die schnelle antwort.
das makro funktioniert im prinzip, allerdings bearbeitet es nur 250 zeilen von meinen 50000 zeilen.
ist im makro der variablentyp (byte, long) von „start“ bzw. „pos“ zu ändern.
welchen typ brauche ich für die 50000 zeilen oder liegt ein anderer fehler vor?
MVB meldet: „Laufzeitfehler, Index außerhalb gültiger Bereich“

danke im vorraus vom
paragliders

Hi Paragliders,
da wolte ich wieder Arbeitsspeicher sparen :smile:
Deklariere alles als long
Gruß
Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo zurück reinhard,
das makro läuft wie gewünscht. danke für die hinweise.
neben der erreichten funktionalität möchte ich gern noch ein wenig komfort erzielen, weil die datei auch von anderen verwendet werden soll.

meine wünsche:

  1. ein „button“ im blatt 1, der das makro startet. (makrostart per tastenkombination habe ich schon gefunden)

  2. das makro soll aus einer zelle im blatt 1 (z.b. E1) die von anwender eingegebene, gewünschte schrittweite (n= 2, oder n=5, oder n=10 …)zum filtern der datenpaare verwenden.

  3. das maximum oder minimum kann ich mir mit max(A:A) oder min() anzeigen lassen. aber wie verrät mir excel, in welcher zelle (von meinen 50000 zellen) sich z.b. der maximalwert befindet?

bin mal gespannt, wie viele meiner wünsche in erfüllung gehen.

paragliders sagt dankeschön

Hi paragliders,

  1. ein „button“ im blatt 1, der das makro startet. (makrostart
    per tastenkombination habe ich schon gefunden)

Ansicht—Symbolleisten—Formular
Dort dann mit der Maus über die Symbole fahren bis bei dem grauen Ding „Schaltfläche“ angezeigt wird, draufklicken, im Blatt ne Schaltfläche "aufziehen, der dann das Makro zuweisen.

  1. das makro soll aus einer zelle im blatt 1 (z.b. E1) die von
    anwender eingegebene, gewünschte schrittweite (n= 2, oder n=5,
    oder n=10 …)zum filtern der datenpaare verwenden.

Ersetze im Code
n=10
durch
n = Range(„E1“)

  1. das maximum oder minimum kann ich mir mit max(A:A) oder
    min() anzeigen lassen. aber wie verrät mir excel, in welcher
    zelle (von meinen 50000 zellen) sich z.b. der maximalwert
    befindet?

Bezogen auf Spalte A:

sub Max()
dim zei as long, MaxWert, ZeileMaxWert as long
ZeileMaxWert=1
MaxWert=Cells(1,1)
for zei = 2 to Range("A65536").end(xlup).row 
 if cells(zei,1)\>MaxWert then
 ZeileMaxwert=zei 
 MaxWert=cells(zei,1)
 end if
next zei
msgbox "der größte Wert " & MaxWert & " ist in Zeile " & ZeileMaxwert
end sub

bin mal gespannt, wie viele meiner wünsche in erfüllung gehen.

ich auch, da ungetestet :smile:

paragliders sagt dankeschön

Gruß
Reinhard

Hallo paragliders

zu 1.

Mit der Symbolleiste „Steuerelemente-Toolbox“ kannst du den Button in der Tabelle kreieren.
Die Eigenschaft „TakeFocusOnClick“ des Buttons muß du auf „False“ einstellen (zumindest unter EXCEL 97)

der Code für den Button muß so sein:

Private Sub CommandButton1\_Click()
 Call TabellenVerkürzen
End Sub

zu 2. und 3.
dazu muß du das Makro von Reinhard wie folgt ändern. Dabei hab ich die Eingabe der Schrittweite über eine Input-Box als Alternative mit eingebaut und auch die Ausgabe der Zellen mit Min- und Max-Werten

Option Explicit

Sub TabellenVerkürzen()
 Dim n As Long, start As Long, pos2 As Long
 Dim wks1 As Worksheet, wks2 As Worksheet
 Dim Boxtext As String, Zelle As Range, Bereich As Range
 Set wks1 = ThisWorkbook.Sheets("Tabelle1") ' Tabelle mit den vielen Daten
 Set wks2 = ThisWorkbook.Sheets("Tabelle2") ' Ausgabetabelle für reduzierte Datenmenge
 n = wks1.Range("E1") ' Schrittweite
 'Alternative für Schrittweite:
 n = Val(InputBox("Schrittweite?", "Tabelle reduzieren", 10))
 If n = 0 Then Exit Sub
 start = 1 'oder 2 wenn du Überschrift hast
 pos2 = 1 ' Startzeile in Tabelle 2
 Set Bereich = wks1.Range("A" & start & ":A" & (wks1.UsedRange.Row + wks1.UsedRange.Rows.Count - 1))
 With wks2
 'Alte Werte in Tabelle2 löschenZeile
 .Range("A" & pos2 & ":A" & (.UsedRange.Row + .UsedRange.Rows.Count - 1)).ClearContents
 'Neue Werte eintragen
 While wks1.Range("A" & start) ""
 .Range("A" & pos2) = wks1.Range("A" & start)
 start = start + n
 pos2 = pos2 + 1
 Wend
 End With
 'Zellen mit Min- und Max-Werten anzeigen
 Boxtext = "Der Min-Wert " & Application.WorksheetFunction.Min(Bereich) & \_
 " ist in folgenden Zellen vorhanden:" & vbCr
 For Each Zelle In Bereich
 If Zelle.Value = Application.WorksheetFunction.Min(Bereich) Then
 Boxtext = Boxtext & Zelle.Address & vbCr
 End If
 Next Zelle
 Boxtext = Boxtext & "Max-Wert " & Application.WorksheetFunction.Max(Bereich) & \_
 " ist in folgenden Zellen vorhanden:" & vbCr
 For Each Zelle In Bereich
 If Zelle.Value = Application.WorksheetFunction.Max(Bereich) Then
 Boxtext = Boxtext & Zelle.Address & vbCr
 End If
 Next Zelle
 MsgBox Boxtext
End Sub

Sollten die Min.- bzw. Max.-Werte in sehr vielen Zellen( mehr als ca. 20) vorkommen, dann muß man die Zell-Adressen in der Tabelle ausgeben oder evtl. ohne Zeilenschaltung in der MsgBox ausgeben.

zu 3. Formel-Lösung
es gibt auch eine Lösung mit Formel, allerdings wird dabei nur die Zeile ausgegebn in der Min- bzw. Max-Wert das 1. Mal auftritt. Beispiel:

Tabellenblattname: Tabelle1

 A B C 
 1 2 Zeile-Max 5 
 2 3 Max 7 
 3 5 Zeile-Min 1 
 4 6 Min 2 
 5 7 
 6 2 
 7 4 
 8 6 
 9 7 
10 2 
11 7 

Benutzte Formeln:
C1: =VERGLEICH(MAX(A:A);A:A;FALSCH)
C2: =MAX(A:A)
C3: =VERGLEICH(MIN(A:A);A:A;FALSCH)
C4: =MIN(A:A)

Gruß
Franz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo franz und reinhard,
danke für die schnellen antworten.

der button und die min-max ermittlung klappt soweit. das makro von franz ist für mich als makrolaien ein wenig zu umfangreich um komplett durchzublicken.

ich möchte die zielstellung teilweise neu definieren, weil durch die schrittweite sprunghafte änderungen der spannungswerte (z.b. von 0,3…V auf 1,5…V) evt. nicht erfasst werden. mein ziel ist halt, die datenmenge zu reduzieren, ohne markante werte zu verlieren.

deshalb möchte ich als filter keine schrittweite vorgeben, sondern nur die zeilen ins 2. blatt kopieren, deren spannungswert (spalte G) sich vom vorherigen wert um eine definierten BETRAG unterscheiden.
diesen betrag (z.b. deltaU = ± 0,01) möchte ich in zelle A10 vorgeben.

meine tabelle sieht so aus:
wertepaare in spalten E bis G, Zeilen 32 bis z.b. 38241.
(zeilen 1 bis 31 diverse geräteparameter beim importieren nach excel)

E F G
1
2

31
32 I U
33 0:00:00 520 0,281838293
34 0:00:03 520 0,309029543
35 0:00:05 520 0,309029543
36 0:00:06 520 0,28840315
… …
38236 23:59:55 520 0,316227766
38237 23:59:56 520 0,316227766
38238 23:59:57 520 0,34673685
38239 23:59:58 520 0,323593657
38240 23:59:59 520 0,309029543
38241 0:00:00 520 0,309029543

wie lautet der entsprechende makrotext zum vergleich von 2 aufeinanderfolgenden spannungswerte in spalte G bei vorgegebenem betrag(delta U) in zelle A10?

ihr seht also, ich habe schon wieder sonderwünsche, hoffe aber auf eure hilfe.

bonusaufgabe:
wie kann ich in einem liniendiagramm den minimalen und maximalen x-wert (mittels makro!?) aus einer zelle (z.b. A20=20.04.06=38830, A21=38831) vorgeben, damit mein diagramm gleich „erkennt“, von wann die daten sind?

ein großes danke vom paragliders

ups, die tabelle hat ein wenig gelitten. denke aber, dass mein ziel erkennbar ist.
paragliders

Hallo Paragliders

ich möchte die zielstellung teilweise neu definieren, weil
durch die schrittweite sprunghafte änderungen der
spannungswerte (z.b. von 0,3…V auf 1,5…V) evt. nicht
erfasst werden. mein ziel ist halt, die datenmenge zu
reduzieren, ohne markante werte zu verlieren.

deshalb möchte ich als filter keine schrittweite vorgeben,
sondern nur die zeilen ins 2. blatt kopieren, deren
spannungswert (spalte G) sich vom vorherigen wert um eine
definierten BETRAG unterscheiden.
diesen betrag (z.b. deltaU = ± 0,01) möchte ich in zelle A10
vorgeben.

wie lautet der entsprechende makrotext zum vergleich von 2
aufeinanderfolgenden spannungswerte in spalte G bei
vorgegebenem betrag(delta U) in zelle A10?

Ich würde hier nicht zwei aufeinander folgende Werte in Spalte G vergleichen, sondern immer den Wert in Spalte G mit dem zuletzt in die Tabelle 2 übertragenen Wert. Sonst kann es passieren, dass wenn sich in Spalte G die Werte mehrmals hintereinander um etwas weniger als Delta U ändern keine Werte in Tabelle 2 geschrieben wird. Es sei denn für dich sind tatsächlich nur die Sprünge von einer Messung zur nächsten relevant.
So etwa kann das Makro aussehen:

Option Explicit

Sub TabellenVerkürzen()
Dim Delta As Double, start As Long, pos2 As Long
 Delta = Worksheets("Tabelle1").Range("A10") ' Mindest-Differenz zwischen Meßwerten
 start = 33 '1. Zeile mit Messdaten in Tabelle 1
 pos2 = 2 ' Startzeile in Tabelle 2
 'Alte Werte in Tabelle2 löschen
 Worksheets("Tabelle2").Range("A" & pos2 & ":C65000").ClearContents
 ' Werte aus 1. Zeile (33) mit Messdaten in Tabelle 2 eintragen
 Worksheets("Tabelle2").Range("A" & pos2) = Worksheets("Tabelle1").Range("E" & start)
 Worksheets("Tabelle2").Range("B" & pos2) = Worksheets("Tabelle1").Range("F" & start)
 Worksheets("Tabelle2").Range("C" & pos2) = Worksheets("Tabelle1").Range("G" & start)

 While Worksheets("Tabelle1").Range("G" & start) ""
 start = start + 1 ' Zeilenzähler in Tabelle 1 um 1 erhöhen
 'Vergleich des Wertes in Tabelle 1 mit dem zuletzt in die Tabelle 2 übertragenen Wert.
 If Abs(Worksheets("Tabelle1").Range("G" & start) - Worksheets("Tabelle2").Range("C" & pos2)) \>= Delta Then
 pos2 = pos2 + 1 ' Zeilenzähler in tabelle 2 um 1 erhöhen
 ' Werte von Tabelle 1 in Tabelle 2 eintragen
 Worksheets("Tabelle2").Range("A" & pos2) = Worksheets("Tabelle1").Range("E" & start)
 Worksheets("Tabelle2").Range("B" & pos2) = Worksheets("Tabelle1").Range("F" & start)
 Worksheets("Tabelle2").Range("C" & pos2) = Worksheets("Tabelle1").Range("G" & start)
 End If
 Wend
End Sub


Für Vergleich von direkt aufeinanderfolgenden Werten in Spalte G wird die If-Zeile zu

 If Abs(Worksheets("Tabelle1").Range("G" & start) - Worksheets("Tabelle1").Range("G" & start-1)) \>= Delta Then

bonusaufgabe:
wie kann ich in einem liniendiagramm den minimalen und
maximalen x-wert (mittels makro!?) aus einer zelle (z.b.
A20=20.04.06=38830, A21=38831) vorgeben, damit mein diagramm
gleich „erkennt“, von wann die daten sind?

Hab die Frage nicht genau verstanden.
Möchtest du die Werte nur für einen bestimmten Zeitraum (von min bis max) im Diagramm darstellen? Oder möchtest Du die Information aus den Zellen zusätzlich auf dem Diagramm z.B. in einem Textfeld darstellen?

Gruß
Franz

ups, die tabelle hat ein wenig gelitten. denke aber, dass mein
ziel erkennbar ist.
paragliders

Hi paragliders,
benutze

 vor und 

nach der Tabelle, dann siehst eher so aus:

 E F G
1
2
...31
32
I
U33
0:00:00 520 0,28183829334
0:00:03 520 0,30902954335
0:00:05 520 0,30902954336
0:00:06 520 0,28840315
……
38236 23:59:55 520 0,31622776638237
 23:59:56 520 0,31622776638238
 23:59:57 520 0,3467368538239
 23:59:58 520 0,32359365738240
 23:59:59 520 0,30902954338241
 0:00:00 520 0,309029543

Gruß
Reinhard

ups, die tabelle hat ein wenig gelitten. denke aber, dass mein
ziel erkennbar ist.
paragliders

Hi paragliders,
benutze

 vor und 

nach der Tabelle, dann siehst eher so aus:

 E F G
1
2
...31
32
I
U33
0:00:00 520 0,28183829334
0:00:03 520 0,30902954335
0:00:05 520 0,30902954336
0:00:06 520 0,28840315
……
38236 23:59:55 520 0,31622776638237
 23:59:56 520 0,31622776638238
 23:59:57 520 0,3467368538239
 23:59:58 520 0,32359365738240
 23:59:59 520 0,30902954338241
 0:00:00 520 0,309029543

Gruß
Reinhard

hallo franz,
danke für das makro. deine idee mit der vorgegebenen differenz hatte ich auch schon und habe sie umgesetzt.
das ganze läuft also wie gewünscht.

Hab die Frage nicht genau verstanden.
Möchtest du die Werte nur für einen bestimmten Zeitraum (von
min bis max) im Diagramm darstellen? Oder möchtest …

die erste option möchte ich darstellen, dabei den min und max wert (z.b. 12.5.06 0uhr bis 13.5.06 0uhr) im arbeitsblatt in 2 zellen (z.b. A5 und A6) vorgeben. das ich dazu den zahlenwert der datums 38xxx verwende ist schon klar, nicht aber, wie mein diagramm diese werte „automatisch“ aus der jeweiligen messreihe übernimmt.

danke nochmal für die hilfe
paragliders