(solved) VBS - Index außerhalb des gültigen Bereichs

VooDooDog

Level-2
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich habe ein Problem mit einem Script, wo ich aktuell nicht weiter kommen.
Es soll eine CSV Datei ausgelesen und die Einträge gefiltert werden und als HTML Datei gespeichert werden.
Das Funktioniert soweit auch alles. Allerdings habe ichfolgenden Fehler:1719162306189.png

Der Code sieht wie folgt aus:

Code:
Sub VBFunktion_1()
'Tip:
' 1. Verwenden Sie die Tastenkombination <CTRL+SPACE> oder <CTRL+I>, um eine Liste aller Objekte und Funktionen zu öffnen
' 2. Schreiben Sie den Code unter Verwendung des HMI Runtime Objekts.
'  Beispiel: HmiRuntime.Screens("Screen_1").
' 3. Verwenden Sie die Tastenkombination <CTRL+J>, um eine Objektreferenz zu erstellen.
'Schreiben Sie den Code ab dieser Position:

Dim objFSO, objCSV, objoutHTML, wholeLine, mArray, blnFirstRow
Dim arrHeader, arrData
Dim strHeaderLine, strHeader, strDataLine,strMonth, strYear, strFilterYear
Const ForReading = 1
Const ForWriting = 2

strFilterYear = SmartTags("Archiv_Jahr")

' Die CSV-Datei öffnen
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objCSV = objFSO.OpenTextFile("C:\Storage Card SD\Logs\test.csv", ForReading) ' Eingabedatei
Set objoutHTML = objFSO.CreateTextFile("C:\Storage Card SD\Logs\test.html", ForWriting) ' Ausgabedatei

If Err.Number <> 0 Then
    ShowSystemAlarm "Error #" & CStr(Err.Number) & "" & Err.Description
    Err.Clear
    Exit Sub
End If

' HTML-Header schreiben
objoutHTML.WriteLine "<!DOCTYPE html>"
objoutHTML.WriteLine "<html>"
objoutHTML.WriteLine "<head>"
objoutHTML.WriteLine "<title>Gefilterte Daten</title>"
objoutHTML.WriteLine "</head>"
objoutHTML.WriteLine "<body>"
objoutHTML.WriteLine "<table>"

objCSV.SkipLine 'Header überspringen

' Die Datensätze lesen und nach Datum filtern
Do Until objCSV.AtEndOfStream
    ' Datensatz lesen
    strDataLine = objCSV.ReadLine
    arrData = Split(strDataLine, ";")
  

    ' Datum aus dem Datensatz extrahieren
    strMonth = Mid(arrData(1),5,2)
    strYear = Mid(arrData(1),8,4)
  
    ' Monatszahl in Text umwandeln
    Select Case strMonth
        Case 01 strMonth = "Januar"
        Case 02 strMonth = "Februar"
        Case 03 strMonth = "März"
        Case 04    strMonth = "April"
        Case 05    strMonth = "Mai"
        Case 06    strMonth = "Juni"
        Case 07    strMonth = "Juli"
        Case 08    strMonth = "August"
        Case 09    strMonth = "September"
        Case 10    strMonth = "Oktober"
        Case 11    strMonth = "November"
        Case 12    strMonth = "Dezember"
    End Select
  
    ' Datensatz filtern
        If strYear = SmartTags("Archiv_Jahr") Then         
            objoutHTML.WriteLine arrData(1)&" <tr><td>"& strMonth & " - "& arrData(2) &"Kg</td></tr>"
        End If
Loop

' Tabellenende und HTML-Footer schreiben
objoutHTML.WriteLine "</table>"
objoutHTML.WriteLine "</body>"
objoutHTML.WriteLine "</html>"

' Die Dateien schließen
objCSV.Close
objoutHTML.Close

End Sub

Zeile 47 lautet: strMonth = Mid(arrData(1),5,2)

