Excel - VBA - Static Variable

Mitglied: emeriks

emeriks (Level 5) - Jetzt verbinden

26.01.2021, aktualisiert 15:32 Uhr, 373 Aufrufe, 7 Kommentare

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.
Mitglied: StefanKittel
26.01.2021 um 15:35 Uhr
Hallo,

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

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

Stefan
Bitte warten ..
Mitglied: emeriks
26.01.2021 um 15:46 Uhr
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.
Bitte warten ..
Mitglied: StefanKittel
26.01.2021 um 16:30 Uhr
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
Bitte warten ..
Mitglied: emeriks
26.01.2021 um 16:35 Uhr
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.
Bitte warten ..
Mitglied: StefanKittel
26.01.2021 um 16:42 Uhr
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
Bitte warten ..
Mitglied: 147323
147323 (Level 1)
LÖSUNG 26.01.2021, aktualisiert um 17:07 Uhr
Hab das hier mal so nachgestellt:

Public Variable in "DieseArbeitsmappe"

screenshot - Klicke auf das Bild, um es zu vergrößern

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

screenshot - Klicke auf das Bild, um es zu vergrößern

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
Bitte warten ..
Mitglied: emeriks
26.01.2021 um 17:21 Uhr
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
Bitte warten ..
Heiß diskutierte Inhalte
LAN, WAN, Wireless
8 Geräte - verteilen oder auf einen Switch?
DoKi468Vor 1 TagFrageLAN, WAN, Wireless12 Kommentare

Hallo liebe Admins, eine kurze Frage: Ich habe hier eine FB 6190 Cable stehen sowie einen noch unmonitored switch mit 8 Anschlüssen. Momentan sieht ...

LAN, WAN, Wireless
"Ethernet verfügt über keine gültige IP-Konfiguration"
gelöst archITVor 1 TagFrageLAN, WAN, Wireless18 Kommentare

Moin, folgendes Problem: Jedes mal, wenn ich meinen PC an mache, muss ich die Problembehandlung auf der Ethernet schnittstelle ausführen, dass ich Internet habe. ...

Netzwerke
Hardware-Firewall - NGFW - UTM für Privatgebrauch
LordVoodooVor 1 TagFrageNetzwerke7 Kommentare

Hallo liebe Community, seit mehreren Wochen beschäftige ich mich nun schon mit dem Thema Hardware-Firewall, ausgelöst durch Begriffe wie UTM / NGFW / Layer-7-DPI. ...

Microsoft
PDF editor mit spezieller exportfunktion
FlorianHeVor 23 StundenFrageMicrosoft10 Kommentare

Hi leute. Ich habe eine Frage. Bei uns in der Instandhaltung kommt es oft vor das wir änderungen an den Elektrischen Anlagen oder Mechanichen ...

Switche und Hubs
Ist bei einem kleinen Switch Rackmount Kit dabei?
CubeHDVor 1 TagFrageSwitche und Hubs5 Kommentare

Hallo, ich möchte den "HPE OfficeConnect 1420 16G Switch" kaufen. Der Switch hat 16 Ports und ich möchte diesen in einen Standard 19 Zoll ...

TK-Netze & Geräte
Umstellung von ISDN auf VoIP, 4 Sprachkanäle über 2 DSL-Anschlüsse
Gohla2019Vor 16 StundenFrageTK-Netze & Geräte14 Kommentare

Hallo, ich brauche einmal etwas Hilfestellung bei einer geplanten Umstellung einer Telefon-Installation von ISDN-Technik auf VoIP. Vor Ort gibt es zurzeit 2 ISDN-Leitungen, so ...

LAN, WAN, Wireless
Verbindung 10GB mit Switch
Heimerdinger1000Vor 1 TagFrageLAN, WAN, Wireless4 Kommentare

Hallo, ich habe ein merkwürdiges Problem, welches ich mir nicht erklären kann. Ausgangssituation: Ich habe 2 Rechner mit 10GB-Netzwerkkarten über einen 10GB-Switch angebunden. Kopiere ...

Firewall
Nextcloud absichern
BalivorinskyVor 1 TagFrageFirewall9 Kommentare

Hallo, ich möchte eine Nextcloud bestmöglich vor Angriffen absichern. Dazu gibt es 2 Varianten: A. Lokal auf Ubuntu B. Nextclod auf einem Hoster 1. ...