Es ist möglich zu erkennen, welche Arbeitsmappe eine Funktion in einem Excel-Add-In (xla) aufgerufen hat.

StackOverflow https://stackoverflow.com/questions/4901148

Frage

Ich möchte eine kleine Protokollierungsfunktion in ein Excel-Add-In schreiben, das ich aus vielen verschiedenen Arbeitsmappen aufrufen werde.Ich möchte es einfach aufrufen können, indem ich nur den Protokolltext übergebe, und die Protokollfunktion selbst kann den Zeitstempel, den Arbeitsmappennamen usw. verarbeiten

Ich kann jedoch weder ThisWorkbook noch ActiveWorkbook verwenden, um zu bestimmen, welche Arbeitsmappe für den Aufruf verantwortlich war, da Thisworkbook einen Verweis auf das Add-In selbst zurückgibt, während VBA-Code in einer anderen Arbeitsmappe als der Arbeitsmappe mit aktivem Fokus ausgeführt wirdIn Excel könnte der Anruf getätigt werden, aber das ActiveWorkbook gibt denjenigen zurück, der den Fokus im Fenster hat.

Application.Caller sah nach einer möglichen Lösung aus, aber dies scheint nur zu funktionieren, wenn die Funktion von einer Zelle aus aufgerufen wird, nicht von VBA.

Ist das, was ich versuche, unmöglich?

Update

Laut> 1 Person ist dies tatsächlich unmöglich.Wenn jemand eine clevere Problemumgehung kennt, melden Sie sich bitte.

War es hilfreich?

Lösung

ok, also habe ich die Frage richtig gelesen, werde ich es noch einmal versuchen ...

so, um das Problem anzugeben:

Sie möchten, dass eine Routine in einem Addin geschrieben wird, dass beim Angerufen von VBA in einer anderen Arbeitsmappe (unter anderem), welche Arbeitsmappe die VBA enthält, die den Anruf erstellt hat, ohne diese Informationen explizit übergeben zu müssen.

Wie gesagt, ist dies nicht möglich (dies ist eine ähnliche Frage, um auf den Anrufstapel vom Code zuzugreifen: etwas, das mein Wissen nicht möglich ist)

Sie können jedoch fast das bekommen, was Sie wollen, so

Deklarieren Sie Ihre Protokollfunktion so: generasacodicetagpre.

dann, wo auch immer Sie den Untergebrauch anrufen generasacodicetagpre.

nicht ganz so gut wie nichts passiert, aber zumindest sein immer das gleiche

Andere Tipps

Um den Namen der anrufenden Arbeitsmappe zu erhalten, verwenden Sie generasacodicetagpre.

application.caller gibt Informationen darüber zurück, wie Visual Basic aufgerufen wurde.Wenn aus einer benutzerdefinierten Funktion aufgerufen wird, die in einer einzelnen Zelle eingegeben wird, ist ein Bereichsobjekt, das angibt, dass die Zelle zurückgegeben wird

mit einem Verweis auf die Zelle, .Worksheet.parent.name gibt Ihnen den Namen der Arbeitsmappe

Beachten Sie, dass Application.Caller andere Dinge zurückgibt, je nachdem, wie Ihre Funktion aufgerufen wird (siehe VBA-Hilfe für Details)

In einer Add-In-Funktion, die von einem Excel-Arbeitsblatt-Array aufgerufen wird

Ich hatte das gleiche Problem beim Codieren einer benutzerdefinierten Funktion.Die Funktion funktioniert gut, aber jedes Mal, wenn eine andere Arbeitsmappe berechnet oder aktiviert wird, werden alle Zellen, die diese Funktion verwenden, auf #value zurückgesetzt.Es kann sehr frustrierend sein, mit dieser Datei mit mehreren Dateien zu arbeiten.

So erhalten Sie die von mir verwendete Arbeitsmappe:

Dim CallingWb As Workbook
Set CallingWb = Application.Caller.Parent.Parent

Dies sollte funktionieren, wenn sich Ihre Funktion in einer Zelle befindet.

Für den ursprünglichen Beitrag zu spät, könnte aber anderen helfen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top