# Auswertung CSV in Excel



## emilio20 (16 Mai 2014)

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.

```
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
```


----------



## PN/DP (17 Mai 2014)

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:

```
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


----------



## emilio20 (17 Mai 2014)

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 ?


```
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
```


----------



## emilio20 (17 Mai 2014)

Hallo Harald,
es geht irgentwie nicht. Es kommt der Fehler Laufzeitfehler Datenname oder nummer falsch

Ich habe mal die Ganzen Dateien angehängt


```
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
```


----------



## PN/DP (18 Mai 2014)

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:

```
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


----------



## PN/DP (18 Mai 2014)

*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:

```
# 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

```
[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


----------



## emilio20 (18 Mai 2014)

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 

```
Split(ReadLine, ";")
```

noch den Split von Leerzeichen hinzufügen ?


----------



## PN/DP (18 Mai 2014)

Wenn Du tatsächlich bei Leerzeichen splitten willst, dann benutze

```
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.

```
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).

```
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


----------



## emilio20 (19 Mai 2014)

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.

```
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.


----------



## PN/DP (19 Mai 2014)

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


```
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


----------



## emilio20 (19 Mai 2014)

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


```
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
```


----------



## PN/DP (20 Mai 2014)

emilio20 schrieb:


> 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).



emilio20 schrieb:


> 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):

```
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.

```
Ö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


----------



## emilio20 (20 Mai 2014)

Hallo Harald,
das waren noch alte Daten die neuen sind alles so aufgebaut

```
"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
```


```
"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
```


```
"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


----------



## PN/DP (20 Mai 2014)

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


----------



## PN/DP (21 Mai 2014)

emilio20 schrieb:


> 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 

Harald


----------



## emilio20 (21 Mai 2014)

Hallo Harald,
Habe dein file soeben versucht klappt super. Vielen Dank


----------



## PN/DP (21 Mai 2014)

emilio20 schrieb:


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


Das habe ich leider vergessen.
Lösung siehe Beitrag 10.

Harald


----------



## emilio20 (21 Mai 2014)

Hallo
ja habe ich geändert klappt.
Super nichmals vielen Dank


----------



## emilio20 (22 Mai 2014)

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 ?


----------



## emilio20 (23 Mai 2014)

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?


----------



## PN/DP (24 Mai 2014)

Nach  jedem Wert, den das VBA-Macro in ein Tabellenblatt schreibt, berechnet Excel das Tabellenblatt neu und und stellt es auch neu dar. Und das dauert....
Lösung:
- die Excel-Zellenneuberechnungen und -Anzeigen während dem Einlesen abschalten - siehe mein Excelbeispiel in #6, da werden bis zu 79000 Werte in Sekunden eingelesen
- oder die csv-Werte in ein Macro-internes Array lesen und dann das Array als ganzes in das Tabellenblatt schreiben

Harald


----------



## emilio20 (25 Mai 2014)

Hallo Harald 
nochmals vielen dank für deine super Unterstützung. 
Mein Excel Programm funktioniert jetzt super schnell.


----------



## PN/DP (26 Mai 2014)

emilio20 schrieb:


> Hallo Harald
> nochmals vielen dank für deine super Unterstützung.
> Mein Excel Programm funktioniert jetzt super schnell.


Als langjähriges Forumsmitglied sollten Dir die Danke-Buttons unter den Beiträgen eigentlich schon mal aufgefallen sein... 




emilio20 schrieb:


> 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 ?


Die Diagrammwerte könntest Du in der SPS/CPU passend zusammenstellen.

Als "Puffer bitgetriggert"-Kurve in Balkendarstellung sollte das Diagramm mit WinCCflex-Mitteln möglich sein.
Wie werden bitgetriggerte Kurven (Trendkurven) in WinCC flexible projektiert?

Wenn das Diagramm aber unbedingt so "schick" wie Dein Beispieldiagramm werden muß, dann könnte man:

ein Diagramm ohne Balken in Excel erzeugen
als Bild (Screenshot) abspeichern, ggf. mit einem Malprogramm nachbearbeiten
das Bild an der X-Achse waagerecht teilen in Diagrammfläche und X-Achse mit Beschriftungen
das obere Bild (Diagrammfläche) als Grafikanzeige im Bildhintergrund einfügen
das untere Bild (X-Achse) als Grafikanzeige >= zwei Ebenen davor einfügen (soll die Balken unterhalb der X-Achse überdecken)
in einer Ebene dazwischen Rechtecke oder Balken-Grafiken hinter dem unteren Bild einfügen
die Balken-Rechtecke/Grafiken dynamisch vertikal bewegen (Animation > Vertikale Bewegung) - siehe Bild
wenn unterhalb von der X-Achse nicht genug Platz für die Balken mit 100% Länge vorhanden ist, dann kann man die Balken splitten in z.B. einen dynamischen Balken mit 50% Länge und einen festen Balken 50% auf der X-Achse stehend, nur sichtbar wenn der Wert >=50% ist

Harald


----------



## emilio20 (27 August 2014)

Hallo
ich habe je meine Auswertung in Excel soweit hinbekommen. Jetzt würde ich gerne 1x am Tag meine Excel Tabelle öffnen damit die aktuellen Daten importiert werden und diese in HTML abspeichern.
Ich wollte die HTML Seite in Wicc Flexible über den Browser nutzen.
Händisch funktioniert das soweit.

Wie kann ich automatisch die Excel Tabelle öffnen warten bis der Import abgeschlossen ist, als HTML speichern und die Tabelle schließen ?


----------

