mikrocontroller.net

Forum: PC-Programmierung Probleme mit VBA (EXCEL)


Autor: H_S (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich bekomme von einer Hardware per RS232 einen String mit 60 Zeichen
zurück. Siehe Anhang.
Der String beinhaltet wie gesagt die 60Zeichen.
Wie kann ich in VBA einen String in ein Array (Interger oder
Char)kopieren ?

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genauso wie in Basic ueblich, such mal in der Hilfe nach mid und chr

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn du sowas blockartiges hast schau dir gleichmal "split" an ;)

das kann dir glaubich das leben auch noch erleichtern...

73

Autor: H_S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dim text_ascii  As String
Dim data() As String
ReDim data(60)

text_ascii = "341123kjlhasdd1234" 'Als Beispiel

data = Split(text_ascii, ",")
Worksheets("Tabelle1").Cells(1, 1) = data(1)

...und da erscheint in EXCEL eine Fehlermeldung:
Laufzeitfehler '9'.Index außerhalb des gültigen Bereiches

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könntest du mal beschreiben,was du denkst, was die von dir geschriebenen
VBA Zeilen eigentlich tun (sollen)?

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das mit dem Laufzeitfehler ist klar.
wenn du split verwendest, dann muss der trenner, in deinem Beispiel
"," auch im String vorhanden sein, ansonnsten wird der gesamte string
in das element 0 deines Stringarrays geschrieben.

Wenn dein Antwortstring immer die gleiche Länge hat und du auch weißt,
an welcher Position du welche Daten erwartest, dann verwende den Mid
befehl.

mfg
Thomas

Autor: H_S (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab es jetzt mal so versucht.
Damit bin ich aber nicht ganz zufrieden.
Ich weiss nicht wie man in EXCEL (VBA) das Abschlusszeichen eines
Strings feststellen kann.
Das Problem ist, dass die Hardware immer einen String sendet aber
unterschiedlich lang. z.B. manchmal 55 Zeichen dann wieder 100 Zeichen.
Mein VBA Programm soll das Abschluss zeichen detektieren können und dann
die Schleife verlassen. Wie kann ich das machen?

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was hast du denn für eine Hardware?
bei der seriellen übertragung gibt es immer ein Protokoll.
wenn du das protokoll nicht kennst, dann kannst du ja den empangenen
string nicht auswerten.
schreib mal, was du dranhängen hast, vieleicht kommen wir dann weiter

Autor: Claes G Lindblad (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Hm... Meinst du so etwas?

MfG
Claes in Lund, Schweden
claesg (at) algonet.se

Autor: H_S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es werden immer 51 Zeichen gesendet.Darin ist auch die
Stringterminierung vorhanden. An der Hardware kann ich nix verändern.
Die Hardware ist so ausgelegt das ich immer nur Daten von der seriellen
Schnittstelle lesen kann.
Der Abschluss eines Strings besteht doch aus den beiden Zeichen oder?
ASCII Werte: 10 13
WIe kann ich in EXCEL VBA die beiden Zeichen abfragen?

Autor: H_S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das sendet die Hardware.

23456 4444 FA FF 33 44 77 23

Das heisst nach der 23 muss ich auf "\0" (Enderkennung) prüfen.
Wie geht das in VBA EXCEL?

In C ist das kein Problem.

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probiers mal so:

dim Buffer as string

Private Sub UserForm_Initialize()

MSComm1.CommPort = 1
MSComm1.Settings = "4800,E,7,1"
MSComm1.RThreshold = 1
MSComm1.PortOpen = True

end sub

Private Sub UserForm_Terminate()
 On Error Resume Next
   MSComm1.Close

End Sub

Private Sub MSComm1_OnComm()

Dim strArray() As String
Dim tmpbuffer As String
 Select Case MSComm1.CommEvent

    Case comEventBreak  ' A Break was received.
           Label1.Caption = "Break"
        Case comEventCDTO   ' CD (RLSD) Timeout.
           Label1.Caption = "CD Timeout"
        Case comEventCTSTO  ' CTS Timeout.
           Label1.Caption = "CTS Timeout"
        Case comEventDSRTO  ' DSR Timeout.
           Label1.Caption = "DSR Timeout"
        Case comEventFrame  ' Framing Error
           Label1.Caption = "Frame Error"
        Case comEventOverrun    ' Data Lost.
           Label1.Caption = "Data Lost"
        Case comEventRxOver ' Receive buffer overflow.
           Label1.Caption = "RX Overflow"
        Case comEventRxParity   ' Parity Error.
           Label1.Caption = "Parity Error"
        Case comEventTxFull ' Transmit buffer full.
           Label1.Caption = "TX Full"
        Case comEventDCB    ' Unexpected error retrieving DCB
           Label1.Caption = "DCB Error"
        Case comEvSend '1 Send event.

        Case comEvCD '5 Change in carrier detect line.

        Case comEventTxFull

        Case comEvReceive '2 Receive event.


                buffer = buffer & MSComm1.Input
                tmpPos = InStr(1, buffer, vbLf) '  2. endzeichen
überprüfen
                If tmpPos > 0 Then    ' da ist ein VBLF drin, also
verarbeiten
                    strArray = Split(buffer, vbCr & vbLf)
                    For cnt = 0 To UBound(strArray()) - 1 'nur bis zum
vorletzten Array, da das letzte schon weider was vom neuen enthalten
könnte
                        ' hier die empfangenen Daten splitten und
verschicken
                    Next cnt
                    buffer = strArray(UBound(strArray()))
               End If
        End Select

End Sub




Wenn du net zurechtkommst, dann schick einfach mal das Excelfile

mfg thomas

Autor: oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
habe ein aehnliches Problem, nur, dass ich vorher noch eine Anfrage
senden muss. Und da liegt das Problem. Ich habe zwar die
Telegramstruktur, aber keine Ahnung, wie ich das Ganze ueber die
serielle Schnittstelle schicke.

Kann mir da vielleicht jemand helfen?

Die Struktur ist folgende:

ESC - Escape           1BH
DBx - Data Byte Nr. x  >= 20H
CR  - Carriage Return  0DH
LF  - Line Feed        0AH
BCC - Checksum Byte    >= 20H

Fuer weitere Info bitte mailen.
DAnke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.