Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
984to988
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
984to988
984to988
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

makro erweitern sehntel, hunderstel, tausendestel

makro erweitern sehntel, hunderstel, tausendestel
07.06.2008 11:00:58
Rolf
Guten Morgen Excel Experten!
Aus einer Datenbank werden Daten nach Excel per Makro gelesen.
Die Zeit wurden nun durch zehntel,hunderdestel und tausendestel erweitert.
Das Probelm ist, die Zeit ist unterscheidlich lang.
Beipiel aus der Datenbank:
06.06.2008 19:30:39.196;D213FF1C000104E0
06.06.2008 19:30:41.69;7E37FF1C000104E0
06.06.2008 19:30:41.79;8536FF1C000104E0
06.06.2008 19:29:32.560;EA47FF1C000104E0
und wird daher nicht richtig eingelesen.
Makro
Dim DateiPos As Long
Dim zeile As Integer
Dim datei As String
Sub AusTextDatei()
DateiPos = 0
zeile = 0
datei = Application.GetOpenFilename("TagRegEx.dat,*.dat")
Cells(1, 1) = 1
LeseAbPos
End Sub


Sub LeseAbPos()
Dim Zeilenoffset As Integer
Dim strTxt As String
Dim FileLen As Long
If Cells(1, 1) 1 Then
Exit Sub
End If
Zeilenoffset = 2 'erste beiden Zeilen für die Überschriften
Open datei For Input As #1
Seek #1, DateiPos + 1
FileLen = LOF(1)
' Nur zur Information
'Cells(1, 2) = FileLen
'Cells(1, 3) = DateiPos
Do Until DateiPos >= FileLen
' in zeile wird die aktuelle Zeilennummer als
' globale Variable zwischen den Aufrufen gespeichert!
zeile = zeile + 1
' Zeile Einlesen
Line Input #1, strTxt
' Verarbeiten und das nächste mal nach den gelesenen Zeilen weiterlesen
' Hinter jeder Zeile folgen 2 Zeichen Zeilentrenner!
DateiPos = DateiPos + 2 + VerarbeiteZeile(strTxt, zeile + Zeilenoffset)
Loop
Cells(1, 4) = zeile
Close #1
'MsgBox "Habe die Daten ausgelesen!"
' wieder aufufen nach .. Sekunden
Application.OnTime Now + TimeValue("00:00:01"), "LeseAbPos"
End Sub


' Rückgabe: Länge der eingelesenen Zeile
Function VerarbeiteZeile(strZeile As String, intAktRow As Integer) As Integer
Dim iCol As Integer
iCol = 1
' Erwartet wird ein Ausdruck, der von den Zeichenpositionen genau so aufgebaut ist:
' Länge einer Zeile muss 36 sein!!
Dim ZeilenLänge As Integer
ZeilenLänge = 40
VerarbeiteZeile = 0
Cells(intAktRow, iCol) = zeile
iCol = iCol + 1
If Len(strZeile) ZeilenLänge Then
Cells(intAktRow, iCol) = "Fehler: " + strZeile
VerarbeiteZeile = Len(strZeile)
Exit Function
End If
Cells(intAktRow, iCol) = Left(strZeile, 10)
Cells(intAktRow, iCol + 1) = Mid(strZeile, 12, 12) ' hier ist glaube ich das Problem. Die länge ist
' unterschiedlich
Cells(intAktRow, iCol + 2) = Mid(strZeile, 25, 16)
VerarbeiteZeile = ZeilenLänge
End Function



Public Sub StopEinlesen()
Cells(1, 1) = 0
End Sub


Vielen Dank für eure Hilfe!
Gruß
Rolf

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: makro erweitern sehntel, hunderstel, tausendestel
07.06.2008 12:18:00
Daniel
Hi
was du benötigst, ist die Position des Trennzeichens (hier des Semikolons), um bei unterschiedlicher Länge die Teilstrings richtg zu berechnen.
die Postion des Semikolons kann man mit der INSTR-Funktion berechnen:
InStr("1234;6789", ";") hat als ergebnis 5
Ab Excel 2002 gibt es zusätzlich noch die SPLIT-Funktion, um einen Text anhand eines Trennzeichens in Teiltexte zu zerlegen:

dim Gesamttext as String
dim Teiltexte() as string '--- Ergebnis der Split-funktion ist ein String-Array
Gesamttext = "06.06.2008 19:30:39.196;D213FF1C000104E0"
Teiltexte = Split(Gesamttext, ";")


die einzelnen Teiltexte bekommst du dann so:
Teiltexte(0) ist "06.06.2008 19:30:39.196"
Teiltexte(1) ist "D213FF1C000104E0"
wenn du jetzt die Split-Funktion nochmal auf Teiltexte(0) mit dem Leerzeichen als Trennzeichen anwendest, kannst du deinen Text komplett in seine Bestandteile (Datum, Zeit, Text) zerlegen, ohne dich um irgendwelche Längen kümmern zu müssen.
Gruß, Daniel

Anzeige
AW: makro erweitern sehntel, hunderstel, tausendestel
07.06.2008 12:28:09
MAS
Du musst ermitteln, wo der Strichpunkt ist

Sub test()
Dim zeile
Dim zeit
Dim endeZeit, anfangZeit
zeile = "06.06.2008 19:30:39.196;D213FF1C000104E0"
anfangZeit = InStr(1, zeile, " ")
endeZeit = InStr(1, zeile, ";")
zeit = Mid(zeile, anfangZeit + 1, endeZeit - anfangZeit - 1)
Debug.Print zeit
End Sub


AW: makro erweitern sehntel, hunderstel, tausendes
07.06.2008 13:04:00
fcs
Hallo Rolf,
da hast du dir aber eine komplizierte Konstruktion ausgedacht, um das Ende der Textdatei zu prüfen.
Das geht einfacher - einfach prüfen, ob EOF(1) erreicht ist.
Das Problem mit dem Auswerten des unterschiedlich langen Zeit-String kannst du lösen, indem du die Position des Semikolons auswertest.
Ich hab dir das mal so in etwa hingestrickt.
Gruß
Franz

Option Explicit
Dim DateiPos As Long
Dim zeile As Integer
Dim datei As String
Sub AusTextDatei()
DateiPos = 0
zeile = 0
datei = Application.GetOpenFilename("TagRegEx.dat,*.dat")
Cells(1, 1) = 1
LeseAbPos
End Sub
Sub LeseAbPos()
Dim Zeilenoffset As Integer
Dim strTxt As String
If Cells(1, 1)  1 Then
Exit Sub
End If
Zeilenoffset = 2 'erste beiden Zeilen für die Überschriften
Open datei For Input As #1
' Nur zur Information
'Cells(1, 2) = FileLen
'Cells(1, 3) = DateiPos
Do Until EOF(1)
' in zeile wird die aktuelle Zeilennummer als
' globale Variable zwischen den Aufrufen gespeichert!
zeile = zeile + 1
' Zeile Einlesen
Line Input #1, strTxt
' Verarbeiten und das nächste mal nach den gelesenen Zeilen weiterlesen
' Hinter jeder Zeile folgen 2 Zeichen Zeilentrenner!
Call VerarbeiteZeile(strTxt, zeile + Zeilenoffset)
Loop
Cells(1, 4) = zeile
Close #1
'Uhrzeitspalte formatieren
Range(Cells(3, 3), Cells(ActiveSheet.Rows.Count, 3).End(xlUp)).NumberFormat _
= "hh:mm:ss.000"
'MsgBox "Habe die Daten ausgelesen!"
' wieder aufufen nach .. Sekunden
Application.OnTime Now + TimeValue("00:00:01"), "LeseAbPos"
End Sub
' Rückgabe: Länge der eingelesenen Zeile
Function VerarbeiteZeile(strZeile As String, intAktRow As Integer) As Integer
Dim iCol As Integer, iPosSemicolon As Integer
Dim ZeilenLänge As Integer
On Error GoTo Fehler
iCol = 1
' Erwartet wird ein Ausdruck, der von den Zeichenpositionen genau so aufgebaut ist:
' Länge einer Zeile muss 36 sein!!
ZeilenLänge = 40
Cells(intAktRow, iCol) = zeile
iCol = iCol + 1
If Len(strZeile) > ZeilenLänge Or Len(strZeile)  0 Then
Cells(intAktRow, iCol) = "Fehler: " & strZeile
End If
End Function
Public Sub StopEinlesen()
Cells(1, 1) = 0
End Sub


Anzeige
AW: makro erweitern sehntel, hunderstel, tausendes
07.06.2008 13:22:00
Rolf
Hallo Franz!
Vielen Dank für dein Hilfe!
Jetzt taucht bloß das Problem auf, des jedes mal wieder alle Datensätze ausgelesen und nicht nur
die neu hinzu gekommenen.
So wie vorher sollen nur die neu hinzugekommenen Datensätze jede Sekunde ausgelesen werden.
Kannst du noch mal schauen?
Danke!
Gruß
Rolf

AW: makro erweitern sehntel, hunderstel, tausendes
07.06.2008 13:50:36
fcs
Hallo Rolf,
ach deswegen die ungewöhnliche Konstruktion, um die jeweils letzte Lese-Position zu erfassen.
Dann muss du "nur" die Auswerte-Prozedur anpassen
Gruß
Franz

Dim DateiPos As Long
Dim zeile As Integer
Dim datei As String
Sub AusTextDatei()
DateiPos = 0
zeile = 0
datei = Application.GetOpenFilename("TagRegEx.dat,*.dat")
Cells(1, 1) = 1
LeseAbPos
End Sub
Sub LeseAbPos()
Dim Zeilenoffset As Integer
Dim strTxt As String
Dim FileLen As Long
If Cells(1, 1)  1 Then
Exit Sub
End If
Zeilenoffset = 2 'erste beiden Zeilen für die Überschriften
Open datei For Input As #1
Seek #1, DateiPos + 1
FileLen = LOF(1)
' Nur zur Information
'Cells(1, 2) = FileLen
'Cells(1, 3) = DateiPos
Do Until DateiPos >= FileLen
' in zeile wird die aktuelle Zeilennummer als
' globale Variable zwischen den Aufrufen gespeichert!
zeile = zeile + 1
' Zeile Einlesen
Line Input #1, strTxt
' Verarbeiten und das nächste mal nach den gelesenen Zeilen weiterlesen
' Hinter jeder Zeile folgen 2 Zeichen Zeilentrenner!
DateiPos = DateiPos + 2 + VerarbeiteZeile(strTxt, zeile + Zeilenoffset)
Loop
Cells(1, 4) = zeile
Close #1
'Uhrzeitspalte formatieren
Range(Cells(3, 3), Cells(ActiveSheet.Rows.Count, 3).End(xlUp)).NumberFormat _
= "hh:mm:ss.000"
'MsgBox "Habe die Daten ausgelesen!"
' wieder aufufen nach .. Sekunden
Application.OnTime Now + TimeValue("00:00:01"), "LeseAbPos"
End Sub
' Rückgabe: Länge der eingelesenen Zeile
Function VerarbeiteZeile(strZeile As String, intAktRow As Integer) As Integer
Dim iCol As Integer, iPosSemicolon As Integer
Dim ZeilenLänge As Integer
On Error GoTo Fehler
iCol = 1
' Erwartet wird ein Ausdruck, der von den Zeichenpositionen genau so aufgebaut ist:
' Länge einer Zeile muss 36 sein!!
ZeilenLänge = 40
VerarbeiteZeile = 0
Cells(intAktRow, iCol) = zeile
iCol = iCol + 1
If Len(strZeile) > ZeilenLänge Or Len(strZeile)  0 Then
Cells(intAktRow, iCol) = "Fehler: " & strZeile
End If
VerarbeiteZeile = Len(strZeile)
End Function
Public Sub StopEinlesen()
Cells(1, 1) = 0
End Sub


Anzeige
AW: makro erweitern sehntel, hunderstel, tausendes
07.06.2008 14:18:00
Rolf
Hallo Franz!
Super jetzt geht es!
Danke!
Gruß
Rolf

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige