Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1752to1756
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Funktion nur aufrufen wenn vorhanden

VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 10:41:41
W
Hallo Forum,
ich bastle gerade an einer neuen Funktion, welche ggf. eine weitere Funktion aufrufen soll. Das soll aber nur geschehen, wenn diese Funktion auch Bestandteil meiner Mappe ist.
Gibt es auch eine Lösung für Variablen? Wie kann ich prüfen, ob eine Variable vorhanden ist, ohne dass die Ausführung wegen fehlender Variable verhindert wird.
Kann und ggf. wie kann man soetwas realisieren?
Ich möchte damit vermeiden, dass "ganze Rattenschwänze" in alle Mappen eingebunden werden, die in diesen Mappen nicht verwendet werden.
Gruß W H21

24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 10:44:20
Oberschlumpf
ähh?
Hi,
"Sauber programmieren" ist das Zauberwort.
Erledige all deine Programmieraufgaben nicht einfahc, in dem du alten, bestehenden Code kopierst und unverändert in eine neue Datei (mit neuen Aufgaben) einfügst.
Sondern beginne einfach von vorne mit dem Programmieren.
Ciao
Thorsten
AW: VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 10:59:34
W
Hallo Oberschlumpf,
mein Problem hat nichts mit "sauber programmieren" zu tun. Aber ich habe Mappen, die eine gemeinsame Funktion benutzen (die ich gerade neu erstelle), und die in manchen Mappen zusätzliche Funnktionen aufrufen sollten. Und das "ob" soll in der Mappe dadurch festgelegt werden, ob die zusätzliche Funktion eingebunden ist, oder nicht.
Statt der neuen Funktion habe ich bisher mehrere Sonderversionen der Funktion im Einsatz. Und das finde ich nicht so toll, weil ich damit einen höheren Pflegeaufwand habe.
Gruß
W H21
Anzeige
AW: VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 15:10:56
Nepumuk
Hallo,
du kannst eine Sub die eine andere Sub oder Function aufruft die in der Mappe nicht vorhanden ist gar nicht starten. Da bekommst du sofort einen Kompilierfehler.
Gruß
Nepumuk
AW: VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 10:46:21
Hajo_Zi
wenn die eigerne Funktion nicht Bestandteil Deiner Mappe ist kannst Du sie nicht aufrufen.
Aus einer andren Datei möchtest Du sie ja nicht aufrufen.

AW: VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 11:01:37
W
Hallo Hajo_Zi,
ich möchte die Funktion auch nur dann aufrufen, wenn sie eingebunden ist. Dass ich sie nicht aufrufen kann, wenn sie nicht da ist, ist doch logisch. Oder?
Gruß
W H21
Anzeige
Problem gelöst
13.04.2020 11:04:33
Hajo_Zi
Dir ist also klar was ich geschrieben habe, also gelöst.
Gruß Hajo
AW: Problem gelöst
13.04.2020 11:14:13
W
Hallo Hajo_Zi,
ich verstehe Deine Antwort nicht. Was soll gelöst sein?
Das Problem ist doch, dass eine Funktion erst gar nicht ausgeführt wird, wenn in dieser Funktion eine weitere Funktion aufgerufen wird, die nicht Bestandteil der aktuellen Mappe ist.
Und gleiches gilt bei der Abfrage von Variablen.
Fazit: mein Problem (und damit meine Anfrage) ist weiterhin offen und ungelöst.
Gruß
W H21
AW: Problem weiterhin ungelöst
13.04.2020 11:15:36
W
Habe den Betreff richtiggestellt.
Anzeige
AW: Problem weiterhin ungelöst
13.04.2020 12:57:39
volti
Hallo,
falls Du Zugriff auf das VBE-Project hast, kannst Du mit nachfolgender Function prüfen, ob eine Sub oder eine Funktion in einem der Module vorhanden ist.
Sämtliche Funkionsprüfungen über Fehlerrückmeldung mittels color=blue>AddressOf MeineSub führten zu einen Compilisationsfehler und könendamit per VBA nicht abgefragt werden.
Probier es halt mal aus:

