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

Hüllkurve - Gefundene Werte säubern

Hüllkurve - Gefundene Werte säubern
10.06.2018 10:49:55
Norman
Hallo
mein Programm soll eine Hüllkurve bilden und durchsucht dafür zunächst
eine Matrix mit Wegwerten. Diesen ordnet es dann Kraftwerte aus einer zweiten Matrix zu.
Dabei sollen aber pro Graph, für einen Wegpunkt, lediglich Min und Max der Kraftwerte gespeichert werden.
Auch wenn für diesen Wegpunkt mehr Kraftwerte gefunden wurden.
Hierfür werden zunächst alle gefundenen Kraftwerte zwischengespeichert.
Danach sucht die Teilfunktion diese Werte auf min und max, speichert diese zwischen, löscht alle Werte und schreibt min und max wieder rein.
Teilfunktion:

' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - START ***
If treffer > 2 Then
' Min & Max Werte der Treffer ermitteln
'Workbooks(zDatei).Worksheets(ThisWorkbook).Sheets (10)
'Workbooks(zDatei).Sheets(10).Select
Workbooks(zDatei).Activate
With Application.WorksheetFunction
' Beispiel:                 Cells(j, Spaltenzaehler + 2).Value = Application. _
WorksheetFunction.Min(Range(Cells(j, 1), Cells(j, Spaltenzaehler)))
trefferMin = .Min(Range(Cells(j, trefferspalte1), Cells(j, (Spaltenzaehler + 1)) _
))
trefferMax = .Max(Range(Cells(j, trefferspalte1), Cells(j, (Spaltenzaehler + 1)) _
))
' alte Werte löschen
Range(Cells(j, trefferspalte1), Cells(j, Spaltenzaehler + 1)).ClearContents
' Min und Max Werte einfügen
Cells(j, trefferspalte1) = trefferMin
Cells(j, trefferspalte1 + 1) = trefferMax
End With
End If
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - ENDE ***

Normal dürften pro Graph nicht mehr als 2 Kraftwerte vorhanden sein.
Aus mir nicht nachvollziehbaren Gründen erscheinen aber ab und zu 3.
Woran könnte das liegen?
Zur besseren Veranschaulichung:
Userbild
Spalte 1 (blau) = Wegwerte
Spalte 2 & 3 (hellgrün) = Kraftwerte von Messkurve 1
Spalte 4 & 5 (grün) = Kraftwerte von Messkurve 2
Spalte 6 (rot) = Werte die nicht existieren dürften
Das Ganze passiert bei 2*2*19000 genau 6 mal.
Userbild
Wie hab ich da ne Chance den Fehler zu finden?
Irgendwelche Tipps
Gesamtcode:

Sub Datei_import()
' ###### Varibalen definieren & initialisieren - START ######
' --- Variablen für Programmablauf ---
Dim zDatei              As String   ' Zieldatei
Dim zPfad               As String   ' Zielpfad mit Datei
Dim zPfadH              As String   ' Zielpfad ohne Datei
Dim startzeile          As Long
startzeile = 5
Dim endzeile            As Long
Dim endspalte           As Integer
Dim plotanz             As Integer
Dim werteanz            As Integer
Dim Spaltenzaehler      As Integer
Dim treffer             As Integer
Dim trefferspalte1      As Integer
Dim trefferMin          As Double
Dim trefferMax          As Double
Dim TZersterTreffer     As Integer
Dim TZletzterTreffer    As Integer
Dim Suchfenster         As Integer
Dim ersterSuchwert      As Integer
Dim letzterSuchwert     As Integer
Dim i                   As Integer
Dim j                   As Integer
Dim k                   As Integer
Dim l                   As Integer
Dim H1                  As Double
' ### Varibalen initialisieren - START ###
Suchfenster = 1000
H1 = 0
' ### Varibalen initialisieren - ENDE ###
Application.ScreenUpdating = False
'=========================================================================================== _
_
' ###### Dateien laden und verknüpfen  - START ######
' #### Arbeitsdatei ####
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = "C:\VBA-Test\"             '!!! Pfad anpassen zu - ein Ordner ü  _
_
ber Zielordner
If .Show = -1 Then
zDateiH = .SelectedItems(1)
End If
End With
UserForm1.Show 0
UserForm1.Repaint
Set fso = CreateObject("Scripting.FileSystemObject")
oname = fso.getfilename(zPfadH)
' aktive Datei "Workbooks wird genau der Datei aus dem gebauten Pfad zugeordnet
Workbooks.Open zDateiH                  ' Zieldatei
zDatei = ActiveWorkbook.Name
' ###### Dateien laden und verknüpfen  - START ######
'=========================================================================================== _
_
' ###### Spalten und Zeilen zählen - START ######
endspalte = Workbooks(zDatei).Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
endzeile = Workbooks(zDatei).Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
plotanz = endspalte - 4
werteanz = endzeile - startzeile
' #### Datenreihen errechnen - Datensätze errechnen
' ###### Spalten und Zeilen zählen  - ENDE ######
For i = 1 To 19000
H1 = i
H1 = H1 / 1000
Workbooks(zDatei).Sheets(10).Cells(i, 5).Value = H1
Next
For i = 1 To werteanz                           ' --> Zählt die eingelesenen Plots
For j = 1 To 19000                          ' --> Zählt alle möglichen Wegwerte
treffer = 0
' ################################################################################## _
_
' ########### Erster Durchlauf pro Kurve - START ###########
If j = 1 Then
For k = startzeile To endzeile          ' --> Zählt die Messwerte durch
If Workbooks(zDatei).Sheets(7).Cells(k, i) = j / 1000 Then            ' ( _
Zeile, Spalte)
Spaltenzaehler = Workbooks(zDatei).Sheets(10).Cells(j, Columns.Count).  _
_
End(xlToLeft).Column
Workbooks(zDatei).Sheets(10).Cells(j, Spaltenzaehler + 1) = Workbooks(  _
_
zDatei).Sheets(9).Cells(k, i)
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 1 - START ***
' --> Mehrfachwerte der Messreihe werden abgefangen und nur Min und  _
_
Max Wert gespeichert
treffer = treffer + 1
If treffer = 1 Then
trefferspalte1 = Spaltenzaehler + 1
End If
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 1 - ENDE ***
' *** Trefferzeilen notieren - START ***
' --> Zeilenwerte der Treffer werden notiert.
' --> Ab dem zweiten j-Wert werden nicht mehr alle Wegwerte sondern
' --> nur noch ein Bereich um den Treffer geprüft
If treffer = 1 Then
TZersterTreffer = k
End If
If treffer > 1 Then
TZletzterTreffer = k
End If
' *** Trefferzeilen notieren - START ***
End If
Next
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - START ***
If treffer > 2 Then
' Min & Max Werte der Treffer ermitteln
'Workbooks(zDatei).Sheets(10).Select
With Application.WorksheetFunction
' Beispiel:                 Cells(j, Spaltenzaehler + 2).Value = _
_
Application.WorksheetFunction.Min(Range(Cells(j, 1), Cells(j, Spaltenzaehler)))
trefferMin = .Min(Range(Cells(j, trefferspalte1), Cells(j,  _
Spaltenzaehler)))
trefferMax = .Max(Range(Cells(j, trefferspalte1), Cells(j,  _
Spaltenzaehler)))
' alte Werte löschen
Range(Cells(j, trefferspalte1), Cells(j, Spaltenzaehler)). _
ClearContents
' Min und Max Werte einfügen
Cells(j, trefferspalte1) = trefferMin
Cells(j, trefferspalte1 + 1) = trefferMax
End With
End If
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - ENDE ***
End If
' ########### Erster Durchlauf pro Kurve - ENDE ###########
' ################################################################################## _
_
' ########### Voreinstellungen für Schleife Durchlauf2 - START ###########
ersterSuchwert = TZersterTreffer - Suchfenster
letzterSuchwert = TZletzterTreffer + Suchfenster
If j  endzeile Then
letzterSuchwert = endzeile
End If
' *** Maximum Ende bei "endzeile" - ENDE ***
' ########### Voreinstellungen für Schleife Durchlauf2 - ENDE ###########
' ########### Ab zweiter Durchlauf pro Kurve - START ###########
If j > 1 Then
' For k = startzeile To endzeile
For k = ersterSuchwert To letzterSuchwert          ' --> Zählt die  _
Messwerte durch
If Workbooks(zDatei).Sheets(7).Cells(k, i) = j / 1000 Then            ' ( _
_
Zeile, Spalte)
Spaltenzaehler = Workbooks(zDatei).Sheets(10).Cells(j, Columns.Count) _
_
.End(xlToLeft).Column
Workbooks(zDatei).Sheets(10).Cells(j, Spaltenzaehler + 1) =  _
Workbooks(zDatei).Sheets(9).Cells(k, i)
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 1 - START ***
' --> Mehrfachwerte der Messreihe werden abgefangen und nur Min   _
_
und Max Wert gespeichert
treffer = treffer + 1
If treffer = 1 Then
trefferspalte1 = Spaltenzaehler + 1
End If
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 1 - ENDE ***
' *** Trefferzeilen notieren - START ***
' --> Zeilenwerte der Treffer werden notiert.
' --> Ab dem zweiten j-Wert werden nicht mehr alle Wegwerte  _
sondern
' --> nur noch ein Bereich um den Treffer geprüft
If treffer = 1 Then
TZersterTreffer = k
End If
If treffer > 1 Then
If TZletzterTreffer  2 Then
' Min & Max Werte der Treffer ermitteln
'Workbooks(zDatei).Worksheets(ThisWorkbook).Sheets (10)
'Workbooks(zDatei).Sheets(10).Select
Workbooks(zDatei).Activate
With Application.WorksheetFunction
' Beispiel:                 Cells(j, Spaltenzaehler + 2).Value = _
_
Application.WorksheetFunction.Min(Range(Cells(j, 1), Cells(j, Spaltenzaehler)))
trefferMin = .Min(Range(Cells(j, trefferspalte1), Cells(j, ( _
Spaltenzaehler + 1))))
trefferMax = .Max(Range(Cells(j, trefferspalte1), Cells(j, ( _
Spaltenzaehler + 1))))
' alte Werte löschen
Range(Cells(j, trefferspalte1), Cells(j, Spaltenzaehler + 1)).  _
_
ClearContents
' Min und Max Werte einfügen
Cells(j, trefferspalte1) = trefferMin
Cells(j, trefferspalte1 + 1) = trefferMax
End With
End If
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - ENDE ***
' *** Spaltenzähler für nächste Messreihe positionieren - START ***
If treffer = 1 Then
Spaltenzaehler = trefferspalte1 + 1
ElseIf treffer > 1 Then
Spaltenzaehler = trefferspalte1 + 2
End If
' *** Spaltenzähler für nächste Messreihe positionieren - ENDE ***
End If
' ########### Ab zweiter Durchlauf pro Kurve - ENDE ###########
' ################################################################################## _
_
Next
Next
Unload UserForm1
Application.ScreenUpdating = True
MsgBox "Datenimport und -aufbereitung fertig!"
End Sub

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Hüllkurve - Gefundene Werte säubern
10.06.2018 13:25:23
Barbaraa
Hi Norman,
im Code steht: "'!!! Pfad anpassen zu - ein Ordner über Zielordner"
Du hast nichts von oder über einen Zielordner geschrieben.
Und was bedeutet "zDateiH = .SelectedItems(1)"
Wie soll man da draufkommen. Man kann das Makro nicht mal schrittweise laufen lassen.
Braucht man dazu die angegebenen Tabellenwerte?
Ich werde sie mal eintippen und hier für Euch hochladen. Wird aber ein paar Tage dauern.
Noch ein Tipp am Rande:
Wenn Du Deine Angaben auf das Wesentliche beschränkst, ist es einfacher, Deinen Fehler zu finden.
Also vom Makro die nicht wichtigen Sachen rauslöschen und dabei das Fehlerverhalten beobachten.
Die Erfahrung sagt mir, dass man beim Erstellen der Fehlerbeschreibung diesen meist selbst entdeckt.
Übrigens:
Bei Dir ist zDateiH nicht deklariert.
LGB
Anzeige
AW: Hüllkurve - Gefundene Werte säubern
10.06.2018 15:19:33
Norman
Hallo Barbara,
ehrlich gesagt, dachte ich, dass ich wieder nen popligen Anfängerfehler gemacht habe,
der in dieser kleinen Teilfunktion steckt. Wohl doch nicht :-/
Zu deiner Antwort:
ja das Makro öffnet eine Datei, die es dann bearbeit.
im Code steht: "'!!! Pfad anpassen zu - ein Ordner über Zielordner"
Du hast nichts von oder über einen Zielordner geschrieben. 
--> Der Codeschnippsel war alt- sry dafür. Ich hab immer das vorherige Programm kopiert und dann modifiziert. Das Ursprungsprogramm hat einen Quellordner mit mehreren Dateien und einen Zielordner mit einer Datei verwendet. Der Schnippsel ist zum öffnen des Quellordners, allerdings hier ohne funktion.
Wie soll man da draufkommen. Man kann das Makro nicht mal schrittweise laufen lassen.
Braucht man dazu die angegebenen Tabellenwerte? 
ja man muss die Datei mit den Tabellenwerten öffnen.
Ich hab das Makro und die zu bearbeitende Datei mal in eine Dropbox geladen.
Aber Vorsicht, im Moment rennt es ohne Stopps ca. 30 Minuten, deswegen Breakpoints setzten
https://www.dropbox.com/sh/y8iqvjyn4hc6ae4/AADhlPtAmYavyHfeumh9cjKMa?dl=0

Noch ein Tipp am Rande:
Wenn Du Deine Angaben auf das Wesentliche beschränkst, ist es einfacher, Deinen Fehler zu  _
finden.
Also vom Makro die nicht wichtigen Sachen rauslöschen und dabei das Fehlerverhalten beobachten.  _
Die Erfahrung sagt mir, dass man beim Erstellen der Fehlerbeschreibung diesen meist selbst entdeckt.

--> Da der Fehler so selten auftritt. In wahrscheinlich über 90% der Fälle für es das "Cleanen" sauber aus. Bin ich mir nicht sicher was von dem Makro weglassen könnte. Den relevanten Bereich "Cleanen" hab ich extra in nen Einzelquote gesetzt.
Ich hätte aber wirklich einfach die Dateien gleich hochladen sollen...
sry dafür
Übrigens:
Bei Dir ist zDateiH nicht deklariert. 
Ganz oben als aller Erstes?!
        Dim zDatei              As String   ' Zieldatei

oder was meinst du?
Anzeige
AW: Hüllkurve - Gefundene Werte säubern
11.06.2018 06:34:00
fcs
Hallo Norman,
ich hab mich auch einmal mit deinem Makro beschäfftigt und mir auch eine kleine Test-Datei mit ein paar Daten gebastelt.
Der Hauptfehler besteht darin, wie du den Wert der Variablen trefferspalte1 in den Schleifen setzt.
Dies ist ja die 1. Spalte in die die dieWerte einer Messreihe eingetragen werden sollen.
Bei deiner Methode wird immer die 1. freie Spalte zu einem Wegpunkt als trefferspalte1 ermittelt.
Fehlen zu einer Messreihe Werte zu einem Wegepunkt, dann werden Werte aus einer nachfolgenden Messsreihe ggf. in die eine falsche Messreihe eingetragen.
Der Startwert von trefferspalte1 muss vor der Schleife für die Messwertreihen auf 6 gesetzt werden und innerhalb der Schleife dann am Ende jeweils um 2 erhöht werden.
Nach der Berechnung der Spalte (Spaltenzaehler) für den nächsten Eintrag in Blatt 10 muss zusätzlich geprüft werden, ob der Wert kleiner als trefferspalte1 ist und entsprechend gesetzt werden.
Um mir einen besseren Überblick zu verschaffen hab ich die im Makro angesprochenen Tabellenblätter entsprechenden Variablen zugeordnet.
Ein paar Sekunden Makrolaufzeit hab ich schon herausgeholt, indem die Wegpunkte im Blatt 10 anders eingetragen werden.
Die lange Laufzeit resultiert ja aus der riesigen Anzahl an Zugriffen auf Zellen in den Tabellenblättern.
Hier kann man die Ausführung wahrscheinlich sehr beschleunigen, indem man die Daten zu einer Messreihe in den Blättern 7 und 9 immer jeweils in ein Datenarray lädt und dann in den Schleifen die Arrays verwendet statt der Zellen in den Tabellenblättern.
Textdatei mit agepasstem Code
https://www.herber.de/bbs/user/122039.txt
Gruß
Franz
Anzeige
AW: Hüllkurve - Gefundene Werte säubern
11.06.2018 12:57:39
Norman
Hallo Barbara, Hallo Franz
ich hab gestern ebenfalls nochmal den ganzen Tag an dem Programm gearbeitet.
Der Fehler mit Min, Max konnte ich beheben. Er hat schlicht das Tabellenblatt nicht mehr gefunden.
Hier der geänderte Code an dieser Stelle:

' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - START ***
If treffer > 2 Then
Workbooks(zDatei).Activate
With Application.WorksheetFunction
trefferMin = .Min(Sheets(10).Range(Sheets(10).Cells(j, trefferspalte1), Sheets(10).Cells(j, ( _
Spaltenzaehler))))
trefferMax = .Max(Sheets(10).Range(Sheets(10).Cells(j, trefferspalte1), Sheets(10).Cells(j, ( _
Spaltenzaehler))))
' alte Werte löschen
Sheets(10).Range(Sheets(10).Cells(j, trefferspalte1), Sheets(10).Cells(j, Spaltenzaehler)). _
ClearContents
' Min und Max Werte einfügen
Sheets(10).Cells(j, trefferspalte1) = trefferMin
Sheets(10).Cells(j, trefferspalte1 + 1) = trefferMax
End With
End If
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - ENDE ***

Das "with" setzt vor jede Funktion noch das "Application.WorksheetFunction".
Hinter der Funktion wird aber immer der Bereich bzw. die Zellen geschrieben, auf die diese angewendet wird.
Kann ich den Code mit einem zweiten With versehen, dass die Datei und das Tabellenblatt genauer beziffert?
--> Wenn ich einfach ne zweite "With" schleife in die Erste setze, würde Dateiname+Blattname auch vor der Funktion stehen.
Hier mal das aktuelle Programm (ohne die Anmerkungen von Franz):
https://www.herber.de/bbs/user/122044.txt
@Franz:
Ich schaue mir jetzt deinen Code an und versuche die angemerkten Sachen umzusetzen. Melde mich später hier nochmal,
Anzeige
AW: Hüllkurve - Gefundene Werte säubern
12.06.2018 07:55:15
fcs
Hallo Norman,
Zwischen With XXX ... und dem zugehörigen End With beziehen sich alle mit . beginnenden Methoden und Eigenschaften auf das Object XXX.
Generell muss man sich entscheiden welches Objekt einem im Code am meisten Übersichtlichkeit verschafft/Wiederholungen erspart wenn man es im With-Konstrukt als Object verwendet.
Mit Deklaration einer geeigneten Objekt-Variablen kann man oft den Code zusätzlich einkürzen, wenn innerhalb eines With-Konstrukts noch andere Objekte angesprochen werden müssen.
In deinem Fall kann man für Application.Worksheetfunctions eine Variable setzen und das Tabellenblatt als With-Objekt verwenden.
    'Variablendeklaration
Dim objWsf As WorksheetFunction
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - START ***
If treffer > 2 Then
With Workbooks(zDatei).Sheets(10)
trefferMin = objWsf.Min(.Range(.Cells(j, trefferspalte1), _
.Cells(j, (Spaltenzaehler))))
trefferMax = objWsf.Max(.Range(.Cells(j, trefferspalte1), _
.Cells(j, (Spaltenzaehler))))
' alte Werte löschen
.Range(.Cells(j, trefferspalte1), .Cells(j, Spaltenzaehler)).ClearContents
' Min und Max Werte einfügen
.Cells(j, trefferspalte1) = trefferMin
.Cells(j, trefferspalte1 + 1) = trefferMax
End With
End If
' *** Mehrfachwerte pro Messreihe  abfangen - Teil 2 - ENDE ***
Gruß
Franz
Anzeige
Funktioniert bis Graph 7
12.06.2018 16:17:56
Norman
Hallo Franz,
ok, dann muss man abwägen, was man abkürzen will.
Das Skript funktioniert jetzt bis zum siebten Graph. Für die Graphen 8,9 & 10 hat die Suchfunktionen keine Werte ausgespuckt. Ich finde aber leider den Grund dafür nicht.
Da er dort keine Werte findet, füllt die Interpolieren-Funktion das mit 0 bzw. kleinen Werten. Die untere Hüllkurve stimmt dadurch später nicht.
Irgendeine Idee woher das kommen könnte?
Hier der Code:
https://www.herber.de/bbs/user/122063.txt
Bild mit falscher unterer Hüllkurve:
Userbild
Vielen Dank schon mal!
Anzeige
AW: Funktioniert bis Graph 7
13.06.2018 06:38:31
fcs
Hallo Norman,
wird in der Zeile
        plotanz = endspalte - 4
die Anzahl der Plots richtig berechnet?
Gruß
Franz

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige