Auswertung CSV in Excel

emilio20

Level-1
Beiträge
835
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
ich schreibe mit Wicc Flexible Energiewerte in verschiednen CSV Dateien.
Dies Importiere ich beim Start einer Exel Tabelle in einselne Tabellen.

Der Pfad von dem ich die CSV Daten erhalte habe ich in einem Macro hinterlegt. Ich möchte aber den Pfad in einer Excel "Einstellungen" Tabelle ablegen und diesen ggf zu ändern.
Leider bin ich in VB Anfänger und komme hier nicht weiter. Ich Poste mal mein Macro.
Code:
Private Sub Workbook_Open()

Dim Dummy() As String


 
'zuerst die Datei "Stromo.csv" einlesen.
Datei = FreeFile
Open "C:\Energieverbrauch_Haus\Strom0.csv" For Input As #Datei
zeile = 2

Do
    Line Input #Datei, ReadLine
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")
     '   Cells(zeile, 1) = Dummy(0)
       Tabelle1.Cells(zeile, 2) = Dummy(1)
       Tabelle1.Cells(zeile, 3) = Dummy(2)
      '  Cells(zeile, 4) = Dummy(3)
       ' Cells(zeile, 5) = Dummy(4)
        
        zeile = zeile + 1
    End If
Loop Until EOF(Datei)
 
Close


 
'dann die Datei "Heizung0.csv" einlesen.
Datei = FreeFile
Open "C:\Energieverbrauch_Haus\Heizung0.csv" For Input As #Datei
zeile = 2
Do
    Line Input #Datei, ReadLine
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")
     '   Cells(zeile, 1) = Dummy(0)
        Tabelle2.Cells(zeile, 2) = Dummy(1)
        Tabelle2.Cells(zeile, 3) = Dummy(2)
      '  Cells(zeile, 4) = Dummy(3)
       ' Cells(zeile, 5) = Dummy(4)
        
        zeile = zeile + 1
    End If
Loop Until EOF(Datei)
 
Close


 
'dann die Datei "Wasser.csv" einlesen.
Datei = FreeFile
Open "C:\Energieverbrauch_Haus\Wasser0.csv" For Input As #Datei
zeile = 2
Do
    Line Input #Datei, ReadLine
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")
     '   Cells(zeile, 1) = Dummy(0)
        Tabelle3.Cells(zeile, 2) = Dummy(1)
        Tabelle3.Cells(zeile, 3) = Dummy(2)
      '  Cells(zeile, 4) = Dummy(3)
       ' Cells(zeile, 5) = Dummy(4)
        
        zeile = zeile + 1
    End If
Loop Until EOF(Datei)
 
Close




End Sub
 

Anhänge

  • Excel Tabelle.JPG
    Excel Tabelle.JPG
    52,9 KB · Aufrufe: 40
Man kann Zellen genauso auslesen wie beschreiben.
Wenn Du auf dem Tabellenblatt "Einstellungen" in der Zelle B1 den Dateiname stehen hast, dann kannst Du den Zelleninhalt (den Dateiname) so auslesen:

csvDatei = Worksheets("Einstellungen").Cells(1, 2)
oder
csvDatei = Worksheets("Einstellungen").Range("B1")

csvDatei enthält danach den Dateiname aus B1, z.B. "C:\Energieverbrauch_Haus\Strom0.csv"

Man kann auch der Zelle einen Name geben, dann können später Spalten oder Zeilen davor eingefügt oder gelöscht werden, wodurch sich die Zelle verschiebt, doch der Code funktioniert trotzdem, z.B. Zelle B1 hat den Name "Settings_Dateiname_Strom":

csvDatei = Worksheets("Einstellungen").Range("Settings_Dateiname_Strom")

Auf Deinen Code angewandt:
Code:
Dim Dummy() As String, csvDatei

[COLOR="#008000"]'zuerst die Datei "Stromo.csv" einlesen.[/COLOR]
Datei = FreeFile
csvDatei = Worksheets("Einstellungen").Range("B1")
Open csvDatei For Input As #Datei   [COLOR="#008000"]'öffnet "C:\Energieverbrauch_Haus\Strom0.csv"[/COLOR]

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank Harald,
ich werde es gleich mal versuchen.
Mit VB habe ich mich noch nicht so beschäftigt.