Sub Test()
 MsgBox IsSubFunction("MeineSub")
End Sub
Function IsSubFunction(sProc As String) As Boolean
'Ermittelt, ob die gesuchte Function/Sub vorhanden ist
'Zugriff auf VBE-Project muss gesetzt sein
  Dim oModule As Object, iTest As Integer
  For Each oModule In Application.VBE.ActiveVBProject.VBComponents
    On Error Resume Next
    iTest = Application.VBE.ActiveVBProject.VBComponents(oModule.Name) _
                 .CodeModule.ProcStartLine(sProc, vbext_pk_Proc)
    If iTest <> 0 Then IsSubFunction = True: Exit Function
  Next oModule
End Function

viele Grüße
Karl-Heinz

Anzeige
AW: VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 15:39:00
W
Hallo volti,
vielen Dank für Dein Beispiel, welches ich gerade erfolgreich probiert habe. Allerdings löse ich damit nicht das Problem, das Excel "meckert", wenn ich in meinem Code bereits einen Aufruf einer Funktion eingebaut habe, auch wenn ich die nie aufrufen würde. Dein Code verhindert also nur den Aufruf einer nicht vorhandenen Funktion, jedoch nicht die Fehlermeldung (Sub, Funktion oder Eigenschaft nicht definiert (Fehler 35)) von Excel beim Start der Funktion, in welcher der Aufruf vorgesehen ist. Aber das hast Du in Deiner Antwort schon geschrieben.
Kleiner Hinweis: nachdem ich "Option Explicit" gesetzt hatte, bekam ich die Fehlermeldung, dass die Variable "vbext_pk_Proc" nicht definiert wäre. Im Internet fand ich dafür die Lösung, stattdessen "0" zu verwenden. Ersatzweise kann auch eine Referenz auf "Microsoft Visual Basic Extensibility Library" gesetzt werden.
Gruß
W H21
Anzeige
AW: VBA Funktion nur aufrufen wenn vorhanden
13.04.2020 15:45:36
Daniel
Hi
Probiert mal den alternativen Aufruf über Application.Run
Für Subs sollte das auf jedrn fall funktionieren, bei Functions müsstest du mal schauen, wie das mit dem Rückgabewert funktioniert.
Gruß Daniel
VBA Funktion trotz fehlender Variablen ausführen
13.04.2020 17:29:26
W
Hallo Daniel,
super. Das ist die Lösung, um eine Funktion nur dann aufzurufen, wenn sie auch verfügbar ist.
(Nochmals für alle: das ist ggf. so gewollt, dass die Funktion fehlt! Und der Aufruf ist entsprechend der nachfolgenden Lösung vorzunehmen.)
Hier mein Testcode:
Sub AppRunTest()
Dim FuncRC As Variant
Dim Zufall As Variant
Zufall = Int(1000000 * Rnd)
FuncRC = Zufall
On Error Resume Next
FuncRC = Application.Run("AppRun", False, "Test")
On Error GoTo 0
If FuncRC = Zufall Then
Debug.Print "Funktion nicht vorhanden"
Else
Debug.Print "Ergebnis: " & FuncRC
End If
End Sub

Function AppRun(p1 As Boolean, p2 As String) As String
Debug.Print p1 & " " & p2
AppRun = "Test bestanden"
End Function
Vor dem Aufruf setze ich das Ergebnisfeld mit einem Zufallswert. Die Ausführung von "Run" muss ich mit "on Error" absichern. Wenn nach dem Run-Befehl das Antwortfeld unverändert ist, ist die Funktion nicht vorhanden.
Das Problem mit der ggf. fehlenden Funktion ist damit erledigt. Immerhin: das größere Problem ist nun gelöst.
Ich habe mit "Run" und der Weitergabe einer Variablen getestet. Aber mit "Option Expilcit" und fehlender Variablen-Definition geht nichts.
Ich lasse das Problem weiterhin offen, ändere aber den Betreff. Möglicherweise hat noch jemand eine Idee. Natürlich kann die fehlende Variable nur zur Steuerung verwendet werden und nicht als Parameter beim Aufruf einer weiteren Funktion.
Gruß
W H21
Anzeige
Derartige Probleme kann man auch ...
13.04.2020 18:44:51
Luc:?
…mit bedingter Kompilierung lösen, W H21,
indem man eine bedingte Konstante dafür setzt und je nachdem, ob die Fkt im speziellen Fall vorhanden ist oder verwendet wdn soll, ihren Wert manuell festlegt. Im Pgm wird dann der Wert dieser Konstanten abgefragt und die für den Ausführungsfall vorgesehenen Befehle danach eingebunden. Je nachdem, welcher Wert für die Konstante eingetragen wurde, wird dann dieser PgmTeil kompiliert oder eben nicht. Im 2.Fall entfallen dann natürlich auch darauf bezogene FehlerMeldungen, weil ja der nicht kompiliert wurde, also de facto nicht vorhanden ist.
Übrigens kann man statt Run auch CallByName auf ähnliche Weise verwenden, nur muss die Fkt dann einem Objekt zuordenbar sein (wie zB bei WorksheetFunctions), idR ein KlassenModul (mit eindeutigem Namen). Auch ein standardmäßig bereits vorhandenes DokumentKlassenmodul wäre möglich (ggf das Dokument eindeutig intern umbenennen → CodeName!), das dann die Fkt enthalten müsste.
OsterGruß, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Nichtsdestotrotz Durchblick verbessern mit …

