Hallo,
ich würde gerne einen USB-AD-Wandler auslesen. Dieser wird über die
"libadx.ocx" angesprochen. Für Visual Basic ist nachfolgendes
Beispielprogramm enthalten. Ich hab die "libadx.ocx" Datei bereits über
regsvr32.exe registriert.
Jetzt wäre meine Frage, wie kann ich die Funktionen dieser Datei auch in
VBA verwenden? Wie initalisiere ich die Datei?
Gruß Tobi
Object = "{FFE1D535-EC3C-40CF-B51D-A9F23819E524}#1.0#0"; "libadx.ocx"
Begin VB.Form MainForm
Begin LIBADX.LIBADX LIBADX1
Height = 225
Left = 3840
TabIndex = 2
Top = 600
Width = 240
_Version = 65536
_ExtentX = 423
_ExtentY = 397
_StockProps = 0
End
End
Option Explicit
Const SAMPLES As Integer = 1000
Const PATH As String = "scan1.lfx"
Private Sub Start_Click()
If Not LIBADX1.Open(Device.Text) Then
MsgBox "Konnte Messsystem " & Device.Text & " nicht öffnen"
Exit Sub
End If
Start.Enabled = False
'100Hz abtastrate, 1000 samples (= 1 sec.)
LIBADX1.ScanPrepare 0.01, SAMPLES
'kanal 1 & 2 speichern
LIBADX1.ScanAnalogIn 1, 0
LIBADX1.ScanAnalogIn 2, 0
'Scan durchführen
LIBADX1.Scan
'Scan speichern
If Not LIBADX1.ScanSave(PATH) Then
MsgBox "Messdatei " & PATH & " konnte nicht angelegt werden"
Exit Sub
End If
MsgBox "Scan unter " & PATH & " gespeichert"
Start.Enabled = True
End Sub
Mahlzeit, prinzipiell ist das möglich, gibt aber eventuell einige Hürden
wegen der Datenumwandlung.
Möglichkeit 1, du verwendest eine Form in vba, der darfst du auch OCX'n
aufpinseln (Steuerelemente), ggf muß dies mittels zusätzliche
Steuerelemente deinem Projekt bekannt gemacht werden. Dies währe der
leichteste Weg.
Vorteil - Eigenschaften/Aufzählungen/Funktionen sind in der
Autoverfollständigung enthalten
Nachteil - kann Ärger bei neuer OCX (neuerer Version) geben, eventuell
lässt sich das Projekt nicht mehr öffnen
Möglichkeit 2, dynamisch erstellen,
Vorteil : gibt den Versionsärger nicht, ist in allen Modulen einbindbar
Nachteil : da es ein dynamisches Objekt ist (late bind), muß man die
Funktionen und variablen / parameter kennen.
Beispiel
Dim oObject As Object
set oObject =
CreateObject("{FFE1D535-EC3C-40CF-B51D-A9F23819E524}#1.0#0")
' Teilweise haben die auch richtige Namen, eventuell mal in der registry
'nach dem Schlüsselwert suchen
' Name ist meist sowas wie LIBADX.LIBADX1 oder ähnlich
' Createobject erzeugt ein com Objekt mit dem übergebenen Namen bzw. der
ID
If Not oObject Is Nothing Then
oObject.ScanAnalogIn 1, 0
End If
set oObject = nothing
Hi Thom, kannst du mehr zu dem Thema sagen, das würde mich auch interessieren? In deinem Beispiel werden ja keine Objekteigenschaften angefasst. Wenn ich jetzt unter VS2008 ein .Net Klassenmodul als OCX erstelle, kann ich das dann als Objekt unter VBA instanzieren? (ist das so richtig ausgedrückt?) Wie sehen die Objekteigenschatfen dann aus? Grüße, Stefan
>In deinem Beispiel werden ja keine Objekteigenschaften angefasst.
Sorry, muss mich korrigieren - du hast ja mit
1 | oObject.ScanAnalogIn 1, 0 |
einen Zugriff auf eine Objekteigenschaft dargestellt. Sind die denn der IntelliSense bekannt?
@Exce(l)ntriker Mal soviel, eine OCX ist eigentlich eine Unterart eines COM Objektes, welche aus Kompatibilitätsgründen noch unterstützt wird, wenn man aber gezielt für neuere Plattformen entwickelt, sollte man sich den Einsatz gut überlegen. Soweit die Teile nun mal vorhanden sind, kann man Sie noch benutzen. Deshalb werden die auch noch in VS2008 unterstützt. Prinzipiell kannst Du deine mit VS2008 (das muß nicht NET sein) erstellte OCX auch in VBA verwenden. Einige Dinge sind aber zu beachten: Variablen / Datenübergaben auf einfache Datentypen beschränken, Long, Double, String, Funktionen eindeutig benennen, auf Überladungen verzichten (kleinster gemeinsamer Nenner gibt die wenigsten Probleme) (Außer er ist ein C Guru, dann gilt das nicht) Nichts komplexes verwenden (nach aussen), da VBA komplexere Daten nicht unterstützt, gilt im wesentlichen für alle Script Sprachen bzw. Interpreter. Die Intellisense funktioniert nur bei early bind, also wenn eine OCX direkt eingebunden wird. Bei komplett dynamischem erstellen kennt Sie die Aufrufe nicht. Zwischenschritt davon kann auch ein einbinden eines Verweises sein, dann kann as Object durch as Type ersetzt werden, ist dann aber auch nicht wirklich mehr dynamisch (Intellisense erkennt dies dann). Hoffe, dies trägt ein wenig zum Verständniss bei.
Hallo Thom,
danke für die Erklärung, die ich sehr gelungen finde.
Eine Frage habe ich aber noch, du schreibst ja:
>das muß nicht NET sein
Ok, ich dachte halt es wäre evtl. sinnvoll da Windows ja seit XP(oder?)
das Framework sowieso mitbringt. Spricht denn was dagegen?
Grüße,
Stefan
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.