Ich müsste noch beim einlesen der CVS nach Leerzeichen suchen . Jetzt suche ich ja nur nach ";".

Ich möchte nämlich das Datum und die Uhrzeit in einselnen Zellen haben.



Wenn du mal Zeit hast kannst du mal den Code erklären ?

Code:
Datei = FreeFile           ?????
Open "C:\Energieverbrauch_Haus\Strom0.csv" For Input As #Datei
zeile = 2

Do
    Line Input #Datei, ReadLine      ????
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")     ?????
     '   Cells(zeile, 1) = Dummy(0)
       Tabelle1.Cells(zeile, 2) = Dummy(1)
       Tabelle1.Cells(zeile, 3) = Dummy(2)
      '  Cells(zeile, 4) = Dummy(3)
       ' Cells(zeile, 5) = Dummy(4)
        
        zeile = zeile + 1
    End If
Loop Until EOF(Datei)   ????
 
Close
 
Zuletzt bearbeitet:
Hallo Harald,
es geht irgentwie nicht. Es kommt der Fehler Laufzeitfehler Datenname oder nummer falsch

Ich habe mal die Ganzen Dateien angehängt

Code:
Sub CSVLaden()


Dim Dummy() As String, csvDatei

 
'zuerst die Datei "Stromo.csv" einlesen.
Datei = FreeFile
csvDatei = Worksheets("Einstellungen").Range("Settings_Dateiname_Strom")
Open csvDatei For Input As #Datei   'öffnet "C:\Energieverbrauch_Haus\Strom0.csv"
zeile = 2

Do
    Line Input #Datei, ReadLine
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")
        
     '   Cells(zeile, 1) = Dummy(0)
       Tabelle1.Cells(zeile, 2) = Dummy(0)
       Tabelle1.Cells(zeile, 3) = Dummy(0)
      '  Cells(zeile, 4) = Dummy(3)
       ' Cells(zeile, 5) = Dummy(4)
        
        zeile = zeile + 1
    End If
Loop Until EOF(Datei)
 
Close


 
'dann die Datei "Heizung0.csv" einlesen.
Datei = FreeFile
csvDatei = Worksheets("Einstellungen").Range("Settings_Dateiname_Heizung")
Open csvDatei For Input As #Datei   'öffnet "C:\Energieverbrauch_Haus\Heizung0.csv"
zeile = 2
Do
    Line Input #Datei, ReadLine
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")
     '   Cells(zeile, 1) = Dummy(0)
        Tabelle2.Cells(zeile, 2) = Dummy(1)
        Tabelle2.Cells(zeile, 3) = Dummy(2)
      '  Cells(zeile, 4) = Dummy(3)
       ' Cells(zeile, 5) = Dummy(4)
        
        zeile = zeile + 1
    End If
Loop Until EOF(Datei)
 
Close


 
'dann die Datei "Wasser.csv" einlesen.
Datei = FreeFile
csvDatei = Worksheets("Einstellungen").Range("Settings_Dateiname_Wasser")
Open csvDatei For Input As #Datei   'öffnet "C:\Energieverbrauch_Haus\Wasser0.csv"
zeile = 2
Do
    Line Input #Datei, ReadLine
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")
     '   Cells(zeile, 1) = Dummy(0)
        Tabelle3.Cells(zeile, 2) = Dummy(1)
        Tabelle3.Cells(zeile, 3) = Dummy(2)
      '  Cells(zeile, 4) = Dummy(3)
       ' Cells(zeile, 5) = Dummy(4)
        
        zeile = zeile + 1
    End If
Loop Until EOF(Datei)
 
Close




End Sub
 

Anhänge

  • Einstellungen.JPG
    Einstellungen.JPG
    51,6 KB · Aufrufe: 27
  • Datenname falsch.JPG
    Datenname falsch.JPG
    126 KB · Aufrufe: 28
  • Auswertung Strom.zip
    22,6 KB · Aufrufe: 10
Zuletzt bearbeitet:
Lasse die doppelten Hochkomma " (Anführungszeichen) vor und hinter dem Dateiname in den Zellen C3, C4, C5 im Blatt "Einstellungen" weg.