Anzeige
AW: Derartige Probleme kann man auch ...
14.04.2020 07:40:10
W
Hallo Luc:?
Herzlichen Dank für Deine Antwort. Mit den richtigen Suchbegriffen habe ich entsprechende Beispiele gefunden und einen Test mit einer nicht definierten Variablen gemacht. Der Test war sehr erfolgreich: es ist die Lösung für mein Problem. Mit "Applikation.Run" und "On Error" hätte ich ja auch an der entsprechenden Codestelle das Problem lösen müssen. Mit der "bedingten Kompilierung" kann ich nun beide von mir erwähnten Probleme mit Bordmitteln lösen.
Das Thema ist mir grundsätzlich nicht neu. Allerdings war sie mir in VBA bisher nicht bekannt. Ich hatte früher sehr viel mit Assembler auf Großrechnern zu tun. Und dort habe ich diese Technik sehr häufig benutzt, damit mein Code auf unterschiedlichen Rechnern eingesetzt werden konnte. Auch lokale oder technische Besonderheiten (Nutzung einer neuen Systemschnittstelle oder Lösung über eigenen umfangreichen Code) oder logische Umstellungen (alt? oder neu?) wurden darüber gelöst.
Ein wenig Kritik möchte ich allerdings auch noch üben: warum wird von manchen Usern der Betreff immer wieder verändert? Das verstehe ich nicht!
Gruß und nochmals "vielen Dank".
W H21
Anzeige
Na, dann war das ja der richtige Vorschlag ...
14.04.2020 16:15:25
Luc:?
…für einen Mann deiner Erfahrung! ;-)
Zu deiner kritischen Frage:
Das machen etliche AWer, weil es …
1. möglich ist, auch in Foren ohne Baumstruktur, in denen das nicht immer erwartet wird;
2. möglich wird, die Entwicklung einer Lösung eher anhand der wechselnden Betreffs zu erahnen bzw zu verfolgen, als es sonst möglich wäre;
3. eine gewisse Bequemlichkeit und FantasieLosigkeit bedeutet, einfach immer nur den vorherigen Betreff beizubehalten, egal, ob er dann noch zur jeweiligen AW passt oder nicht. Das hat sich mit der Verbreitung des eMail-Verkehrs eingebürgert und war zuvor auch bei Geschäftspost unüblich. Der für die Einordnung wichtige Bezug wurde damals und wird in diesem Fall auch heute noch separat angegeben. Hier ist er durch die Baumstruktur bzw die Reihenfolge der AWen (zumindest der HptBezug) vorgegeben.
Luc :-?
Anzeige
Betreff, Sinn und Zweck
14.04.2020 16:56:28
Daniel
Wobei man anmerken sollte, das die wenigsten sich wirklich einen neuen passenden Betreff ausdenken, sondern einfach den ersten Satz schon in der Betreffzeile beginnen und dann im Beitrag fortsetzen.
das ist genauso bequem und phantasielos wie den Betreff des Vorgängers zu übernehmen, zudem erschwert es das Lesen des Beitrags, weil der erste Satz auseinander gerissen ist(unnötigerweise)
wenn es ganz schlecht läuft, kann es sogar sein, dass der betreff dann eine gegensätzliche Aussage zum eigentlichen Inhalt macht, weil entscheidende Satzteile fehlen und in der Baumstruktur nicht sichtbar sind.
natürlich ist es sinnvoll, den Betreff zu wechseln wenn sich der Inhalt des Threads weiter entwickelt hat und nicht mehr dem Inhalt entspricht, aber einfach nur den Beitrag schon im Betreff zu beginnen halte ich für die schlechteste Variante.
außerdem darf man nicht vergessen, dass es neben der Baumstruktur auch noch die Forumsliste gibt in welcher die Beiträge zeitlich sortiert sind und dann bei wechselndem Betreff nicht mehr erkennbar ist, zu welchem Thread der Beitrag gehört.
gruß Daniel
Meine letzte Bemerkungen zu dem Problem
14.04.2020 17:48:34
W
Hallo, alle die sich mit meinem Problem beschäftigt haben (oder es in Zukunft noch machen werden).
Inzwischen bin ich von der "bedingten Kompilierung" nicht mehr überzeugt. Es funktioniert nur, wenn innerhalb des eigenen Codes die #Const-Definitionen gemacht werden. Es gibt keine Möglichkeit, das für die gesamte Arbeitsmappe zu tun. Mein Versuch, die #Const-Definition mit einem Wert aus einer globalen Konstante zu versehen, ist genauso gescheitert. Und #If-Abfragen auf #Konstanten, die gar nicht definiert sind, werden nicht abgewiesen.
Mein Ansatz war und ist: ich möchte eine einheitiche Funktion für mehrere Mappen bereitstellen, die jedoch durchaus unterschiedlich ablaufen kann. Das ist durch globale Variable durchaus realisierbar. Ebenso könnte beim Aufruf ein Parameter für die Ablaufsteuerung vorgesehen sein. Das Problem, auf das ich dann gestoßen bin, ist: wenn an einer Stelle des Codes eine Funktion aufgerufen wird, und diese Funktion nicht eingebunden ist, "meckert" Excel; auch dann, wenn die Stelle des Codes nie ausgeführt wird.
Wenn ich in dem Code zuerst die für jede Mappe gültigen #Const-Werte zuweisen muss, gibt es kein einheitiches Modul mehr.
Ich werde den von Daniel vorgeschlagenen Weg wählen, und die fragliche Funktion mit Hilfe von Application.Run aufrufen. Meine Tests dafür waren sehr erfolgreich. Und ich habe auch eine Möglichkeit gefunden, wie ich herausfinden kann, ob die Funktion auch tatsächlich ausgeführt wurde (siehe mein Testcode in diesem Thread). Ist dies nicht der Fall, so muss ich dann eine entsprechende Fehlermeldung ausgeben. Dass die Funktion aufgerufen werden soll, wurde durch eine globale Variable bzw. einem Parameter beim Aufruf verlangt. Dann sollte sie auch in der Mappe enthalten sein.
Für mich ist das Problem nun endgültig erledigt; ich habe eine funktionierende Lösung erhalten.
Nochmals: Danke
Gruß W H21
AW: Meine letzte Bemerkungen zu dem Problem
14.04.2020 19:30:22
Nepumuk
Hallo,
nun mal langsam. Du kannst mit bedingter Formatierung einiges abfangen.
Im Dialog "Eigenschaften von VBA-Projekt":
Userbild
Dazu folgender Code:
Option Explicit
Public Sub Test()
Dim x As String
#If Not HasFunction Then
x = hallo(x)
#Else
x = "hallo"
#End If
MsgBox x
End Sub
Private Function hallo(y As String)
hallo = "huhu"
End Function

Wenn du im Dialog die Kompilerkonstante auf -1 setzt, dann wird die Funktion "hallo" aufgerufen. Und das ohne Kompilierfehler. Weitere Kompilerkonstanten kannst du mit einem Doppelpunkt getrennt einfügen.
Gruß
Nepumuk
AW: Meine letzte Bemerkungen zu dem Problem
14.04.2020 22:34:01
Daniel
Hi
da fehlt aber die gewünschte Automatik.
dh die Funktion Test soll automatisch erkennen, ob die Funktion Hallo vorhanden ist oder nicht.
wenn die Funktion hallo ggf nachträglich hinzugefügt wird, muss Test diese Funktion verwenden, ohne dass irgendwelche Änderungen in der Funktion Test oder an anderer Stelle im Code notwendig sind.
mir würde hierfür folgendes Szenario einfallen:
- das Makro Test verwendet Funktionen, welche normalerweise über ein AddIn bereitgestellt werden.
es kann aber sein, dass die Datei auch mal auf einem Rechner ohne dieses AddIn geöffnet wird und dann soll das Makro trotzdem Fehlerfrei (und ggf mit eingeschränkter Funktionalität) laufen. Sobald die Datei auf einem Rechner mit AddIn läuft, muss sie wieder normal funktionieren.
wenn dafür immer ein Eingriff über den VBA- Editor notwendig ist (zum Änderm der Konstanten), wäre das nicht anwenderfreudlich und dem Normaluser nicht zuzumuten.
Gruß Daniel
Das ist richtig, ...
15.04.2020 18:08:37
Luc:?
…Daniel,
und man muss dann halt abwägen, was einem wichtiger ist. Eine Automatisierung von Compiler-Konstanten scheint unmöglich zu sein, schon deshalb, weil immer zuallererst kompiliert wird und damit auch kein vorhergehender VBA-Zugriff auf Xl-Konstanten möglich ist. Deshalb könnte es allerhöchstens möglich sein, die #Const-Zeile vor Start der sie enthaltenden Datei auszutauschen. Das müsste dann aber wohl durch 2maligen Start der Datei, das 1.Mal mit deaktivierten Makros, erfolgen. Es ist mE ohnehin nicht möglich, im lfd Pgm ein anderes zu ändern und sofort danach aus ersterem aufzurufen.
In den Fällen, in denen ich das nutze, muss der Nutzer das stets selbst einstellen, in Abhängigkeit davon, ob ihm eine bestimmte UDF zV steht oder nicht. Anders sieht es natürlich bei PgmVarianten aus, die sich nach generell vorgegebenen Bedingungen richten, wie bspw die Software-Version.
Gruß, Luc :-?
Die Angabe des Betreffs...
14.04.2020 16:39:06
Oberschlumpf
Hi,
...kann helfen, schon vor dem Detaillesen zu erkennen, was denn im Detail zu erwarten sein könnte.
Hätte ich deinen alten Betreff-Text "AW: Derartige Probleme kann man auch ..." stehengelassen, wäre es schwieriger zu erkennen gewesen, was ich im Detail näher beschreiben will.
Das ist der eigentliche Grund, wieso der Eine oder die Andere hin und wieder die Betreffzeile ändert.
Ciao
Thorsten
AW: Die Angabe des Betreffs...
14.04.2020 16:52:06
Nepumuk
Hallo,
ich finde es eine Unsitte den Betreff zu ändern. So weiß ich nie auf welchen Betreff eine Antwort kommt. Ich, als Antworter behalte es mir vor auf die eine oder andere Nachfrage zu antworten. Also, lasst den Schei*.
Gruß
Nepumuk
OT: Überzeuge davon zuerst mal WF...! :-] owT
14.04.2020 18:55:57
zuerst
:-?
AW: OT: Überzeuge davon zuerst mal WF...! :-] owT
14.04.2020 19:34:07
zuerst
Hallo,
damit habe ich kein Problem. Der antwortet sowieso nur auf Formelfragen von denen ich keine Ahnung habe.
Gruß
Nepumuk

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige