Werte von der Seriellen Schnittstelle in Excel schreiben

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Werte von der Seriellen Schnittstelle in Excel schreiben

    Hallo an die Gemeinde!

    Ich bin ein wenig in die Programmierung von Seriellen Schnittstellen eingetaucht und habe nun folgendes vor:

    Ich erhalte durch einen Sendebefehl an eine vordefinierte Schnittstelle Daten in meinem vb.net Programm.
    Diese versuche ich ins Excel zu schreiben was auch funktioniert.
    Allerdings würde ich gerne den ersten erhaltenen Wert in Zelle 1, den zweiten in Zelle 2 und den dritten in Zelle 3 schreiben.
    Wenn er nochmal Werte erhaltet soll er wieder in die Zelle 1 schreiben usw....

    mein bisheriges schnippsel schaut so aus:

    VB.NET-Quellcode

    1. 'Messuhr 2 Eingang
    2. Private Sub SerialPort4_Input(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort4.DataReceived
    3. Dim line6 As String = CStr(SerialPort4.ReadLine)
    4. Me.Invoke(Sub() ReceivedText7(line6))
    5. End Sub
    6. 'Messuhr 2 Eingang verabreiten
    7. Private Sub ReceivedText7(ByVal [text] As String)
    8. ''RichTextBox7.Text = [text]
    9. 'Code ab hier ist für in Excel schicken
    10. Dim xlDateipfad As String = "S:\Technik\Sondermaschinenbau\ÖBB\019401-Messvorrichtung Achslager\06 Dokumentation"
    11. Dim xlDateiname As String = "\MWP.xlsm"
    12. Dim strFilename As String = xlDateipfad & xlDateiname
    13. Dim Messuhr2 = [text]
    14. Dim xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)
    15. xlApp.Visible = True
    16. Dim xlWorkbook As Excel.Workbook
    17. For Each w As Excel.Workbook In xlApp.Workbooks
    18. If w.Name = (xlDateipfad & xlDateiname) Then
    19. xlWorkbook = w
    20. xlWorkbook.Activate()
    21. End If
    22. Next
    23. Dim xlWorksheet1 As Excel.Worksheet = CType(xlApp.ActiveWorkbook.Sheets("Oberfläche"), Excel.Worksheet)
    24. With xlApp
    25. With xlWorksheet1 'Register: Oberflaeche
    26. .Activate()
    27. .Columns.AutoFit()
    28. End With
    29. .Range("B30:D30").Select()
    30. .ActiveCell.Value = Messuhr1
    31. .ActiveCell.Offset(0, 1).Activate()
    32. .ActiveCell.Value = Messuhr1
    33. .ActiveCell.Offset(0, 1).Activate()
    34. .ActiveCell.Value = Messuhr1
    35. End With
    36. End Sub


    Bei obigen Code wird in alle 3 Zellen der Wert geschrieben beim Empfang der Daten...
    Hat jemand eine Idee?
    lg Aleks

    *Topic verschoben*

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

    An meinem Seriellen Port hängt eine Messuhr die mittels Knopfdruck einen Wert sendet.
    Diesen Wert schreibe ich in eine Excel Zelle.
    Der Vorgang findet insgesamt 3 mal statt und soll die jeweiligen Werte in 3 verschiedene Zellen schreiben und dann wieder in die erste Zeile springen und dort wieder schreiben.
    @Aleksander Trenne die Probleme:
    1. Werte vom seriellen Port einlesen
    2. (andere) Werte in Excel eintragen.
    Löse beides unabhängig voneinander, und wenn es klappt, setze beide Teile zusammen. 8o
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hmm, also ich habe mal folgenden Lösungsansatz:
    Ich sende meine Werte in ein neues Tabellenblatt wo mein Excel dann auf die notwendigen Zellen drauf zugreift.
    -> Hierbei wäre eben hilfreich dass überall 0 drinnen steht und dann die erste 0 überschrieben wird, dann die zweite, usw...
    ;( ein Problem führt zur alternativen Lösung welches wieder zu neuen Problemen führt...
    Ich werd mal wieder Internet schmökern, vielleicht find ich iwo schnippsel die mir helfen?

    VB.NET-Quellcode

    1. 'Temperaturwert Eingang verarbeiten
    2. Private Sub ReceivedText1()
    3. Dim btr As Integer = CInt(SerialPort1.BytesToRead)
    4. Dim input(btr) As Byte
    5. SerialPort1.Read(input, 0, btr)
    6. Dim Ergebnis As UInteger = CUInt(String.Format("&H{3:X2}{4:X2}", input(0), input(1), input(2), input(3), input(4), input(5), input(6)))
    7. Dim Ergebnismitkomma As Decimal = CDec(Ergebnis / 10)
    8. Dim Ergebnisdecimal As Decimal = CDec(String.Format("{0:C1}", Ergebnismitkomma))
    9. RichTextBox1.Text = CStr(Ergebnisdecimal)
    10. 'Code ab hier ist für in Excel schicken
    11. Dim Temperatur = CStr(Ergebnisdecimal)
    12. xlApp.Visible = True
    13. xlWorksheet.Activate()
    14. Dim reihekalibrierung = xlWorksheet.Cells(xlWorksheet.Rows.Count, 1).End(Excel.XlDirection.xlUp).Offset(1).Row
    15. xlWorksheet.Cells(reihekalibrierung, 1).Value = Temperatur
    16. Dim reihemessung = xlWorksheet.Cells(xlWorksheet.Rows.Count, 2).End(Excel.XlDirection.xlUp).Offset(1).Row
    17. xlWorksheet.Cells(reihemessung, 2).Value = Temperatur
    18. xlWorksheet.Columns.AutoFit()
    19. End Sub

    Aleksander schrieb:

    VB.NET-Quellcode

    1. Dim Ergebnisdecimal As Decimal = CDec(String.Format("{0:C1}", Ergebnismitkomma))
    Was ganz genau soll diese Zeile machen?
    Was macht sie tatsächlich?
    ====
    Befülle in einem ersten Schritt alle Zellen mit 0
    und in einem zweiten Schritt die betroffenen Zellen mit Werten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    die Zeile macht dass ich bei einer ganzen Zahl zB.: 20 -> 20,0 erhalte
    Bei 20,1 stimmt das Ergebnis allerdings möchte ich die Werte in ihrer Auflösung erhalten.

    Zu meinem ersten Schritt:
    die Zellen mit 0 füllen ist zwar möglich, allerdings funktioniert dann das Werte fortlaufend untereinander schreiben nicht mehr
    gibt es da eine Möglichkeit einfach zu sagen "fange in der Spalte 1, Zeile 2 an und setze in Spalte 1, Zeile 3 fort usw...?
    gibt es da eine Möglichkeit einfach zu sagen "fange in der Spalte 1, Zeile 2 an und setze in Spalte 1, Zeile 3 fort usw...?


    VB.NET-Quellcode

    1. ...
    2. dim z as integer = 2
    3. cells(z, 1).value = Temperatur
    4. z += 1
    5. ...


    Der Vorgang findet insgesamt 3 mal statt und soll die jeweiligen Werte in 3 verschiedene Zellen schreiben und dann wieder in die erste Zeile springen und dort wieder schreiben.

    VB.NET-Quellcode

    1. ...
    2. dim z as integer = 2
    3. cells(z, 1).value = Temperatur
    4. z += 1
    5. if z > 4 then z = 2
    6. ...



    uıǝlɹǝıǝ

    Aleksander schrieb:

    die Zeile macht dass ich bei einer ganzen Zahl zB.: 20 -> 20,0 erhalte

    RodFromGermany schrieb:

    Was macht sie tatsächlich?
    Die Werte Ergebnismitkomma und Ergebnisdecimal sind identisch!
    Du verwechselst wahrscheinlich das Runden einer Zahl (Ergebnis ist ein numerischer Wert vom selben Typ wie die Ausgangszahl) mit dem Formatieren einer Zahl, deren Ergebnis ein String ist. 8o
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo an euch!
    Das mit nach Excel schreiben hab ich nun etwas künstlerisch gelöst (=
    Ich bin her gegangen und lese den Inhalt der Zellen wo der erhaltene Text hingesendet werden soll:

    VB.NET-Quellcode

    1. If OrtMesstaster1wert1.value Is Nothing Then
    2. OrtMesstaster1wert1.value = Messtaster1
    3. ElseIf OrtMesstaster1wert2.value Is Nothing Then
    4. OrtMesstaster1wert2.value = Messtaster1
    5. End If

    Das reicht für meine Testversuche mal^^

    Um die Frage von @RodFromGermany
    ich habe das nun in eine Zeile gepackt:

    VB.NET-Quellcode

    1. Dim btr As Integer = CInt(SerialPort1.BytesToRead)
    2. Dim input(btr) As Byte
    3. SerialPort1.Read(input, 0, btr)
    4. Dim Temperatur As Decimal = String.Format("{0:C1}", String.Format("&H{3:X2}{4:X2}", input(0), input(1), input(2), input(3), input(4), input(5), input(6)) / 10)
    5. RichTextBox1.Text = CDec(Temperatur)

    Ich hab allerdings immer noch manchmal ein Problem mit dem von dir erwähnten Exeption:
    <a href="https://www.vb-paradise.de/index.php/Thread/129041-per-klick-auf-werte-von-com-port-zugreifen/?postID=1118161#post1118161">per klick auf werte von com port zugreifen</a>
    @Aleksander Was sollen die beiden String.Format-Ausdrücke ineinander? Korrigiere diese Zeile.
    Welche Exception?
    Und:
    Option Strict On.
    Visual Studio - Empfohlene Einstellungen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!