Funktion aus anderer Datei ausführen

Moderator: ModerationP

Funktion aus anderer Datei ausführen

Beitragvon RTausD » 28. Jun 2022, 15:23

Hallo allerseits,

ich muss aus einer Datei eine Funktion ausführen, die in einer anderen Datei angelegt ist.

Grundsätzlich bekomme ich das mit nachfolgendem Befehl hin.

Code: Alles auswählen
Call Application.Run("'Testdatei.xlsm'!Testfunktion")


Wenn ich allerdings eine Variable übergeben möchte (s.u.) bricht das Makro mit Fehler ab.

Code: Alles auswählen
Call Application.Run("'Testdatei.xlsm'!Testfunktion(Testvariable)")


Der Fehlercode und die Fehlerbeschreibung lauten wie folgt:

Laufzeitfehler '1004':

Das Makro "Testdatei.xlsm'!Testfunktion(Testvariable)" kann nicht ausgeführt werden. Das Makro ist möglicherweise in dieser Arbeitsmappe nicht verfügbar, oder alle Makros wurden deaktiviert.


Die Makros sind natürlich nicht deaktiviert und die Funktion ist auch in der Datei enthalten.

Hat jemand eine Idee, was ich ihr tun könnte/muss?

VIELEN DANK im Voraus

Rolf
RTausD
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 349
Registriert: 24. Feb 2007, 10:51
Wohnort: 35683 Dillenburg

Re: Funktion aus anderer Datei ausführen

Beitragvon slowboarder » 28. Jun 2022, 15:30

Hi
probiers mal nach dem Schema:

Code: Alles auswählen
Application.Run "Dateiname!Makroname", ÜbergabeParameter



Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 29284
Registriert: 18. Apr 2009, 13:33

Re: Funktion aus anderer Datei ausführen

Beitragvon d'r Bastler » 28. Jun 2022, 15:50

Moin Rolf,

klappt so:

Mappe Snd.xlsb / allg. Modul:
Code: Alles auswählen
Sub Sender()
Dim sText As String
sText = "Called by " & ThisWorkbook.Name
    Application.Run "Rec.xlsb!Receiver", sText
End Sub


Mappe Rec.xlsb / allg. Modul:
Code: Alles auswählen
Sub Receiver(sText As String)
    MsgBox sText,, ThisWorkbook.Name
End Sub


Hier der einfachheit halber im selben Verzeichnis. Beide Mappen müssen geöffnet sein.

Hier noch als Mappen:

Schöne Grüße
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
d'r Bastler

Selbst Heiden glauben an min. 10% Mystik in der EDV! Gilt auch für mein Win 10 pro & Office 2019, Win 11 pro & Office 2021 und alle VBAsteleien ... Aktueller Trollfutter-Vorrat: NULL
Benutzeravatar
d'r Bastler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 726
Registriert: 23. Jan 2021, 22:36
Wohnort: VBAsteln makes the world go around

Re: Funktion aus anderer Datei ausführen

Beitragvon snb » 28. Jun 2022, 16:38

Code: Alles auswählen
Sub M_snb()
   ' Makro in 'DieseArbeitsmappe'

   Application.Run "Testdatei.xlsb!DieseArbeitsmappe.M_snb"
   
   ' Makro in 'Sheet1'
   
   Application.Run "Testdatei.xlsb!Sheet1.M_snb"
   
   ' Makro im 'Macomodul'
   
   Application.Run "Testdatei.xlsb!M_snb"
   
   ' Makro im Click-event der ActiveX control 'CommandButton1"
   
   Workbooks("testdatei.xlsb").Sheets(1).CommandButton1 = True
End Sub
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 9426
Registriert: 25. Sep 2014, 16:37

Re: Funktion aus anderer Datei ausführen

Beitragvon RTausD » 29. Jun 2022, 08:49

Hallo Slowboarder und d'r Bastler,

VIELEN DANK für den Tipp.
So wird zumindest schon einmal die Variable an die aufgerufene Funktion übergeben.

Nur kommt leider nichts zurück.
In der Funktion wird die Variable bearbeitet/geändert.
Wenn die Funktion beendet wird, hat die Variable in dem aufrufenden Makro aber noch den Wert von vor dem Aufruf der Funktion.

Hat jemand eine Idee, woran das liegt bzw. was ich tun muss, damit das aufrufende Makro die geänderte Variable zurück erhält?

@snb
Ich verstehe leider nicht ganz, wo in Deinem Codebeispiel eine Variable übergeben wird.
Soweit ich es sehe, wird hier auch nur ein Makro aufgerufen.

Viele Grüße

Rolf
RTausD
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 349
Registriert: 24. Feb 2007, 10:51
Wohnort: 35683 Dillenburg

Re: Funktion aus anderer Datei ausführen

Beitragvon slowboarder » 29. Jun 2022, 09:11

Hi
snb hat auch nicht auf deine Frage geantwortet, sondern dir allgemein gezeigt, wie du ein Makro aufrufen musst, wenn es sich in einer anderen Mappe befindet und das noch unterschieden nach den unterschiedlichen Modulen, in denenen das Makro stehen kann (DieseArbeitsmappe, Tabellenblattmodul, allgemeines Modul). Auf die von dir gestellte Frage mit der Variablenübergabe ist er nicht eingegangen.

zu deiner aktuellen Frage:

die Variablenübergabe bei Application.Run erfolgt immer "byVal" und niemals "byRef".
Dh du übergibst immer nur den Wert, aber nicht die Variable selbst. Eine Veränderung der übergebenen Variablen ist somit nicht möglich.
Wenn du ein Ergebnis benötigst, dann geht das nur so, dass du das Makro als Funktion schreibst und den Rückgabewert nutzt.

also:

Code: Alles auswählen
Function XXX(Eingabewert) as ???
...
XXX = Rückgabewert
End Function


und dann in der anderen Mappe:
Code: Alles auswählen
x = Application.Run("Dateiname!XXX", Übergabeparameter)

damit erhält x den Rückgabewert aus der Funktion XXX in der anderen Mappe.

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 29284
Registriert: 18. Apr 2009, 13:33

Re: Funktion aus anderer Datei ausführen

Beitragvon d'r Bastler » 29. Jun 2022, 10:59

Moin Rolf,

Daniels Vorschlag umgesetzt:

Mappe Snd.xlsb / Allg. Modul
Code: Alles auswählen
Option explicit

Sub Sender()
Dim sText As String
sText = "Called by " & ThisWorkbook.Name
    Application.Run "Rec.xlsb!Receiver", sText
End Sub

Sub Result(iVocals As Integer)
MsgBox "Der Text enthält " & iVocals & " Vokale", , ThisWorkbook.Name
End Sub


Mappe Rec.xlsb / Allg. Modul
Code: Alles auswählen
Option Explicit

Sub Receiver(sText As String)
    MsgBox sText, , ThisWorkbook.Name
    Vocals sText
End Sub

Function Vocals(sText As String)
Dim i As Integer, iVocals As Integer
For i = 1 To Len(sText)
        Select Case Mid(sText, i, 1)
            Case "a", "e", "i", "o", "u", "y"
                iVocals = iVocals + 1
        End Select
Next i
Application.Run "Snd.xlsb!Result", iVocals
End Function

Die Function in Rec.xlsb kann man sicher auch ohne Umweg über die Sub ansprechen und ist natürliche funktional Pillepalle. Brauchte nur einen Rückgabewert ;-)
Danke Daniel! Wieder was gelernt ...;-)

Grüße

Nachtrag, sorry! hatte das "y" vergessen ...
d'r Bastler

Selbst Heiden glauben an min. 10% Mystik in der EDV! Gilt auch für mein Win 10 pro & Office 2019, Win 11 pro & Office 2021 und alle VBAsteleien ... Aktueller Trollfutter-Vorrat: NULL
Benutzeravatar
d'r Bastler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 726
Registriert: 23. Jan 2021, 22:36
Wohnort: VBAsteln makes the world go around

Re: Funktion aus anderer Datei ausführen

Beitragvon DerHoepp » 30. Jun 2022, 06:36

Moinsen,

noch einfacher finde ich den direkten Aufruf von Public-Membern der ohnehin vorhandenen Objekte. Das Codebehind eines Workbook-Objekts verhält sich wie eine Klassendefinition. Ein Public-Member darin lässt sich also einfach mit einem Nachfolgenden Punkt aufrufen:
Code: Alles auswählen
Option Explicit
'erste Arbeitsmappe, ThisWorkbook
Public Function getValue(parameter as Variant) As Boolean
   getValue = True
