Ich versuche, ein Excel-Makro aufzurufen, das sich in einer anderen Arbeitsmappe befindet. Es handelt sich um ein Blatt-spezifisches Makro, aber die Syntax, die von der Microsoft-Dokumentation und den Recherchen im Internet gegeben wird, bietet nur eine Möglichkeit, auf ein Makro nur über die Arbeitsmappe zuzugreifen. Diese Syntax ist:
%Vor%Was ich tun muss, ist ein Blatt Verweis in dort auch, etwas wie:
%Vor%Ich habe dies und viele andere Varianten versucht, einschließlich einfacher oder doppelter Anführungszeichen, aber ich bekomme immer die Nachricht, dass das Makro nicht gefunden werden kann.
Bearbeiten: Mit all den Hinweisen und vielen Tests fand ich die Antwort. Sie können auf Sheet-spezifische Subs zugreifen, aber Sie müssen den kanonischen Namen wie 'Sheet1' verwenden, Sie können den tatsächlichen Sheetname nicht verwenden. Anscheinend greifen andere Arbeitsmappen nicht auf diese Informationen zu.
Das obige Format funktioniert also so lange, wie Sie nicht versuchen, den Blattnamen zu verwenden (und Sie müssen den Arbeitsmappen-Namen einfach angeben (indem Sie CHR(39)
mit einem der beiden Enden verknüpfen).
Ich weiß, dass Sie das herausgefunden haben, wahrscheinlich nach viel Haartrinken und Kaffee, aber ich wollte:
Zunächst ist der gewünschte Arbeitsblattname nicht identisch mit dem Namen des Codemoduls. In Ihrem VBE sehen Sie also, dass der Name des Codemoduls "Sheet1" ist, aber wenn es eine andere Eigenschaft von Name
gibt, die anders ist, zum Beispiel " MySheet1 "(oder es kann auch dasselbe sein).
Um es mit Namen zu erhalten, müssen Sie einige Schleifen machen, Sicherheitseinstellungen ändern usw. Wenn Sie danach suchen (dies funktioniert in kleineren Umgebungen aufgrund des Problems mit der Sicherheitseinstellung), hier Gehen Sie als Beispiel:
Erstellen Sie eine Arbeitsmappe mit einem
Arbeitsblatt. Benenne es um " MySheet1 ".
Öffne die VBE (Alt + F11) und in
" Tabelle1 (MySheet1) " erstellen Sie eine Untergruppe
Routine, nennen Sie es TimesTen
und in
der Code setzen Sie einfach Debug.Print 10 *
10
. So:
Speichern Sie die Datei als Makro-aktiviert dokumentieren und nennen Sie es " MacroXSLX.xlsm ". Lass es offen.
Öffnen Sie ein neues Excel-Dokument, navigieren Sie es ist VBE und in einem neuen Makro Irgendwo, erstellen Sie ein Sub namens %Code%. Im Körper dieses Codes, Stellen Sie dies: .
%Vor% Drücken Sie F5, um Test
und Sie auszuführen
sollte in der Immediate 100 sehen
Fenster.
Sie können in # 4 sehen, dass ich alle Komponenten (Module, Klassen usw.) durchlaufen habe und nach dem Objekt mit der Eigenschaft test
mit dem Wert MySheet1 suche . Sobald ich das habe, kann ich dann den Namen dieser Komponente erhalten, der in diesem Fall Sheet1 ist, und diese verwenden, um meine Zeichenfolge zu erstellen, die das Makro des Sheets in MacroXSLX.xlsm . Der Code kann weiter bereinigt werden, um die For-Anweisung zu beenden, wenn Sie gefunden haben, was Sie wollen, usw.
Wie oben erwähnt, ist der einzige wirkliche Nachteil die Sicherheitseinstellungen, die sicherstellen, dass Sie programmatischen Zugriff auf das VBAProject haben - gut für einen bis zehn Computer, aber es könnte ein Aufwand sein, wenn Sie mehr als das sicherstellen müssen sind immer richtig eingestellt.
können Sie Ihr Makro anpassen, um einen Bogennamen als Parameter zu akzeptieren? Wenn Sie es dann in der Arbeitsmappe Ihres Originals aufrufen, können Sie es einfach MyMacro (me.name) nennen. Wenn Sie es dann von Ihrer anderen Arbeitsmappe aus aufrufen, könnten Sie es einfach als application.run ("testworkbook.xls! MyMacro", "sheetname") bezeichnen, wobei "sheetname" Ihr Parameter ist.
Ich bin mir nicht sicher, ob es anders geht.
Besitzt das VBA-Projekt einen Passwortschutz? Ist das Sub ein privates Sub? Wenn ja, dann glaube ich nicht, dass das Makro gefunden wird.