Die CSV:
Code:
"VarName";"TimeString";"VarValue";"Validity";"Time_ms"
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.01.2024 14:45:35";123;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.02.2024 14:45:35";239;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.03.2024 14:45:35";100;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.04.2024 14:45:35";110;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.05.2024 14:45:35";111;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.06.2024 14:45:35";124;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.07.2024 14:45:35";184;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.08.2024 14:45:35";210;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.09.2024 14:45:35";198;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.10.2024 14:45:35";178;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.11.2024 14:45:35";168;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.12.2024 14:45:35";159;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.01.2025 14:45:35";163;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.02.2025 14:45:35";198;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.03.2025 14:45:35";189;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.04.2025 14:45:35";160;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.05.2025 14:45:35";170;1;45464614985,7523
"Anlage_iDB_Transport_Summe Monat_Archiv";"21.06.2025 14:45:35";159;1;45464614985,7523

Der Header wird Ordnungsgemäß übersprungen, sodass in arrData(1) auch 21.01.2024 14:45:35 steht. Das String zerlegen für Monat und Jahr funktioniert auch alles super. Nur weiß ich gerade nicht wo die Fehlermeldung herkommt.

Der HTML Tabellenbereich ist noch nicht fertig, dass ergänze ich noch.

Vielleicht sieht ja einer von euch auf Anhieb den Fehler.

Danke und schönen Sonntag noch :)
 
Ich nehme mal an, dass dein Loop als letzte Zeile einen Leerstring erfasst und in dem kann der Split-Befehl kein Semikolon finden - also gibt es auch kein Array als Rückgabewert ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm ok, das könnte sein.
Wie umgeht man das am besten?
Spontan würde mir nur einfallen, alle Zeilen einmal zu zählen und die schleife damit begrenzen. Oder fällt dir dazu etwas anderes ein?
 
Du könntest abfragen ob du einen Leerstring eingelesen hast oder ob der String überhaupt ein Semikolen beinhaltet (InStr) ... (bevor du etwas weiteres damit anstellst).
 
Stimmt, dass ist eleganter als bei jedem Aufruf erst einmal alle Zeilen zu zählen.
Danke das probiere ich morgen gleich mal aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie umgeht man das am besten?
Der Klassiker. Vor dem Split prüfen, oder der String nicht leer ist und nach dem Split mit UBound prüfen, ob genug Trennzeichen enthalten waren.
Vor und nach dem Split() lauern die nächsten Fallen:
- Split() darf nicht mit einer leeren Zeile aufgerufen werden ( If data = "" Then 'Sonderbehandlung leere Zeile )
- nach dem Split() muß mit If UBound(splitdata) >= 11 Then geprüft werden, ob auch mindestens (oder exakt) 12 Werte in der Zeile enthalten waren, bevor auf splitdata(n) zugegriffen wird
- je nach Datentyp der SmartTags("...") kann es auch Probleme geben, wenn der zugehörige Wert in der Zeile fehlt, also mehrere Semikolon aufeinanderfolgen
 
Also quasi so angewendet?!

Code:
strDataLine = objCSV.ReadLine

If Len(strDataLine) <> 0 Then
  arrData = Split(strDataLine, ";")
  If UBound(arrData) >= 3 Then 

    .... schreibe die Werte in die HTML Datei

  End If
End If
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also quasi so angewendet?!

Code:
strDataLine = objCSV.ReadLine

If Len(strDataLine) <> 0 Then
  arrData = Split(strDataLine, ";")
  If UBound(arrData) >= 3 Then

    .... schreibe die Werte in die HTML Datei

  End If
End If
Ich würde das so formulieren:
Code:
strDataLine = objCSV.ReadLine

If strDataLine <> "" Then
  arrData = Split(strDataLine, ";")
  If UBound(arrData) >= 4 Then

    .... schreibe die Werte in die HTML Datei

  End If
End If
 
Zurück
Oben