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

Code hängt auf einmal ??

Code hängt auf einmal ?
27.09.2012 17:18:47
Johannes
Hallo zusammen,
der folgende Code liest die Messwertedateien als *.csv ohne sie explizit zu öffnen. Bisher funktioniert das auch ohne Probleme. Seit heute bleibt der Code immer in Zeile 57 hängen: If IsNumeric(arrDaten(intJ)) Then
Fehlermeldung "Laufzeitfehler 9 Index außerhalb des gültigen Bereichs"
Zusätzlich hätte ich gerne wenn als letzte Information noch der Name der *.csv Datei ganz hinten angehängt werden könnte.
Ich stehe aber "wie Ochs vorm Berg" und bitte um Eure Hilfe. Schon jetzt recht herzlichen Dank dafür.
Ein der *.csv Dateien mls *.xls mit den "Ergebnissen auf Blatt zwei habe ich hochgeladen:
https://www.herber.de/bbs/user/81920.xls
Hier der Code:

Sub Rohdaten_einlesen()
Dim arrRoh, Zeile As Long
Dim arrDaten, intI As Integer, intJ As Integer, Spalte As Long
Dim sFile As String, wksAusw As Worksheet
Const sPfad As String = "C:\Daten Müller\epl MP\Rohdaten\"
Const sPfad2 As String = "C:\Daten Müller\epl MP\Archiv\"
Const sDelim As String = ";"
Application.ScreenUpdating = False
'Auswertedatei öffnen
'Set wksAusw = Workbooks.Open("C:\Daten Müller\epl MP\Auswertung Rohdaten MP epl neu.xls").   _
_
_
Sheets(Rohdaten)
Set wksAusw = Workbooks.Open("C:\Daten Müller\epl MP\Auswertung Rohdaten MP epl neu.xls"). _
Sheets(2)
With wksAusw
If .Cells(.Rows.Count - 1, 1)  "" Then
MsgBox "Auswertung ist voll!", vbCritical, "ACHTUNG"
GoTo Beenden
End If
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
sFile = Dir(sPfad & "*.csv")
Do While sFile  ""
With wksAusw
Zeile = Zeile + 1
If Zeile >= .Rows.Count Then
MsgBox "Auswertung ist voll!", vbCritical, "ACHTUNG"
Exit Do
End If
Open sPfad & sFile For Input As #1
arrRoh = Split(Input(LOF(1), 1), vbLf)
Close #1
'Name sPfad & sFile As sPfad2 & sFile & "_x" 'als verarbeitet kennzeichnen
'stattdessen gründlich löschen
Kill sPfad & sFile
For intI = 0 To UBound(arrRoh)
arrDaten = Split(arrRoh(intI), sDelim)
Select Case intI
Case 0 'Datum und Zeit
Spalte = 1
.Cells(Zeile, Spalte).Value = CDbl(CDate(arrDaten(0)))
Spalte = 2
.Cells(Zeile, Spalte).Value = CDbl(CDate(arrDaten(1)))
Case 1 To 10 ' Kopfdaten 1 bis 10
Spalte = intI + 2
.Cells(Zeile, Spalte).Value = arrDaten(1)
Case 11
'do nothing
Case 12 To 28 'Wert 1 bis 17
For intJ = 1 To 3 ' Ist, Soll und Toleranz
Spalte = 13 + (intJ - 1) * 17 + (intI - 12)
If IsNumeric(arrDaten(intJ)) Then
.Cells(Zeile, Spalte).Value = CDbl(arrDaten(intJ))
Else
If Right(arrDaten(intJ), 1) = "%" Then
If IsNumeric(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) Then
.Cells(Zeile, Spalte).Value = _
CDbl(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) / 100
Else
.Cells(Zeile, Spalte).Value = arrDaten(intJ)
End If
Else
.Cells(Zeile, Spalte).Value = arrDaten(intJ)
End If
End If
Next intJ
End Select
Next
End With
Erase arrDaten, arrRoh
sFile = Dir
Loop
Beenden:
Application.ScreenUpdating = True
wksAusw.Parent.Save
Set wksAusw = Nothing
Sheets("Rohdaten").Select
End Sub

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Index ok?
27.09.2012 17:45:34
Erich
Hi Johannes,
vermutlich hat arrRoh(intI) nicht den erwarteten Inhalt, denn daraus entsteht per Split arrDaten,
und arrDaten(3) gibt es wohl nicht, kann also nicht mit isnumeric() geprüft werden.
Schreib mal über die Zeile
If IsNumeric(arrDaten(intJ)) Then
die Zeilen
MsgBox "Ubound: " & Ubound(arrDaten)
MsgBox intJ & ": " & arrDaten(intJ)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Index ok?
27.09.2012 18:04:33
Johannes
Hallo Erich,
Ubound: 3
1: 180,84
Ubound: 3
2: 180,00
Ubound: 3
3: ±4,00
Es kommen also Istwert, dann Sollwert, dann Toleranz
Dann folgen die Werte der Mittelwerte. Wenn dann die msgBoxen durchgeclickt werden bleibt der Code an der alten Stelle hängen
Ich hoffe das dies für Deine Analyse hilfreich ist.
Gruß
Johannes

Anzeige
AW: Code hängt auf einmal ?
27.09.2012 17:55:37
Erich
Hi Johannes,
es könnte reichen, wenn du statt
For intJ = 1 To 3 ' Ist, Soll und Toleranz
schreibst
For intJ = 1 To UBound(arrDaten) + 1 ' Ist, Soll und evtl. Toleranz
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Code hängt auf einmal ?
27.09.2012 18:09:24
Johannes
Hallo Erich,
For intJ = 1 To UBound(arrDaten) + 1 ' Ist, Soll und evtl. Toleranz
die Angaben der Toleranz ist wichtig mitzuführen, da es unserem Kunden schon mal beliebt eben diese über Fernwartung "anzupassen". Da es sich qualitätsrelevante Daten handelt, kann ich auf diese Werte nicht verzichten, probiere aber mal aus was hier dann passiert. Melde mich dann wieder.
Gruß
Johannes

Anzeige
AW: Code hängt auf einmal ?
27.09.2012 18:39:26
Johannes
Hallo Erich,
das war's leider nicht - der Code bleibt an der alten Stelle hängen.
Gruß
Johannes

weiterer Versuch
27.09.2012 19:58:54
Erich
Hi Johannes,
bei mir läuft - wenn ich das Blatt text.csv als csv-Datei speichere - der Code damit fehlerfrei durch.
Bitte öffne doch mal, wenn der Fehler auftritt, im VBA-Editor, das Lokal-Fenster (im Menü Ansicht).
Dann wird auch arrDaten mit einem Plus davor angezeigt. Wenn du auf das Plus klickst, siehst du,
wie viele und welche Werte arrDaten hat. Es müssten 4 sein: arrDaten(0) bis arrDaten(3).
Ich vermute, im Fehlerfall gibt es zumindest arrDaten(3) nicht.
Dann schau dir die Datenzeile mal genau an. Sind genug Trennzeichen in der Zeile vorhanden?
Was du auch noch machen könntest: Hier eine CSV-Datei (nicht als xls) hochladen, bei der der Fehler auftritt.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: weiterer Versuch
27.09.2012 20:52:21
Johannes
Hallo Erich,
stimmt, es fehlt arrDaten(3) bei der "3.harmonischen Schwingung" In den Messdatendateien sind die beiden Kriterien nicht mit einer Toleranz belegt. Daher fehlt hier ein Wert in der *.csv.
Offenbar ist hier ein "Leerzeichen" oder ein anderes Zeichen bei der Überarbeitung der Ausgabe der Messdaten im *.csv Format weggefallen. Die Programmierung des Messrechners ist über LabView gemacht und darauf kann ich nicht zugreifen.
Es wäre für mich nun wichtig bei den beiden letzten Werten ebenfalls die Daten zu bekommen.
Was hälst Du davon die Zeile
Case 12 To 28 'Wert 1 bis 17
in Case 12 To 26 'Wert 1 bis 15
zu ändern und einen neuen Abschnitt Case 27 to 28 'Wert 16 bis 17 anzufügen in dem
dann For intJ = 1 To 3 ' Ist, Soll und Toleranz
in For intJ = 1 To 2 ' Ist, Soll und Toleranz geändert wird, den Rest hoffe kann ich lassen, oder ?
Meinst Du geht das ?
Gruß
Johannes

Anzeige
Abkürzung
28.09.2012 01:04:57
Erich
Hi Johannes,
ja, das sollte funktionieren.
Allerdings:
Case 26 to 29
und
Case 27 to 28
unterscheiden sich im Folgecode nur durch das Schleifenende 3 oder 2, der restliche Code wäre identisch.
Du kannst dir diese Doppel-Codierung ersparen, wenn du das Schleifenende ausrechnen lässt:
Case 12 To 28 'Wert 1 bis 17
For intJ = 1 To 3 + (intI > 26) ' Ist, Soll und Toleranz
Für intI ≤ 26 ist (intI > 26) = 0 (False), also Schleifenende 3+0=3
Für intI > 26 ist (intI > 26) = -1 (True), also Schleifenende 3+(-1)=2
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Abkürzung
28.09.2012 14:18:05
Johannes
Hallo Erich,
ich habe den Code wie folgt geändert: nun läuft er zwar ohne Fehlermeldung durch - es kommt aber nichts in der Datei an :-(
Kannst Du hier mal drüber sehen - ich habe nämlich nicht so ganz verstanden, was Du in Deinem letzten Beitrag gemeint hast.
Danke
Gruß
Johannes
P.S. ich habe aktuell eine saumäßig schlechte Anbindung über UMTS und hoffe es geht später wieder etwas besser - ich bleibe dran.
'----------------------------------------------------------------------------------------------------
For intI = 0 To UBound(arrRoh)
arrDaten = Split(arrRoh(intI), sDelim)
Select Case intI
Case 0 'Datum und Zeit
Spalte = 1
.Cells(Zeile, Spalte).Value = CDbl(CDate(arrDaten(0)))
Spalte = 2
.Cells(Zeile, Spalte).Value = CDbl(CDate(arrDaten(1)))
Case 1 To 10 ' Kopfdaten 1 bis 10
Spalte = intI + 2
.Cells(Zeile, Spalte).Value = arrDaten(1)
Case 11
'do nothing
'----------------------------------------------------------------------------------------------------
Case 12 To 26 'Wert 1 bis 15
For intJ = 1 To 3 ' Ist, Soll und Toleranz
Spalte = 13 + (intJ - 1) * 17 + (intI - 12)
If IsNumeric(arrDaten(intJ)) Then
.Cells(Zeile, Spalte).Value = CDbl(arrDaten(intJ))
Else
If Right(arrDaten(intJ), 1) = "%" Then
If IsNumeric(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) Then
.Cells(Zeile, Spalte).Value = _
CDbl(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) / 100
Else
.Cells(Zeile, Spalte).Value = arrDaten(intJ)
End If
Else
.Cells(Zeile, Spalte).Value = arrDaten(intJ)
End If
End If
Next intJ
'----------------------------------------------------------------------------------------------------
Case 27 To 28 'Wert 16 bis 17
For intJ = 1 To 2 ' Ist, Soll OHNE Toleranz
Spalte = 13 + (intJ - 1) * 17 + (intI - 12)
If IsNumeric(arrDaten(intJ)) Then
.Cells(Zeile, Spalte).Value = CDbl(arrDaten(intJ))
Else
If Right(arrDaten(intJ), 1) = "%" Then
If IsNumeric(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) Then
.Cells(Zeile, Spalte).Value = _
CDbl(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) / 100
Else
.Cells(Zeile, Spalte).Value = arrDaten(intJ)
End If
Else
.Cells(Zeile, Spalte).Value = arrDaten(intJ)
End If
End If
Next intJ
'----------------------------------------------------------------------------------------------------
End Select
Next
End With
Erase arrDaten, arrRoh
sFile = Dir
Loop
Beenden:
Application.ScreenUpdating = True
wksAusw.Parent.Save
Set wksAusw = Nothing
Sheets("Rohdaten").Select
End Sub

Anzeige
Das hat er gemeint, ...
28.09.2012 18:21:23
Luc:-?
…Johannes:
…
With …
…
For …
…
Select Case intI
…
Case 12 To 28 'Wert 1 bis 17
For intJ = 1 To 3 + CInt(inI > 26) ' Ist, Soll (m/o Toleranz)
Spalte = 13 + (intJ - 1) * 17 + (intI - 12)
With .Cells(Zeile, Spalte)
If IsNumeric(arrDaten(intJ)) Then
.Value = CDbl(arrDaten(intJ))
ElseIf Right(arrDaten(intJ), 1) = "%" Then
If IsNumeric(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) Then
.Value = CDbl(Left(arrDaten(intJ), Len(arrDaten(intJ)) - 1)) / 100
Else: .Value = arrDaten(intJ)
End If
Else: .Value = arrDaten(intJ)
End If
End If
End With
Next intJ
…
End Select
Next
End With
…
Wenn du dein Pgm strukturieren würdest, hättest du bemerkt, dass ein End If fehlte. Dafür, das hier auch so darstellen zu können, ist das pre-Tag da. Steht doch deutlich Code drauf! Es macht keinen Spaß, sich durch so etwas Amorphes durchzuwursteln!
Gruß Luc :-?

Anzeige
Heut' hab' ich wohl meinen F-Tag! Natürlich ...
28.09.2012 22:24:35
Luc:-?
CInt(intI … !
SchöWE, auch für Erich, Luc :-?

AW: Abkürzung
28.09.2012 18:50:39
Erich
Hi Johannes,
Luc hat dir ja meine "Abkürzung" noch mal besser und deutlicher aufgeschrieben.
Aber auch mit deinem neuen Code läuft das Programm bei mir durch - und produziert dabei Ausgabedaten.
Es muss also etwas anderes falsch sein.
Mein Tipp:
Geh in den VBA-Editor in die Prozedur und drücke die Taste F8, dann läuft sie schrittweise durch
und du siehst, warum sie nicht bei einer Ausgane (.Cells(..) = ...) auskommt.
Noch eins: Du wolltest ja die Dateinamen am Ende der Zeiolen ausgeben. Dazu brauchst du nur
zwischen der Kill-Zeile und der Schleife
For intI = 0 To UBound(arrRoh)
die Zeile
.Cells(Zeile, 64).Value = sFile
einzufügen.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Herzlichen Dank an alle (owT)
30.09.2012 14:51:29
Johannes
.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige