Excel Makro zum Auslesen der seriellen Schnittstelle

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von japhwil.

    Excel Makro zum Auslesen der seriellen Schnittstelle

    Hallo,

    ich habe vor, ein Excel-Makro zu schreiben, um einen von einem Photometer gesendeten Datenstring in eine Tabelle einzutragen. Dabei soll eine Spalte die Messzeit enthalten, die andere die zugehörigen Messwerte. Leider scheitere ich immer am "Laufzeitfehler 1004". Kann mir da vielleicht jemand weiterhelfen?

    Ich benutze zum Auslesen der seriellen Schnittstelle die Software "StrokeReader" bzw. das zugehörige ActiveX Steuerelement. Im Anhang findet sich beispielhaft eine mit einem Terminalprogramm aufgezeichnete Datenreihe sowie das Projekt.

    Parameter der Verbindung:
    - Baud Rate: 19200
    - Parität: keine
    - Data Bits: 8
    - Stop Bits: 1

    Hier nochmal der Code:

    Visual Basic-Quellcode

    1. Dim zeile_idx As Integer
    2. Dim spalte_idx As Integer
    3. Dim buf As String
    4. Private Sub StrokeReader1_CommEvent(ByVal Evt As StrokeReaderLib.Event, ByVal data As Variant)
    5. Select Case Evt
    6. Case EVT_DISCONNECT '
    7. MsgBox "Keine Verbindung :(" '
    8. '
    9. Case EVT_CONNECT '
    10. MsgBox "Verbunden" '
    11. '
    12. Case EVT_DATA 'Verschiedene Events werden unterschieden
    13. buf = buf + data
    14. Umbruch = InStr(buf, Chr(10)) '
    15. buf = Right(buf, Umbruch) '"Probe n" wird vom String abgeschnitten
    16. Umbruch = InStr(buf, Chr(10)) '
    17. buf = Right(buf, Umbruch) '"Abs. Start..." wird vom String abgeschnitten
    18. Umbruch = InStr(buf, Chr(10)) '
    19. buf = Right(buf, Umbruch) '"Abs. Ende..." wird vom String abgeschnitten
    20. Umbruch = InStr(buf, Chr(10)) '
    21. buf = Right(buf, Umbruch) '"Steigung A/min..." wird vom String abgeschnitten
    22. Umbruch = InStr(buf, Chr(10)) '
    23. buf = Right(buf, Umbruch) '"Linearität (r²)..." wird vom String abgeschnitten
    24. Umbruch = InStr(buf, Chr(10)) '
    25. buf = Right(buf, Umbruch) '"Ergebnis..." wird vom String abgeschnitten
    26. Umbruch = InStr(buf, Chr(10)) '
    27. buf = Right(buf, Umbruch) 'Leerzeile wird vom String abgeschnitten
    28. Do
    29. Tabulator = InStr(buf, vbTab) 'der Tabulator zwischen Zeitpunkt und Absorption wird gesucht
    30. Zeit = Left(buf, Tabulator) 'Der Bereich links vom ersten Tabulator ist die erste Messzeit
    31. Cells(zeile_idx, spalte_idx) = Zeit 'Zeit wird in Zelle B2 geschrieben
    32. spalte_idx = spalte_idx + 1 'spalte_idx wird um 1 erhöht
    33. buf = Right(buf, Tabulator) 'buf ist nun nur noch alles rechts vom ersten Punkt
    34. Umbruch = InStr(buf, Chr(10)) 'restlicher Datenstring wird nach dem nächsten Zeilenumbruch durchsucht
    35. Absorption = Left(buf, Umbruch - 1) 'alles links vom Zeilenumbruch ist die Absorption
    36. Cells(zeile_idx, spalte_idx) = Absorption 'Absorption wird in Zelle C2 geschrieben
    37. buf = Right(buf, Absorption)
    38. zeile_idx = zeile_idx + 1 '
    39. spalte_idx = spalte_idx - 1 'zeile_idx und spalte_idx werden angepasst
    40. Loop
    41. End Select
    42. End Sub


    *Topic verschoben*
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Das scheint schonmal ein Stück weitergeholfen zu haben! Jetzt habe ich allerdings den "Laufzeitfehler 5" und Zeile 45 (48 in der aktuellen Version) wird markiert...

    Also hier nochmal der jetzt aktuelle Code:

    Visual Basic-Quellcode

    1. Dim zeile_idx As Integer
    2. Dim spalte_idx As Integer
    3. Dim buf As String
    4. Private Sub StrokeReader1_CommEvent(ByVal Evt As StrokeReaderLib.Event, ByVal data As Variant)
    5. zeile_idx = 1
    6. spalte_idx = 1
    7. Select Case Evt
    8. Case EVT_DISCONNECT '
    9. MsgBox "Keine Verbindung :(" '
    10. '
    11. Case EVT_CONNECT '
    12. MsgBox "Verbunden" '
    13. '
    14. Case EVT_DATA 'Verschiedene Events werden unterschieden
    15. buf = buf + data
    16. Umbruch = InStr(buf, Chr(10)) '
    17. buf = Right(buf, Umbruch) '"Probe n" wird vom String abgeschnitten
    18. Umbruch = InStr(buf, Chr(10)) '
    19. buf = Right(buf, Umbruch) '"Abs. Start..." wird vom String abgeschnitten
    20. Umbruch = InStr(buf, Chr(10)) '
    21. buf = Right(buf, Umbruch) '"Abs. Ende..." wird vom String abgeschnitten
    22. Umbruch = InStr(buf, Chr(10)) '
    23. buf = Right(buf, Umbruch) '"Steigung A/min..." wird vom String abgeschnitten
    24. Umbruch = InStr(buf, Chr(10)) '
    25. buf = Right(buf, Umbruch) '"Linearität (r²)..." wird vom String abgeschnitten
    26. Umbruch = InStr(buf, Chr(10)) '
    27. buf = Right(buf, Umbruch) '"Ergebnis..." wird vom String abgeschnitten
    28. Umbruch = InStr(buf, Chr(10)) '
    29. buf = Right(buf, Umbruch) 'Leerzeile wird vom String abgeschnitten
    30. Do
    31. Tabulator = InStr(buf, vbTab) 'der Tabulator zwischen Zeitpunkt und Absorption wird gesucht
    32. Zeit = Left(buf, Tabulator) 'Der Bereich links vom ersten Tabulator ist die erste Messzeit
    33. Sheets("Tabelle1").Cells(zeile_idx, spalte_idx).Value = Zeit 'Zeit wird in Zelle B2 geschrieben
    34. spalte_idx = spalte_idx + 1 'spalte_idx wird um 1 erhöht
    35. buf = Right(buf, Tabulator) 'buf ist nun nur noch alles rechts vom ersten Punkt
    36. Umbruch = InStr(buf, Chr(10)) 'restlicher Datenstring wird nach dem nächsten Zeilenumbruch durchsucht
    37. Absorption = Left(buf, Umbruch - 1) 'alles links vom Zeilenumbruch ist die Absorption
    38. Sheets("Tabelle1").Cells(zeile_idx, spalte_idx).Value = Absorption 'Absorption wird in Zelle C2 geschrieben
    39. buf = Right(buf, Absorption)
    40. zeile_idx = zeile_idx + 1 '
    41. spalte_idx = spalte_idx - 1 'zeile_idx und spalte_idx werden angepasst
    42. Loop
    43. End Select
    44. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „japhwil“ ()

    japhwil schrieb:

    Von daher muss auch ein Zeilenumbruch auftauchen
    Offensichtlich tut er das wohl nicht. Oder etwas anderes kommt nicht wie erwartet.
    Wenn der Debugger doch schon an der richtigen Stelle stoppt, dann schau doch einfach deine Variablen an.
    Es wird wohl schon einen Grund geben.

    japhwil schrieb:

    Die Datenstrings sind immer identisch nach dem Schema in der Textdatei aufgebaut.
    Und da vertraust du blind drauf?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Und da vertraust du blind drauf?

    Ich sehe nicht, was mir anderes übrig bleibt. Für mein Makro brauche ich schließlich einen "Muster-String".
    Ich habe allerdings auch schon diverse Strings mit dem Terminalprogramm aufgezeichnet und bisher immer den gleichen Aufbau erhalten.

    Tatsächlich lag es wohl an dem "-1", das habe ich jetzt einfach rausgenommen, da es ohnehin unnötig war.

    Damit ist es aber immer noch nicht geschafft... Jetzt bekomme ich einen "Laufzeitfehler 13" in Zeile 51. :thumbdown:

    Außerdem wundere ich mich, dass in meinem Excel-Sheet noch überhaupt nichts ankommt, obwohl ja eigentlich zumindest die erste Zeile schon fertig sein müsste. Oder irre ich mich da? Habe leider bis jetzt noch überhaupt keine Erfahrung mit VBA und Makros im Allgemeinen.
    Ja, musst halt die Werte prüfen, bevor du sie auf Funktionen loslässt.

    Schau Dir die Werte an und Du wirst den Fehler schon finden.

    Oben bei Ansich das Direktfenster öffnen und dann im Code

    Quellcode

    1. debug.print "Variable:" & Variable


    lässt deren Namen und Inhalt im Direktfenster ausgeben.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Ich habe mich jetzt nochmal ausführlich mit dem Makro auseinandergesetzt und es jetzt endlich zum Laufen gebracht.
    Im Wesentlichen lag es daran, dass ich die Right()-Funktion verwendet habe, wo ich eigentlich Mid() gebraucht hätte. So habe ich mir schon ganz am Anfang den String zerschossen...
    Dazu kamen dann noch ein paar Detailverbesserungen.

    Für alle Interessierten hier das fertige Projekt:

    Visual Basic-Quellcode

    1. Dim zeile_idx As Integer
    2. Dim spalte_idx As Integer
    3. Dim Absorption As Single
    4. Dim Zeit, s, Tabulator, Umbruch As Integer
    5. Dim buf As String
    6. Private Sub StrokeReader1_CommEvent(ByVal Evt As StrokeReaderLib.Event, ByVal data As Variant)
    7. zeile_idx = 2
    8. spalte_idx = 1
    9. Select Case Evt
    10. Case EVT_DISCONNECT '
    11. MsgBox "Keine Verbindung :(" '
    12. '
    13. Case EVT_CONNECT '
    14. MsgBox "Verbunden" '
    15. '
    16. Case EVT_DATA 'Verschiedene Events werden unterschieden
    17. buf = buf + data 'Daten vom Photometer werden als "buf" zusammengefasst
    18. s = "Ergebnis" '
    19. Ergebnis = InStr(buf, s) '
    20. buf = Mid(buf, Ergebnis + 21) '"Einleitungstext" wird abgeschnitten
    21. Do
    22. Sheets("Tabelle1").Cells(1, 1).Value = "Zeit" '
    23. Sheets("Tabelle1").Cells(1, 2).Value = "Absorption" 'Tabellenbeschriftung
    24. Tabulator = InStr(buf, vbTab) 'der Tabulator zwischen Zeitpunkt und Absorption wird gesucht
    25. Zeit = Left(buf, Tabulator - 1) 'Der Bereich links vom ersten Tabulator ist die erste Messzeit
    26. Sheets("Tabelle1").Cells(zeile_idx, spalte_idx).Value = Zeit 'Zeit wird eingetragen
    27. spalte_idx = spalte_idx + 1 'spalte_idx wird um 1 erhöht
    28. buf = Mid(buf, Tabulator + 1) 'buf ist nun nur noch alles rechts vom ersten Punkt
    29. Umbruch = InStr(buf, Chr(10)) 'restlicher Datenstring wird nach dem nächsten Zeilenumbruch durchsucht
    30. Absorption = Left(buf, Umbruch - 2) 'alles links vom Zeilenumbruch ist die Absorption
    31. Sheets("Tabelle1").Cells(zeile_idx, spalte_idx).Value = Absorption 'Absorption wird eingetragen
    32. buf = Mid(buf, Umbruch + 1)
    33. zeile_idx = zeile_idx + 1 '
    34. spalte_idx = spalte_idx - 1 'zeile_idx und spalte_idx werden angepasst
    35. If Len(buf) = 0 Then
    36. Exit Do
    37. End If
    38. Loop
    39. End Select
    40. End Sub