Gibt es eine Möglichkeit in EXCEL auf die RS232 zuzugreifen? Wenn ja, wo finde ich einen Beispielcode?
Ja, gibt es.. Ist leider recht kompliziert.. aber machbar Ich selbst habe es mal versucht aber nicht geschafft das laeuft ueber VBS bzw die Makroprogrammierung von Excel
Ja kannst du mir mal deinen Versuche per E-Mail zusenden? Gibt es niemand der so was schon mal gemacht hat?
Keine Ahnung davon, nur gerade eben drüber gestolpert: http://www.mikrocontroller.net/forum/read-4-194813.html
Danke für den Link. Ich habe jetzt mal die XLS Datei geöffnet. Es erscheint Folgende Fehlermeldung: Laufzeitfehler '429' Objekterstellung durch ActiveX-Komponente nicht möglich. Ich muss wahrscheinlich die MScomm installieren, oder?
Du musst gar nichts installieren. Nur die Windows-Funktionen Openfile,
Readfile und Writefile aufrufen. HAbe ich schon mehrfach gemacht. Unten
habe ich Dir mal eine Funktion zum Öffnen der seriellen Schnittstelle
reinkopiert. Du darfst nur nicht ständig die Schnittstelle abfragen ob
Zeichen gekommen sind. Dann funktioniert Deine Excel-Anwendung nicht
mehr. Am besten über einen Timer zyklisch aufrufen.
Type DCB '' patched to proper definition VB32 ill-def DR
DCBlength As Long
BaudRate As Long
fdwFlags As Long ' bit field in C
wReserved1 As Integer
XonLim As Integer
XoffLim As Integer
ByteSize As String * 1
Parity As String * 1
StopBits As String * 1
XonChar As String * 1
XoffChar As String * 1
ErrorChar As String * 1
EofChar As String * 1
EvtChar As String * 1
wReserved2 As Integer
End Type
Type COMMTIMEOUTS
ReadIntervalTimeout As Long
ReadTotalTimeoutMultiplier As Long
ReadTotalTimeoutConstant As Long
WriteTotalTimeoutMultiplier As Long
WriteTotalTimeoutConstant As Long
End Type
Type COMSTAT
fCtsHold As Long
fDsrHold As Long
fRlsdHold As Long
fXoffHold As Long
fXoffSent As Long
fEof As Long
fTxim As Long
fReserved As Long
cbInQue As Long
cbOutQue As Long
End Type
' kernel defined constants
'
Public Const OPEN_EXISTING = 3
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const INVALID_HANDLE_VALUE = &HFFFF
Public Const MAXDWORD = &HFFFF
' comms Constants
'
Public Const PURGE_TXCLEAR = &H4
Public Const PURGE_RXCLEAR = &H8
Public Const CE_RXOVER = &H1 ' Receive Queue overflow
Public Const CE_OVERRUN = &H2 ' Receive Overrun Error
Public Const CE_RXPARITY = &H4 ' Receive Parity Error
Public Const CE_FRAME = &H8 ' Receive Framing error
Public Const CE_BREAK = &H10 ' Break Detected
Public Const CE_TXFULL = &H100 ' TX Queue is full
Public Const SETRTS = 3 ' Set RTS high
Public Const SETDTR = 5 ' Set DTR high
' kernel API file i/o functions
'
Declare Function CreateFile Lib "kernel32" Alias "CreateFileA"
(ByVal _
lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode
As _
Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition
As _
Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long)
As _
Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Declare Function GetLastError Lib "kernel32" () As Long
Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long,
lpBuffer As _
Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As
Long, _
ByVal lpOverlapped As Long) As Long
Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long,
lpBuffer As _
Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long,
ByVal _
lpOverlapped As Long) As Long
Declare Function CreateThread Lib "kernel32" _
(lpThreadAttributes As Any, ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, ByVal lParameter As Long, _
ByVal dwCreationFlags As Long, lpThreadID As Long) As _
Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As
Long)
Public Declare Function TerminateThread Lib "kernel32" (ByVal hThread
As Long, ByVal dwExitCode As Long) As Long
' Win32 comms functions
'
Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long,
lpDCB _
As DCB) As Long
Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long,
_
lpCommTimeouts As COMMTIMEOUTS) As Long
Declare Function PurgeComm Lib "kernel32" (ByVal hFile As Long, ByVal
_
dwFlags As Long) As Long
Declare Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA"
(ByVal _
lpDef As String, lpDCB As DCB) As Long
Declare Function SetCommMask Lib "kernel32" (ByVal hFile As Long,
ByVal _
dwEvtMask As Long) As Long
Declare Function ClearCommError Lib "kernel32" (ByVal hFile As Long,
_
lpErrors As Long, lpStat As COMSTAT) As Long
Declare Function SetupComm Lib "kernel32" (ByVal hFile As Long, ByVal
_
dwInQueue As Long, ByVal dwOutQueue As Long) As Long
Declare Function EscapeCommFunction Lib "kernel32" (ByVal nCid As
Long, _
ByVal nFunc As Long) As Long
Declare Function GetCommMask Lib "kernel32" (ByVal hFile As Long,
lpEvtMask _
As Long) As Long
Declare Function GetCommModemStatus Lib "kernel32" (ByVal hFile As
Long, _
lpModemStat As Long) As Long
Declare Function WaitCommEvent Lib "kernel32" (ByVal hFile As Long,
_
lpEvtMask As Long, ByVal lpOverlapped As Long) As Long
Public Function OpenComPort(strPortName As String, _
strSettings As String, _
lPortHandle As Long) _
As Boolean
Dim tCto As COMMTIMEOUTS
Dim tDcb As DCB
Dim hPort As Long
Dim fRet As Boolean
'
' set the length field of the DCB
'
tDcb.DCBlength = Len(tDcb)
'
' get kernel to build a default DCB for us
' based on com settings string
'
Call BuildCommDCB(strSettings, tDcb)
'
' open that com port
'
hPort = CreateFile(strPortName, _
GENERIC_READ + GENERIC_WRITE, _
0, _
0, _
OPEN_EXISTING, _
0, _
0)
'
' did we get port open ...
'
If hPort = INVALID_HANDLE_VALUE Then
'
' ... no, get the error code from kernel
'
Dim lErr As Long
lErr = GetLastError()
Debug.Print "Failed to open comport( err = " & CStr(lErr) &
")"
'
' setup returns for failure
'
fRet = False
lPortHandle = INVALID_HANDLE_VALUE
Else
'
' ... yes, get port ready for action
'
'
' set port state using DCB we built earlier
'
Call SetCommState(hPort, tDcb)
'
' set up buffer sizes and re-initialize comm driver
'
Call SetupComm(hPort, 64000, 64000) ' hPort, InQue, OutQue
'
' setup timeout parameters for this port
'
tCto.ReadIntervalTimeout = MAXDWORD '' return with
whatever is available
tCto.ReadTotalTimeoutMultiplier = 0
tCto.ReadTotalTimeoutConstant = 0
tCto.WriteTotalTimeoutMultiplier = 0
tCto.WriteTotalTimeoutConstant = 10000 '' max 10 secs to
write data, just to stop locking
'' up application
if we gowrong
Call SetCommTimeouts(hPort, tCto)
'
' turn on DTR / RTS
'
Call EscapeCommFunction(hPort, SETDTR)
Call EscapeCommFunction(hPort, SETRTS)
'
' setup returns for success
'
fRet = True
lPortHandle = hPort
End If
OpenComPort = fRet
End Function
So habe ich das dann aufgerufen.
Sub Workbook_Open()
PortName = "Com2"
Settings = "baud=2400 parity=E data=7 stop=1"
CloseComPort (PortHandle)
Rueckgabe = OpenComPort(PortName, Settings, PortHandle)
If Rueckgabe = True Then
Modul1.Zeitanzeige
Else
MsgBox "serielle Schnittstelle zur Waage konnte nicht geöffnen
werden"
Application.Quit
End If
Hallo AndreasH, danke für den Code. Kannst du mir deine Excel Datei hier ins Forum reinposten? MFG
Ich habe im Internet eine Beispiel XLS Datei gefunden. Wenn ich auf ausführen drücke erscheint eine Fehlermeldung: Die Makros in diesem Projekt sind deaktiviert. Ja wie kann ich die Makros aktivieren
Ich habe in meiner Anwendung mal einen Button plaziert. Wie kann ich auf das Modul --> ComPort zugreifen? Ich brächte da mal ein Beispiel wie ich dann den Port öffnen kann.
Hallo Mirko, ich kann Dir die Datei nicht zur verfügung stellen weil ich die für einen Kunden von mir gemacht habe, dem der Quellcode zusteht. Du musst in Excel, ich meine in den Optionen, einstellen, dass Makros aktiviert bzw. nur auf Nachfrage aktiviert werden. Ansonsten passt das schon was ich mir im Groben angesehen habe. Zugreifen kannst du auf den comport mit Rueckgabe = ReadComPort(PortHandle, Data, bRead, bToRead) Grüße Andreas
http://www.mikrocontroller.net/forum/read-1-237681.html#237681 es kann passieren, dass auch fehlgeleitete Posts beantwortet werden!!! Vielen Dank für deine Reaktion ---
Hallo Axel,
vielen Dank für deine Unterstützung.
Leider bin ich in VBA nicht so sehr gut.
Ich bekomme es einfach nicht hin. Ich möchte wie gesagt
wenn ich einen Button drücke (den ich im Arbeitsblatt eingefügt habe)
nur mal den ComPort öffnen und mal ein Zeichen empfangen.
Ich bekomme das nicht gebacken.
Zuerst mus ich doch das so machen, oder?
ComPort.OpenComPort ("COM1","settings....",PortHandle)
Ja und bei PortHandle da habe ich Probleme.
Wie kann ich korrekt vom ComPort Modul zugreifen?
Hallo, @AndreasH. Super Quellcode. Ich hab' recht lang im Internet gestöpert um via Excel VBA die UART-Schnittstelle zu bedienen. Ohne Erfolg. Erst dieser Thread hier hat es mir ermöglicht. Manchmal Frage ich mich schon wie man auf den obigen Quellcode kommen soll. Verstanden habe ich ihn sofort als ich ihn gesehen habe. Aber drauf kommen ohne copy and paste .... Mhhh..
Hallo Bruno, habe ich mir selber aus den intnet gezogen und abgeändert. Woher weiss ich nicht mehr. Im Prinzip sind dass alles Standard-Windows-Funktionen. Exakt dasselbe habe ich schon in Delphi wie auch in C++ gemacht. Von daher kein grosses Geheimnis. Man muss nur wissen wie man in VBA die PArameter übergibt. Grüße Andreas
Hab mir mal die Datei ComPort.xls heruntergeladen. Ich komme bisher nicht damit zurecht. In meinem Excel Formular hab ich mal ein Button plaziert, mit dem wollte ich nur mal den Com Port 1 öffnen. Klappt nicht! Wie kann ich beim button click auf die Funktionen zugreifen?
Private Sub CommandButton1_Click()
ComPort.OpenComPort ("COM2","baud=19200 parity=E
data=7 stop=1",PortHandle)
End Sub
EXCEL VBA meckert da immer.Grrr...was mache ich da falsch?
Wie müsste es richtig heissen?
Hallo, also Dein Aufruf schein richtig zu sein. Wie lautet den die Fehler Meldung? Hast Du auch die kernel Funktionen im selben Modul? Aber wie gesagt poste mal die exakte Fehlermeldung. Sebastian B.
Hab es geschafft es ... funktioniert! Ich kann jetzt von meiner ext. Hardware Daten Empfangen. Diese Daten erscheinen bei mir in EXCEL: 8úËúôôÿýôõ¬c!¤C¤c1¬ ZLÿJÎ Þ)áúúþúþÿÿÿÿ¬#%¬ã5oÜiíìÞ|óÏôöþÿ ÿÿÿÿþ¬c Ich habe soeben erfahren das diese ext. Hardware ASCII Zeichen sendet. Das ganze wird dann immer mir \0 abgeschlossen. Leider weiss nicht wie man diese ASCII Zeichen in VBA (EXCEL) umwandeln kann (HEXFORMAT).
Also ich bin wirklich kein VBA Profi, aber die Excel Hilfe spuckt zu den Thema folgendes aus. Typ-Umwandlungsfunktionen Jede Funktion legt für einen bestimmten Datentyp zwingend einen Ausdruck fest. Syntax CBool(Ausdruck) CByte(Ausdruck) CCur(Ausdruck) CDate(Ausdruck) CDbl(Ausdruck) CDec(Ausdruck) CInt(Ausdruck) CLng(Ausdruck) CSng(Ausdruck) CVar(Ausdruck) CStr(Ausdruck) Das erforderliche Argument Ausdruck ist ein Zeichenfolgenausdruck oder ein numerischer Ausdruck.
Hallo, ich habe auch mal eine Frage zu diesem Thema. Ich möchte mit einem Barcodecanner arbeiten, der an die serielle Schnittstelle (com2) angeschlossen ist. Vom Hersteller habe ich die Konfigurationssoftware herunter geladen, da ist ein Terminal Programm bei. In diesem werden meine Daten, also die Ziffernfolge meines EAN Codes korrekt ausgegeben. Nur nützt mir das nichts, ich möchte direkt in Excel scannen. Ich habe aber keinerlei programmiertechnische Kenntnisse. Codes einfügen und anpassen, das schaffe ich wohl noch. Vielen Dank fr jede Hilfe.
Beitrag #5787481 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
