Discussion:
Visual Basic APC
(zu alt für eine Antwort)
Oliver Bergthaler
2005-05-04 14:11:03 UTC
Permalink
Hallo NG

Ich möchte VBA in mein Visual Basic Project 6 einbinden. Hierfür gibt es von
MS die Visual Basic APC.

Folgenden Code verwende ich um eine existierende Funktion in einem Modul
aufzurufen. (sehr einfach gehalten)

Public sub callFunction()
Dim arrParam As Variant
Dim prjItem As ProjectItem
Dim prjProc As Procedure

arrParam = "abcdef"

For Each prjItem In m_apcInt.ApcHost.Projects(1).ProjectItems
For Each prjProc In prjItem.Procedures
If prjProc.Name = "myFunction" Then
prjProc.Run arrParam
End If
Next
Next
End Sub

Lauf Dokumentation muss man wen man eine Prozedure oder Funktion aufruft die
Parameter erwartet die Methode RUN verwenden. die Definition der
Parameterübergabe lautet

object.Run([Argument]...)
Argument: A Variant expression that is passed to the subroutine or function
being called. You can pass as many arguments as necessary, up to the maximum
number of arguments supported by VBA.

beim Aufruf Run bekomme ich dann folgende Fehlermeldung.

Lauftzeitfehler '-2147220192 (80040520)'
One or more arguments are invalid.

Ich habe jetzt mit jeder erdenklichen Kombination von Array und Variants
herumprobiert, bekomme aber immer die gleiche Fehlermeldung.

Code den ich im externen VBA Modul Aufrufe.

Private Sub myFunction(ByVal aString As String)
MsgBox aString
End Sub
Jörg Ackermann
2005-05-04 15:25:41 UTC
Permalink
Hi,
Post by Oliver Bergthaler
Ich möchte VBA in mein Visual Basic Project 6 einbinden. Hierfür gibt
es von MS die Visual Basic APC.
Folgenden Code verwende ich um eine existierende Funktion in einem
Modul aufzurufen. (sehr einfach gehalten)
Public sub callFunction()
Dim arrParam As Variant
Dim prjItem As ProjectItem
Dim prjProc As Procedure
arrParam = "abcdef"
For Each prjItem In m_apcInt.ApcHost.Projects(1).ProjectItems
For Each prjProc In prjItem.Procedures
If prjProc.Name = "myFunction" Then
prjProc.Run arrParam
End If
Next
Next
End Sub
Lauf Dokumentation muss man wen man eine Prozedure oder Funktion
aufruft die Parameter erwartet die Methode RUN verwenden. die
Definition der Parameterübergabe lautet
object.Run([Argument]...)
Argument: A Variant expression that is passed to the subroutine or
function being called. You can pass as many arguments as necessary,
up to the maximum number of arguments supported by VBA.
beim Aufruf Run bekomme ich dann folgende Fehlermeldung.
Lauftzeitfehler '-2147220192 (80040520)'
One or more arguments are invalid.
Ich habe jetzt mit jeder erdenklichen Kombination von Array und
Variants herumprobiert, bekomme aber immer die gleiche Fehlermeldung.
Code den ich im externen VBA Modul Aufrufe.
Private Sub myFunction(ByVal aString As String)
MsgBox aString
End Sub
Nur so gestochert...
Versuche mal:

MyFunction als Public
MyFunction als Function

Gruß
Christoph Basedau
2005-05-04 16:29:51 UTC
Permalink
Post by Oliver Bergthaler
Ich möchte VBA in mein Visual Basic Project 6 einbinden. Hierfür gibt es von
MS die Visual Basic APC.
Folgenden Code verwende ich um eine existierende Funktion in einem Modul
aufzurufen. (sehr einfach gehalten)
Public sub callFunction()
Dim arrParam As Variant
Dim prjItem As ProjectItem
Dim prjProc As Procedure
arrParam = "abcdef"
For Each prjItem In m_apcInt.ApcHost.Projects(1).ProjectItems
For Each prjProc In prjItem.Procedures
If prjProc.Name = "myFunction" Then
prjProc.Run arrParam
End If
Next
Next
End Sub
Wenn Du Dein Projekt analog dem Sample-Projekt "SDINote.vbp" im VBA-SDK 6.3 aufgebaut
hast [ die Variablen-Bezeichner lassen es vermuten ;-) ], und der Aufruf aus dem Formular
"frmSDI" erfolgt, ruf das Makro doch einfach direkt auf.

Set prjItem = m_apcInt.ApcProject.ProjectItems("Module1") '<- Name des VBA-Moduls
prjItem.Run ("myFunction", "abcdef")

Das For-Eachen durch alle Collection-Ebenen bringt zumindest keinen
erkennbaren Vorteil.
Post by Oliver Bergthaler
beim Aufruf Run bekomme ich dann folgende Fehlermeldung.
Lauftzeitfehler '-2147220192 (80040520)'
Der Fehler kam bei mir, wenn ich die/den Parameter als Array rübergebe.
Die werden aber einfach als Liste erwartet. Dein Sample *müsste*
deshalb funktionieren as-is.
--
Gruesse, Christoph

Rio Riay Riayo - Gordon Sumner, 1979
Oliver Bergthaler
2005-05-09 06:12:01 UTC
Permalink
Hallo Christoph,

Erst mal danke fuer die prompte Antwort.


Kann es sein dass es hier zwischen dem VBA-SDK 6.2 und 6.3 Unterschiede gibt?

Die For- Each hatte ich nur eingebaut zum Testen ob die richtige Funktion
aufgerufen wird, bzw. ob sie ueberhaupt existiert. Diese Funktionen werden
vom Programm selbst erzeugt.

Mit den Arrays habe ich es auch schon versucht (ohne Erfolg)

Dim myArr() As Variant

ReDim myArr(0)
myArr(0) = "abcdef"

Set prjItem = m_apcInt.ApcProject.ProjectItems("myModul")
prjItem.Run "myFunction", myArr

Ich habe auch die Funktion soweit umgebaut dass statt eines Strings ein
ParamArray aString() As Variant uebergeben wird. Selbe Fehlermeldung.

Zur Antwort von Jörg Ackermann - Die Funktionen sind alle als Public
deklariert.
Habe ich falsch gepostet.

Irgendetwas bringt mich hier durcheinander.

mfg
Oliver
Post by Christoph Basedau
Wenn Du Dein Projekt analog dem Sample-Projekt "SDINote.vbp" im VBA-SDK 6.3 aufgebaut
hast [ die Variablen-Bezeichner lassen es vermuten ;-) ], und der Aufruf aus dem Formular
"frmSDI" erfolgt, ruf das Makro doch einfach direkt auf.
Set prjItem = m_apcInt.ApcProject.ProjectItems("Module1") '<- Name des VBA-Moduls
prjItem.Run ("myFunction", "abcdef")
Das For-Eachen durch alle Collection-Ebenen bringt zumindest keinen
erkennbaren Vorteil.
Post by Oliver Bergthaler
beim Aufruf Run bekomme ich dann folgende Fehlermeldung.
Lauftzeitfehler '-2147220192 (80040520)'
Der Fehler kam bei mir, wenn ich die/den Parameter als Array rübergebe.
Die werden aber einfach als Liste erwartet. Dein Sample *müsste*
deshalb funktionieren as-is.
--
Gruesse, Christoph
Rio Riay Riayo - Gordon Sumner, 1979
Christoph Basedau
2005-05-09 22:01:29 UTC
Permalink
Post by Oliver Bergthaler
Hallo Christoph,
Erst mal danke fuer die prompte Antwort.
Kann es sein dass es hier zwischen dem VBA-SDK 6.2 und 6.3 Unterschiede gibt?
Unterschiede gibt es sicher, aber wohl kaum in grundlegenden Fragen wie
der Signatur von Methoden-Aufrufen.
Post by Oliver Bergthaler
Die For- Each hatte ich nur eingebaut zum Testen ob die richtige Funktion
aufgerufen wird, bzw. ob sie ueberhaupt existiert. Diese Funktionen werden
vom Programm selbst erzeugt.
Mit den Arrays habe ich es auch schon versucht (ohne Erfolg)
Dim myArr() As Variant
ReDim myArr(0)
myArr(0) = "abcdef"
Set prjItem = m_apcInt.ApcProject.ProjectItems("myModul")
prjItem.Run "myFunction", myArr
Ich habe auch die Funktion soweit umgebaut dass statt eines Strings ein
ParamArray aString() As Variant uebergeben wird. Selbe Fehlermeldung.
Zur Antwort von Jörg Ackermann - Die Funktionen sind alle als Public
deklariert.
Habe ich falsch gepostet.
Irgendetwas bringt mich hier durcheinander.
Für meinen Geschmack bringst Du ParamArrays mit gewöhnlichen Arrays durcheinander.
Ein ParamArray bewirkt eine variable, undefinierte Anzahl von Übergabe-Parametern.
Für indirekte Methoden-Aufrufe durch VBA-APC macht das ja auch Sinn.
Die generische Aufrufmethode muss alle Arten auszuführender Funktionen handeln können,
deswegen erwartet sie eine undefinierte und unbegrenzte Anzahl von Aktualparametern,
unbekannten Typs (-> deshalb Variant).
Die Argumente, die man tatsächlich übergibt, müssen aber keine Arrays und keine Variants
sein, sondern diejenigen, die die indirekt aufgerufene Methode erwartet. Im konkreten
Fall deiner Test-Funktion mit der Signatur 'Function myFunction(ByVal aString As String)'
musst Du einfach einen hundsgemeinen String übergeben, und das war's.

Also kein ReDim, sondern nur:

Dim myStr As String
myStr ="irgendeine Folge von Zeichen"
Set prjItem = m_apcInt.ApcProject.ProjectItems("myModul")
prjItem.Run "myFunction", myStr

Wenn es dann immer noch nicht geht, muss es wohl an irgendeine subtileren Detail liegen.
Ich hab mir das APC nur mal spasseshalber installiert (weil mal in einem MSDN-Abo
als nice-to-have mitgeliefert). Am Anfang hatte ich den von Dir beschriebenen Fehler auch.
Und dann ging es plötzlich. Keine Ahnung, welches Detail sich da geändert hatte.
Nachdem ich das VBA-Modul als *.vnp-File gepeichert hatte, ging es jedenfalls.
Kann auch sein, dass es eine Frage des aktiven Projekts ist.

PS, hast Du zur Run-Methode diesen Hinweis im SDK gelesen:

"You cannot call subroutines or functions in class modules or UserForms.
Furthermore, you cannot call Property Let/Get/Set routines.

The Run method does not work in Design mode, as VBA code cannot be run in this mode.
You can determine the current mode using the Project.Mode method.
When this method returns axModeDesign, then the Run method generates
the APC_E_NOT_IN_DESIGN_MODE error."

Vielleicht einfach mal kompilieren und die Exe starten.
--
Gruesse, Christoph

Rio Riay Riayo - Gordon Sumner, 1979
Oliver Bergthaler
2005-05-10 08:40:14 UTC
Permalink
Post by Christoph Basedau
Für meinen Geschmack bringst Du ParamArrays mit gewöhnlichen Arrays durcheinander.
Ein ParamArray bewirkt eine variable, undefinierte Anzahl von Übergabe-Parametern.
Für indirekte Methoden-Aufrufe durch VBA-APC macht das ja auch Sinn.
Die generische Aufrufmethode muss alle Arten auszuführender Funktionen handeln können,
deswegen erwartet sie eine undefinierte und unbegrenzte Anzahl von Aktualparametern,
unbekannten Typs (-> deshalb Variant).
Die Argumente, die man tatsächlich übergibt, müssen aber keine Arrays und keine Variants
sein, sondern diejenigen, die die indirekt aufgerufene Methode erwartet. Im konkreten
Fall deiner Test-Funktion mit der Signatur 'Function myFunction(ByVal aString As String)'
musst Du einfach einen hundsgemeinen String übergeben, und das war's.
Dim myStr As String
myStr ="irgendeine Folge von Zeichen"
Set prjItem = m_apcInt.ApcProject.ProjectItems("myModul")
prjItem.Run "myFunction", myStr
Wenn es dann immer noch nicht geht, muss es wohl an irgendeine subtileren Detail liegen.
Ich hab mir das APC nur mal spasseshalber installiert (weil mal in einem MSDN-Abo
als nice-to-have mitgeliefert). Am Anfang hatte ich den von Dir beschriebenen Fehler auch.
Und dann ging es plötzlich. Keine Ahnung, welches Detail sich da geändert hatte.
Nachdem ich das VBA-Modul als *.vnp-File gepeichert hatte, ging es jedenfalls.
Kann auch sein, dass es eine Frage des aktiven Projekts ist.
"You cannot call subroutines or functions in class modules or UserForms.
Furthermore, you cannot call Property Let/Get/Set routines.
The Run method does not work in Design mode, as VBA code cannot be run in this mode.
You can determine the current mode using the Project.Mode method.
When this method returns axModeDesign, then the Run method generates
the APC_E_NOT_IN_DESIGN_MODE error."
Vielleicht einfach mal kompilieren und die Exe starten.
--
Gruesse, Christoph
Rio Riay Riayo - Gordon Sumner, 1979
Hallo Christoph,

Den Hinweis zur Run-Methode habe ich gelesen. Hier bekomme ich als Mode auch
axModeRun zurück. Bis zum jetztigen Zeitpunkt verwende ich auch nur Module
und keine Klassen. In den Modulen verwende ich nur SUB und FUNKTION (PUBLIC).

Ich denke dass mein groesstes Problem in der Version liegt (6.2)
Kennst du den LINK
http://msdn.microsoft.com/isv/technology/vba/features/default.aspx
In der Version 6.3 hat sich einiges getan Siehe Visual Basic Language Features

Ich muss jetzt schauen dass ich die Version 6.3 oder die Version 6.4 bekomme
zum Testen.

Besten Dank fuer deine Bemuehungen

Gruß
Oliver Bergthaler

Loading...