End Function

'Aufrufende Mappe
Option Explicit
Sub Testen ()
   With Workbooks.Open("ErsteArbeitsmappe.xlsm")
      Debug.Print .getValue("Haus")
      .Close False
   End With
End Sub


Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 10435
Registriert: 14. Mai 2013, 11:08

Re: Funktion aus anderer Datei ausführen

Beitragvon snb » 30. Jun 2022, 09:30

Ein Public-Member darin lässt sich also einfach mit einem Nachfolgenden Punkt aufrufen:


Stimmt ganz genau. :D
Weil es grundsätzlich ein Private Object ist (darum der Punkt) läuft es auch ohne 'Public'.
Zuletzt geändert von snb am 30. Jun 2022, 09:49, insgesamt 1-mal geändert.
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 9426
Registriert: 25. Sep 2014, 16:37

Re: Funktion aus anderer Datei ausführen

Beitragvon slowboarder » 30. Jun 2022, 09:41

DerHoepp hat geschrieben:Moinsen,

noch einfacher finde ich den direkten Aufruf von Public-Membern der ohnehin vorhandenen Objekte. Das Codebehind eines Workbook-Objekts verhält sich wie eine Klassendefinition. Ein Public-Member darin lässt sich also einfach mit einem Nachfolgenden Punkt aufrufen:


wenn du schreiben würdest: Erstelle die Funktion nicht in einem allgemeinen Modul sondern im Modul "DieseArbeitsmappe", dann kannst du sie aus einer anderen Mappe heraus aufrufen", dann würde man auch verstehen was du meinst.

bei der Methode funktioniert auch die die Variablenübergabe "byRef".

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 29284
Registriert: 18. Apr 2009, 13:33

Re: Funktion aus anderer Datei ausführen

Beitragvon snb » 30. Jun 2022, 09:51

behind eines Workbook-Objekts


Wer richtig lesen kann ist im Vorteil.
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 9426
Registriert: 25. Sep 2014, 16:37

Re: Funktion aus anderer Datei ausführen

Beitragvon d'r Bastler » 30. Jun 2022, 10:02

wer lesen kann ...


Und wer gleich verständlich erklärt ist noch besser.
Danke Daniel für die Übersetzung!

Grüße
d'r Bastler

Selbst Heiden glauben an min. 10% Mystik in der EDV! Gilt auch für mein Win 10 pro & Office 2019, Win 11 pro & Office 2021 und alle VBAsteleien ... Aktueller Trollfutter-Vorrat: NULL
Benutzeravatar
d'r Bastler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 726
Registriert: 23. Jan 2021, 22:36
Wohnort: VBAsteln makes the world go around

Re: Funktion aus anderer Datei ausführen

Beitragvon DerHoepp » 30. Jun 2022, 10:11

Moin,

@Daniel du hast recht, manchmal formuliere ich zu kompliziert und ich komme aus der objektorientierten Sichtweise nicht mehr heraus.

snb hat geschrieben:Weil es grundsätzlich ein Private Object ist (darum der Punkt) läuft es auch ohne 'Public'.

Ich hab es jetzt nicht ausprobiert, aber es würde mich wundern, wenn sich Private-Member eines Objektes sich aufrufen ließen. Kann es sein, dass du meinst, dass alle Properties, Functions und Subs eines Codemoduls standardmäßig Public sind? :)

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 10435
Registriert: 14. Mai 2013, 11:08

Re: Funktion aus anderer Datei ausführen

Beitragvon slowboarder » 30. Jun 2022, 10:17

"Public" ist default, dh es wird "Public" angenommen, wenn keine expliziten Angaben gemacht werden.
"Private" Subs oder Functions können nur von Subs oder Functions verwendet werden, welche sich im selben Modul befinden.
Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 29284
Registriert: 18. Apr 2009, 13:33

Re: Funktion aus anderer Datei ausführen

Beitragvon RTausD » 30. Jun 2022, 14:04

Hallo allerseits,

VIELEN DANK für Euere Hinweise.

Für meine Zwecke war die Lösung von Slowboarder das Einfachste.

Grüße

Rolf
RTausD
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 349
Registriert: 24. Feb 2007, 10:51
Wohnort: 35683 Dillenburg


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 100 Gäste