emeriks
Goto Top

Excel - VBA - Static Variable

Hi,
wie muss man es anstellen, damit im Excel VBA eine Variable dauerhaft gefüllt bleibt?

Ziel
Ich will eine Public Function schreiben, welche als Tabellen-Funktion verwendet werden soll.
Also
  1. ein Modul erstellt,
  2. dort eine Public Function erstellt und
  3. diese Funktion in der Tabelle benutzt.
Kein Problem, das funktioniert.

Nur will ich jetzt rechenintensive Zwischenergebnisse, welche in dieser Funktion anfallen und für alle nachfolgenden Funktionsaufrufe identisch sind, für den nächsten Aufruf der Funktion beibehalten, damit ich diese nicht noch einmal berechnen muss.

Versuche
Ich habe es mit einer Variable auf Modul-Ebene versucht. Sie ist bei jedem Aufruf der Funktion über das Tabellenblatt wieder leer.
Ich habe es mit einer Static Variable innerhalb der Funktion versucht. Aber auch diese ist bei jedem Aufruf der Funktion über das Tabellenblatt wieder leer.

Wie muss ich sowas unter Excel VBA anstellen?

E.

Edit:
"Einfache" Werte könnte ich irgendwo auf einer Tabelle zwischenlagern, ich weiß. Unschön, aber es würde funktionieren.
Ich habe hier aber komplexere Objekte, welche das betrifft.

Content-Key: 644693

Url: https://administrator.de/contentid/644693

Printed on: April 23, 2024 at 10:04 o'clock

Member: StefanKittel
StefanKittel Jan 26, 2021 at 14:35:59 (UTC)
Goto Top
Hallo,

mehr als eine Public-Variable in einem Modul gibt es nicht in VBA.
https://www.vba-tutorial.de/variablen/lebensdauer.htm

Option Explicit
Public ueberall As Boolean

Du kannst aber statt einer Variable eine Funktion verwenden welche den Wert in eine Zelle, Registry oder Datei schreibt.

Stefan
Member: emeriks
emeriks Jan 26, 2021 at 14:46:15 (UTC)
Goto Top
Zitat von @StefanKittel:
mehr als eine Public-Variable in einem Modul gibt es nicht in VBA.
https://www.vba-tutorial.de/variablen/lebensdauer.htm
Na doch, es gibt noch Static Varaiblen. Doch das funktioniert offenbar nur innerhalb "eines Laufs" (Runtime).

Bsp:
2 Functions, A und B
A ruft mehrmals B auf
B hat eine mit Static deklarierte Variable. Dann bleibt deren Inhalt für alle Aufrufe von B innerhalb des Laufs von A erhalten.
Das Problem scheint zu sein, dass ein Aufruf einer Funktion aus einer Tabelle heraus jedes Mal eine neue Runtime darstellt und damit die Static-Variablen wieder bei Null anfangen. Das gilt übrigens auch für Modul-Variablen.

Du kannst aber statt einer Variable eine Funktion verwenden welche den Wert in eine Zelle, Registry oder Datei schreibt.
Das nütz mir nur nichts bei komplexeren Objekten.
Member: StefanKittel
StefanKittel Jan 26, 2021 at 15:30:57 (UTC)
Goto Top
Zitat von @emeriks:
Na doch, es gibt noch Static Varaiblen. Doch das funktioniert offenbar nur innerhalb "eines Laufs" (Runtime).
Ne, Static ist wie Public aber auf die Funktion begrenzt. Quasi ein lokal public.
Während Public überall aufrufbar ist.

Sobald Excel seine Runtime beendet kommen alle Variablen in die Tonne.

Das nütz mir nur nichts bei komplexeren Objekten.
Vieleicht ist Excel als VBA Runtime dafür nicht optimal?
Ein C++ Programm gegenüber VBA ist ungefähr 100-1000 mal schneller in der Ausführung.

Du könntest versuchen mit alloc Speicher zu allozieren und Dir in einer Zelle nur den Pointer merken.
Habe ich in VBA noch nie probiert.

Stefan
Member: emeriks
emeriks Jan 26, 2021 at 15:35:21 (UTC)
Goto Top
Zitat von @StefanKittel:
Ne, Static ist wie Public aber auf die Funktion begrenzt. Quasi ein lokal public.
Während Public überall aufrufbar ist.
Na ja, nicht ganz. Aber ich denke, wir meinen das selbe.

Sobald Excel seine Runtime beendet kommen alle Variablen in die Tonne.
In Outlook VBA funktioniert das aber mit Modul-Variablen.

Ein C++ Programm gegenüber VBA ist ungefähr 100-1000 mal schneller in der Ausführung.
Ja klar. VBA ist aber hier das Mittel der Wahl. Ich könnte es auch in VB.Net oder C# schreiben.
Member: StefanKittel
StefanKittel Jan 26, 2021 at 15:42:25 (UTC)
Goto Top
Zitat von @emeriks:
Na ja, nicht ganz. Aber ich denke, wir meinen das selbe.
Roger

Sobald Excel seine Runtime beendet kommen alle Variablen in die Tonne.
In Outlook VBA funktioniert das aber mit Modul-Variablen.
Die MS-Programme haben teilweise eine merkwürdige Auffassung was "Ende der Ausführung" bedeutet.

Ich habe verschiedene Module in Outlook VBA wo ich Public Variablen verwende.
Beim debuggen deaktviere ich die Teile die funktionieren und eine zeitlang bleiben diese Variablen erhalten.
Aber nach einer gewissen Zeit sind die auf einmal leer. Mal nach 3 Aufruffen und mal nach 15.

Mehr Tipps habe ich nicht.

Viel Erfolg
Mitglied: 147323
Solution 147323 Jan 26, 2021 updated at 16:07:10 (UTC)
Goto Top
Hab das hier mal so nachgestellt:

Public Variable in "DieseArbeitsmappe"

screenshot

Dann zwei Funktionen die im Codeabschnitt des ersten Tabellenblattes liegen und einmal die Variable setzen und auch abfragen

screenshot

Zwischen den Aufrufen der beiden Subs bleibt der Inhalt der Variablen so lange erhalten bis man Excel wieder schließt, auch die Abfrage aus weiteren anderen Tabellenblättern oder Modulen ist kein Problem, das sollte dir doch reichen oder nicht??

Gruß j
Member: emeriks
emeriks Jan 26, 2021 at 16:21:05 (UTC)
Goto Top
Zitat von @147323:
Danke, das war der richtige Hinweis!

Man muss die Modul-Variable incl. des Modulnamens verwenden. Dann geht sogar Private (einfaches Dim).

Modul1
Dim test As Integer

Public Function TestA() As Integer
  Modul1.test = Modul1.test + 1
  TestA = Modul1.test
End Function