Außerdem empfiehlt es sich, diese Zellen als "Text" zu formatieren (Formatzeichen: @) oder schreibe ein einzelnes Hochkomma ' davor, damit Excel auf keinen Fall irgendwas automatisch kaputtformatiert. (das Hochkomma ' auf der #-Taste benutzen)

Also so:
Code:
Falsch:
"C:\Energieverbrauch_Haus\Strom0.csv"

Richtig:
C:\Energieverbrauch_Haus\Strom0.csv
oder
'C:\Energieverbrauch_Haus\Strom0.csv

PS: wenn das Makro angehalten ist (bei Einzelschritt oder vom Debugger bei Runtime-Error), dann kannst Du den Mauszeiger auf Variablennamen in dem VBA-Code halten und es wird in einem Tooltip der Wert der Variable angezeigt.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Beispiel: csv-Datei in Excel einlesen

Bilder und Programmcode sagen mehr als tausend Worte. Deshalb hier mal ein komplettes funktionierendes Beispiel für einen csv-Import in Excel.

Ich mußte mal ein nicht gut funktionierendes Regelprogramm einer S7 untersuchen. Dazu habe ich die S7 jede Sekunde Daten in DB aufzeichnen lassen (als Ringpuffer), dann diese Daten mit einem Excel-Makro in csv-Dateien exportiert und ein kleines Anzeigediagramm inkl. Import der csv-Dateien in Excel erstellt.

Die csv-Datei hat 3 Kopfzeilen (beginnend mit #):
1) # eine allgemeine Überschrift/Beschreibung/Kommentar
2) # Zeitstempel des letzten Datensatzes (letzte Datenzeile), die Zeitstempel der anderen Datensätze werden daraus berechnet
3) # die Feldnamen für die Kurvenlegende und Spaltenüberschriften
Dann folgen die Datenzeilen. Bis zu 7200 Datenzeilen mit bis zu 11 Werten je Zeile wertet das Diagramm aus. Mehr Werte werden von der ImportCSV-Funktion zwar eingelesen, aber nicht im Diagramm angezeigt.

Erlaubter Aufbau der csv-Datei:
Code:
# Testdatensätze für Debuggen csv-Import
# zuletzt geschriebener Datensatz: 10 DT#14-5-18-17:25:20.000
# Wert_1;Wert_2;Wert_3;Wert_4;Wert_5; Wert_6; Wert_7; Wert_8; Wert_9 ; Wert_10 ; Wert_11

 1;68;0;72;2;0;5,4;1;5,7
 2; 67; 0; 72; 1; 0; 5,4; 1; 5,7
 3 ; 67 ; 0 ; 72 ; 1 ; 0 ; 5,5 ; 1 ; 5,7 ;
 4;68;0;71;1;0;5,5;1;5,9
 5; 67;; 71 ;;;    5,5   ; 1; 5,9 ;0

#
#
06;67;0;71;0;0;5,5;1;5,9;
06;67;0;71;0;0;5,5;1;6,0

 6;67;0;71;0;0;5,5;1;6,1;

 9;67;0;71;0;0;5,5;1;6,7;2;64
10;67;0;71;0;0;5,5;1

Der Excel-VBA-Code zum Import der csv-Datei hier mal gekürzt.
Die komplette Fassung mit mehr Kommentaren siehe im Anhang die Excel-Datei Diagramm.xls oder die CSV_Import.xls.vba.txt
Code:
[COLOR="#008000"]'*******************************************************************************
'CSV-Datei in Excel-Arbeitsblatt importieren
'30.06.2007 Harald
'für max 7200 Datenzeilen mit max 11 Werten je Zeile
'*******************************************************************************[/COLOR]

Dim useLastPath As Integer [COLOR="#008000"]'Modulweite static Variable für Erkennung Erstaufruf Dateiauswahl[/COLOR]

Public Sub ImportCSV()
Const sep = ";" [COLOR="#008000"]'CSV-Separator[/COLOR]

[COLOR="#008000"]'**** Debug-Help **** !!! Excel-Status wiederherstellen, falls Macro vorher abgebrochen[/COLOR]
Application.Calculation = xlCalculationAutomatic [COLOR="#008000"]'-4105[/COLOR]
Application.ScreenUpdating = True
Application.StatusBar = False

[COLOR="#008000"]'**** Datei-Pfad voreinstellen bei erstem Datei auswählen ****
'bei Erstaufruf: Pfad auf das selbe Verzeichnis wie die Diagramm.xls einstellen
'weil Standard-Pfad bei Erstaufruf: Pfad zu "Eigene Dateien" - hier nicht gewollt[/COLOR]

If useLastPath = 0 Then
  ChDrive Left(ActiveWorkbook.Path, 1)
  ChDir ActiveWorkbook.Path
End If

[COLOR="#008000"]'**** Auswahl Dateiname (DateiÖffnen-Dialog)[/COLOR]
Do
  fileToOpen = Application.GetOpenFilename( _
    "CSV-Datei (*.txt), *.txt,CSV-Datei (*.csv), *.csv")
  If fileToOpen = False Then Exit Sub
  wahl = 0
  If Dir(fileToOpen) = "" Then
    wahl = MsgBox(fileToOpen & " existiert nicht.", _
      vbOKCancel, "Datei nicht gefunden")
    If wahl = vbCancel Then Exit Sub
  End If
Loop Until wahl = 0

[COLOR="#008000"]'beim nächsten DateiÖffnen-Dialog mit Pfad der eben geöffneten Datei beginnen[/COLOR]
useLastPath = 1

[COLOR="#008000"]'Name der gewählten Datei in Tabellenblatt Worksheets("Daten").Range("L2") eintragen[/COLOR]
Range("FileName").Value = Mid(fileToOpen, 1 + InStrRev(fileToOpen, Application.PathSeparator))

[COLOR="#008000"]'**** Eingabe-Datei öffnen[/COLOR]
Open fileToOpen For Input As #1

[COLOR="#008000"]'**** Excel-Zellenneuberechnungen und -Anzeigen während Einlesen abschalten[/COLOR]
Application.Calculation = xlCalculationManual '-4135 'Zellen-Neuberechnung anhalten !!!
Application.ScreenUpdating = False
[COLOR="#008000"]'**** und dafür Einlesefortschritt in Excel-Statusleiste anzeigen[/COLOR]
oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = "Daten werden importiert ..."

[COLOR="#008000"]'**** Kopfzeilen und Datensätze aus CSV-Datei lesen in Tabellenblatt "Daten" ab Zelle "C7"[/COLOR]
Set Blatt = Worksheets("Daten")
With Blatt
  FirstCol = .Range("Data").Column [COLOR="#008000"]'3 "C" = 1. Datenspalte[/COLOR]
  FirstRow = .Range("Data").Row    [COLOR="#008000"]'7     = 1. Datenzeile[/COLOR]
  
  z = 0 [COLOR="#008000"]'Datensatz-Zähler[/COLOR]
  k = 3 [COLOR="#008000"]'Anzahl Kopfzeilen[/COLOR]

  Do While Not EOF(1)    [COLOR="#008000"]' Schleife bis Dateiende.[/COLOR]
    Line Input #1, datensatz    [COLOR="#008000"]'eine Zeile einlesen[/COLOR]
    
    [COLOR="#008000"]'leere Zeilen überspringen[/COLOR]
    If datensatz = "" Then
      [COLOR="#008000"]'nichts tun, nächste Zeile aus Datei lesen (VBA Do...Loop kennt kein Continue)[/COLOR]

    [COLOR="#008000"]'# Kommentarzeile[/COLOR]
    ElseIf Asc(datensatz) = 35 Then [COLOR="#008000"]'Zeile beginnt mit #[/COLOR]
      datenfeld = Split(Mid(datensatz, 2), sep)
      Select Case k
      Case 3 [COLOR="#008000"]' ...[/COLOR]
        k = 2
      Case 2 [COLOR="#008000"]' ...[/COLOR]
        k = 1
      Case 1 [COLOR="#008000"]'Feldnamen einlesen nach C6...: # Wert_1; Wert_2; Wert_3; ...[/COLOR]
        If UBound(datenfeld) > 3 Then [COLOR="#008000"]'mind. 3 ';' enthalten[/COLOR]
          C = FirstCol [COLOR="#008000"]'erste Datenspalte[/COLOR]
          For Each i In datenfeld
            .Cells(FirstRow - 1, C).Value = Trim(i) [COLOR="#008000"]'Feldnamen[/COLOR]
            C = C + 1 [COLOR="#008000"]'nächste Datenspalte[/COLOR]
          Next
          k = 0 [COLOR="#008000"]'OK, Feldnamen gelesen -> nicht nochmal[/COLOR]
        End If
      End Select [COLOR="#008000"]'k war schon 0 -> Zeile ignorieren[/COLOR]
    
    [COLOR="#008000"]'Datenzeile -> C7, D7, E7, ... M7[/COLOR]
    Else [COLOR="#008000"]'Datensatz! 11 Werte -> Cz...Mz[/COLOR]
      C = FirstCol      [COLOR="#008000"]'erste Datenspalte[/COLOR]
      r = FirstRow + z  [COLOR="#008000"]'Datenzeile[/COLOR]
      datenfeld = Split(datensatz, sep)
      For Each i In datenfeld
        .Cells(r, C).Value = CDec("0" & Trim(i)) [COLOR="#008000"]'Zahlenwerte vom Datensatz[/COLOR]
        C = C + 1  [COLOR="#008000"]'nächste Spalte[/COLOR]
      Next
      z = z + 1  [COLOR="#008000"]'nächste Zeile & Zähler Datensätze[/COLOR]
    End If     [COLOR="#008000"]'Unterscheidung Leerzeile, Kommentar oder Datenzeile[/COLOR]
    
    [COLOR="#008000"]'Einlesefortschritt in Excel-Statuszeile anzeigen (Update nur jede zehnte Zeile)[/COLOR]
    If (z Mod 10) = 0 Then Application.StatusBar = "Daten werden importiert ... " & z
  Loop       [COLOR="#008000"]'nächste Zeile aus Datei[/COLOR]
  
  [COLOR="#008000"]'Tabelle bis Datensatz 7200 löschen, falls weniger eingelesen[/COLOR]
  If z < 7200 Then
    .Range(.Cells(FirstRow + z, FirstCol), .Cells(FirstRow + 7199, FirstCol + 10)).ClearContents
  End If
End With   [COLOR="#008000"]'Blatt = Worksheets("Daten")[/COLOR]

[COLOR="#008000"]'**** fertig importiert - Datei schließen[/COLOR]
Close #1

[COLOR="#008000"]'**** Excel-Einstellungen wiederherstellen[/COLOR]
Application.Calculation = xlCalculationAutomatic [COLOR="#008000"]'-4105[/COLOR]
Application.ScreenUpdating = True
Application.StatusBar = False
Application.DisplayStatusBar = oldStatusBar

[COLOR="#008000"]'**** Fertigmeldung[/COLOR]
MsgBox z & " Datensätze eingelesen!", , "Import beendet"

End Sub

Achtung:
Die Excel-Arbeitsblätter haben keinen Blattschutz. Bitte nur im oberen Teil des Blattes "Analyse" mit den Schaltflächen bedienen, es kann auch die Anzeigestart-Minute für das Diagramm direkt in die gelbe Zelle "J2" eingegeben werden.
Die originale Datei Diagramm.xls ist bei mir schreibgeschützt. Nach dem csv-Import sollte die Excel-Datei besser nicht gespeichert werden, dann würde sie nämlich etliche MB groß werden.

Harald
 

Anhänge

  • csv-Auswertung mit Excel.jpg
    csv-Auswertung mit Excel.jpg
    268,5 KB · Aufrufe: 44
  • Excel_csv_Diagramm.zip
    251,8 KB · Aufrufe: 30
  • CSV_Import.xls.vba.txt
    6,2 KB · Aufrufe: 31
Hallo Harald,
Super hat geklappt.
Vielen Dank.

Dein Programm werde ich mir mal genauer anschauen , da werde ich siche sehr viel dazu lernen.
Eine sache noch, da finde ich nichts im Netz. Wie kann ich zu
Code:
Split(ReadLine, ";")

noch den Split von Leerzeichen hinzufügen ?
 
Wenn Du tatsächlich bei Leerzeichen splitten willst, dann benutze
Code:
Split(ReadLine, " ")

'oder ganz allgemein:
stringfeld = Split(string, separatorzeichen)
Split zerlegt einen String in mehrere Teilstrings, es "zerschneidet" den String bei jedem gefundenen Separatorzeichen, wobei das Separatorzeichen selber entfernt wird.
Code:
Split("12 34  5,6 78 abc .. 9,0", " ") ergibt die 8 Teilstrings: "12" + "34" + "" + "5,6" + "7,8" + "abc" + ".." + "9,0"

Oder willst Du eigentlich nur die Leerzeichen vor/hinter Zeichenfolgen entfernen? Dafür nimmt man Trim (oder auch LTrim oder RTrim).
Code:
Trim(" 12 34 56 ") ergibt "12 34 56".
Schau mal in mein VBA-Beispiel und in die Excel-VBA-Hilfe: den Kursor in den unklaren Befehl setzen und F1 drücken.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

Ich wollte nach ; und nch Leerzeichen Spliten damit ich das Datum und die Uhrzeit in einselne Spalten habe für eine weitere Verarbeitung.
Code:
Do
    Line Input #Datei, ReadLine
    If ReadLine <> "" Then
        Dummy() = Split(ReadLine, ";")
        'Datum Uhrzeit zerlegen
        Dummy1() = Split(Dummy(1), " ")
     ' Datum in Zelle schreiben
       Tabelle1.Cells(zeile, 2) = Dummy1()
       ' Value in Zelle schreiben
       Tabelle1.Cells(zeile, 4) = Dummy(2)

Ich habe da noch ein ganz anderes Problem das CSV Datum hat ein anders Format als Excel Datum. Ich möchte ja aus den CSV Daten Monat verbräche von Jan .Feb usw. herausfiltern.

Was mir aufgefallen ist wenn ich die Original CVS Datei im Excel öffne ist das Format schon angepasst. Ich kann also ein Excel Datum mit dem CSV Vergleichen.
Wenn ich die Daten Importier ist dies nicht der Fall. Hier muss ich erst noch eine Lösung finden dies zu Konvertieren.
 
Zuletzt bearbeitet:
Konvertieren von Datum/Uhrzeit ist nicht einfach weil das Format je nach Regionaleinstellungen des Windows verschieden ist.
Deswegen bastelt man sich da besser selber was oder nutzt die VBA-Funktion DatePart

In dem csv-Archiv ist der Zeitstempel aber auch formatunabhängig als numerischer Wert in der letzten Spalte "Time_ms" enthalten
- zunächst Time_ms / 1.000.000 teilen, ergibt z.B. 41774,944663 = 15.05.2014 22:40:19
- der ganzzahlige Teil vor dem Komma ist das Datum: die Anzahl Tage seit dem 31.12.1899
- der gebrochene Teil nach dem Komma ist die Uhrzeit: 0,0 ... 1,0 entspricht 0:00:00 ... 24:00:00

Code:
Dim Dummy(), DT(), TimeS, Datum

  Line Input #Datei, ReadLine
  [COLOR="#008000"]'ergibt z.B.: "DB 103 Stomverbrauch.Aktuell_Watt_KW_H;15.05.2014 22:40;644;1;41774944663"[/COLOR]

  If ReadLine <> "" Then         [COLOR="#008000"]'Leere Zeilen nicht auswerten[/COLOR]
    If Asc(ReadLine) <> 36 Then  [COLOR="#008000"]'Zeilen mit $ am Anfang nicht auswerten[/COLOR]
      Dummy = Split(ReadLine, ";")
      [COLOR="#008000"]' das ergibt: 
      ' Dummy(0): "DB 103 Stomverbrauch.Aktuell_Watt_KW_H"  'VarName
      ' Dummy(1): "15.05.2014 22:40"                        'TimeString
      ' Dummy(2): "644"                                     'VarValue
      ' Dummy(3): "1"                                       'Validity
      ' Dummy(4): "41774944663"                             'Time_ms[/COLOR]

      [COLOR="#008000"]'TimeString in Datum und Uhrzeit zerlegen[/COLOR]
      DT = Split(Dummy(1) & " ", " ")
      [COLOR="#008000"]'das ergibt:
      ' DT(0): "15.05.2014"
      ' DT(1): "22:40"
      ' DT(2): ""[/COLOR]
      Tabelle1.Cells(zeile, 3) = DT(0) [COLOR="#008000"]'Datum[/COLOR]
      Tabelle1.Cells(zeile, 4) = DT(1) [COLOR="#008000"]'Uhrzeit[/COLOR]

      [COLOR="#008000"]'ODER unabhängig von den Regionaleinstellungen Time_ms in Datum und Uhrzeit zerlegen:[/COLOR]
      TimeS = Val(Dummy(4)) / 1000000           [COLOR="#008000"]'Time_ms / 1.000.000[/COLOR]
      Datum = Int(TimeS)                        [COLOR="#008000"]'Datum ist der Teil vor dem Komma, Uhrzeit der Teil nach dem Komma[/COLOR]
      Tabelle1.Cells(zeile, 5) = Datum          [COLOR="#008000"]'Datum   -> Zelle als Datum formatieren[/COLOR]
      Tabelle1.Cells(zeile, 6) = TimeS - Datum  [COLOR="#008000"]'Uhrzeit -> Zelle als Uhrzeit formatieren[/COLOR]

Harald
 
Hallo Harald
dein Beispiel mit der Time_ms zu zerlegen funktioniert. Super vielen dank.
Aber ich bin langsam am verzweifeln. Jetzt erhalte ich bei den Variablen nicht 11,62007 sondern 1162007.
Ich glaub langsam es ist einfacher die Daten per "Daten Aus Text Importieren", als über ein Macro.
Bei der normalen Import Methode werden die Variablen richtig importiert. Es muss doch möglich sein diesen Vorgang zu automatisieren wenn ich das Excel File öffne.?


Ich habe es grade mal über Macro aufzeichnen versucht. Mit diesm code fuktioniert ein sauberer import

Code:
Sub Makro2()
'
' Makro2 Makro
'
' Tastenkombination: Strg+w
'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Energieverbrauch_Haus\Strom0.csv", Destination:=Range("$A$1"))
        .Name = "Strom0"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierNone
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = True
        .TextFileOtherDelimiter = """"
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
dein Beispiel mit der Time_ms zu zerlegen funktioniert. Super vielen dank.
Das muß auch funktionieren, ist ja schließlich in der WinCC flexible Hilfe bei "Aufbau einer *.csv-Datei mit Variablenwerten" auch so beschrieben (in der Hilfe nach "Time_ms" suchen).

Aber ich bin langsam am verzweifeln. Jetzt erhalte ich bei den Variablen nicht 11,62007 sondern 1162007.
Wie ist auf Deinem Auswerte-PC das Dezimaltrennzeichen eingestellt?
Skripte zum Test und Einstellen des Dezimaltrennzeichens

Schau Dir mal Deine csv-Dateien mit einem Texteditor an. Möglicherweise mußt Du nach dem Einlesen der Zeile oder nach dem Splitten erst alle falschen Dezimalpunkte durch Komma ersetzen (oder umgekehrt):
Code:
  ReadLine = Replace(ReadLine, ".", ",")

Warum sind Deine csv-Dateien so unterschiedlich?
Bei ÖL0.csv und Pufferspeicher0.csv sind alle Strings und die Feldnamen in doppelten Anführungsstrichen und Time_ms enthält Millisekunden als Nachkommateil. Bei Heizung0.csv, Strom0.csv und Wasser0.csv sind keine Anführungsstriche und keine Millisekunden.
Code:
ÖL0.csv
"Archivirungsvariablen\DB101 Verbrauch ÖL.EnergieOelTaeglich_KW";"16.05.2014 00:11:02";0;1;41775007659,7106

Pufferspeicher0.csv
"Archivirungsvariablen\DB 100 Energie/Verbrauch.Leistung_Puffer_KW";"16.05.2014 00:11:02";7,957531;1;41775007659,7106

Heizung0.csv
Archivirungsvariablen\DB 104 Energie Heizung.Leistung_Taeglich_KW;16.05.2014 00:11;983;1;41775007660

Strom0.csv
DB 103 Stomverbrauch.Aktuell_Watt_KW_H;15.05.2014 22:41;2645;1;41774945715

Wasser0.csv
$RT_OFF$;15.05.2014 22:50;12;2;41774951978

Harald
 
Hallo Harald,
das waren noch alte Daten die neuen sind alles so aufgebaut
Code:
"VarName";"TimeString";"VarValue";"Validity";"Time_ms"
"Archivirungsvariablen\DB 103 Stomverbrauch.Stromverbrauch_Tag";"16.05.2014 23:58:01";11,62007;1;41775998622,8125
"Archivirungsvariablen\DB 103 Stomverbrauch.Stromverbrauch_Tag";"17.05.2014 23:58:02";7,371648;1;41776998633,7153
"Archivirungsvariablen\DB 103 Stomverbrauch.Stromverbrauch_Tag";"18.05.2014 23:58:02";11,2139;1;41777998634,4329
"Archivirungsvariablen\DB 103 Stomverbrauch.Stromverbrauch_Tag";"19.05.2014 23:58:02";5,905755;1;41778998631,2269

Code:
"VarName";"TimeString";"VarValue";"Validity";"Time_ms"
"Archivirungsvariablen\DB 100 Energie/Verbrauch.Leistung_Puffer_KW";"16.05.2014 23:58:01";93,57202;1;41775998622,8125
"Archivirungsvariablen\DB 100 Energie/Verbrauch.Leistung_Puffer_KW";"17.05.2014 23:58:02";65,8663;1;41776998633,7153
"Archivirungsvariablen\DB 100 Energie/Verbrauch.Leistung_Puffer_KW";"18.05.2014 23:58:02";43,15594;1;41777998634,4329
"Archivirungsvariablen\DB 100 Energie/Verbrauch.Leistung_Puffer_KW";"19.05.2014 23:58:02";32,41039;1;41778998631,2269

Code:
"VarName";"TimeString";"VarValue";"Validity";"Time_ms"
"Archivirungsvariablen\DB 104 Energie Heizung.Leistung_Taeglich_KW";"16.05.2014 23:58:01";14,82856;1;41775998622,8125
"Archivirungsvariablen\DB 104 Energie Heizung.Leistung_Taeglich_KW";"17.05.2014 23:58:02";5,053237;1;41776998633,7153
"Archivirungsvariablen\DB 104 Energie Heizung.Leistung_Taeglich_KW";"18.05.2014 23:58:02";2,089642;1;41777998634,4329
"Archivirungsvariablen\DB 104 Energie Heizung.Leistung_Taeglich_KW";"19.05.2014 23:58:02";0;1;41778998631,2269

ich kann aber im Bediengerät anders abspeichern
 
Gut. Die WinCCflex-Runtime verwendet das Komma als Dezimaltrennzeichen. Das sollte also auch zum Excel auf dem Auswerte-PC passen. Ist das der selbe PC wie der auf dem die Runtime läuft?

Und was ist nun Dein Problem?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber ich bin langsam am verzweifeln. Jetzt erhalte ich bei den Variablen nicht 11,62007 sondern 1162007.
Jaja, die Excel-Automatik-Interpretationen für die Durchschnitts-User... :roll:
Das Einlesen funktioniert jetzt bei mir. Siehe Anhang :cool:

Harald
 

Anhänge

  • Auswertung Strom.zip
    17,3 KB · Aufrufe: 9
Hallo
kann ich eigentlich eine Excel Grafik oder eine Excel Tabelle in Wincc Flexible mit einbinden ? Wie über ein Controll ? Ich meine nicht excel zu starten sonder wie einen den HTML Browser.

Im Anhang ein Bild .

Vieleicht kann man ja über ein Script das Balkendiagramm in Wicc flexible bekommen ?
 

Anhänge

  • Excel Grafik.JPG
    Excel Grafik.JPG
    100,1 KB · Aufrufe: 14
  • Auswertung Energie Haus.zip
    26,9 KB · Aufrufe: 1
Zuletzt bearbeitet:
Hallo Harald,
bei mir ist ein neues Problem aufgetreten. Mir ist schon die Tage aufgefallen das der Import der CSV Daten immer länger dauert. Habe mal alle Variablen sekündlich in den CVS geschrieben dass ich die volle Impotdatenmenge von 1095 Variablen ja Datei erhalte. Wenn ich in Excel diese Daten mit Text Aus manuell Importiere geht das in unter 1 sec. Über mein Programm dauert der Import ewig. Ich warte jetzt schon über 10 min und der Import ist immer noch nicht fertig.
Wie kann ich dies beschleunigen?
 
Zurück
Oben