Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1940to1944
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

Property erst bei Bedarf berechnen

Property erst bei Bedarf berechnen
24.08.2023 12:07:03
Florian
Hi

Mein Ziel:
Eine Variable eines Klassenmoduls soll erst dann berechnet werden, wenn sie verlangt wird. Denn die Berechnung dauert lange und die Variable wird nicht immer gebraucht.

Das habe ich mit folgendem Code gemacht:

'Makro
Sub Berechnung()

Dim a As New clsTest
Dim b
b = a.Masse
End Sub



'Klassenmodul clsTest
Option Explicit

Dim m_Abmessungen

Property Get Masse()
Debug.Print TypeName(m_Abmessungen)
If Not IsArray(m_Abmessungen) Then Berechne_m_Abmessungen
Masse = WorksheetFunction.Product(m_Abmessungen)
End Property

Sub Berechne_m_Abmessungen()
m_Abmessungen = Array(3, 5, Time * 24 * 3600)
End Sub


Doch funktioniert das auch wirklich so?
Die Zeile "Debug.Print TypeName(m_Abmessungen)" liefert erwartungsgemäß "Empty".
Wenn ich aber vor dieser Stelle beim schrittweise Durchlauf im Lokalfenster Me öffne, dann liefert es "Variant()", denn m_Abmessungen ist bereits ausgerechent.

Werden etwa die Properties intern immer berechnet, als bei jedem Schritt auf Stand gehalten?
Falls ja, wie kann ich dann mein oben beschriebenes Ziel erreichen?
Falls nein, wie kann ich überprüfen, dass mein oben beschriebenes Ziel erreicht ist?

LG,
Florian

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Property erst bei Bedarf berechnen
24.08.2023 12:59:55
Nepumuk
Hallo Florian,

abgesehen davon , dass man in Eigenschaften nichts berechnet, immer wenn du dir eine Eigenschaft anzeigen lässt, wird sie berechnet.

Gruß
Nepumuk
Property erst bei Bedarf berechnen
24.08.2023 17:40:59
Yal
Hallo Florian,

eigentlich genau wie Nepumuk es gesagt hat. Aber vielleicht ausführlicher:

Ein Property kann aus 2 Prozeduren bestehen: Let und Get.
Mit Let werden Werte in das Property berechnet oder reingeschrieben (Write), mit Get wird entweder deren Inhalt gelesen oder irgendwas berechnet und zurückgegeben (Read. Wenn "Let" nicht verwendet wird, wie bei Dir, hat man de facto eine "Read Only"-Variable).

Du hast damit 2 Möglichkeit:
_ Calculation on Write: die Berechnung, also CPU-Last, wird schon beim Wertübergabe stattfinden. Könnte blöd sein, solte es viele "Write" geben, aber deren Ergebnis nie gelesen werden.
_ Calculation on Read: die Berechnung findet vor der Rückgabe statt. Könnte blöd sein, wenn diese Property 100.000 gelesen wird, ohne dass dei Eingangsgrösse sich geändert haben.

Dein Zwischen-Form "Calc on Read, but only once" kann auch funktionieren. Du solltest nur
entweder deine lokal, private "m_Abmessung" mit einer Dummy-Wert vorbelegen, die theoretisch nie vorkommt (0, -1) und dann diese Wert testen: hat die Variable die Dummy-Wert, muss es berechnet, hat es nicht, direkt zurückgeben,
oder ein konsequente ausnutzung von "Variant": m_Abmessung = False, solang keine Kalkulation, dann ein Zahl (oder irgendwas, aber eben nicht "False"), wenn kalkuliert.

Ich gehe davon aus, dass die heir gegebene Beschreibung von "Berechne_m_Abmessungen" nur zum Posting so einfach ist. Weil wenn tatschlich so lohnt sich nicht den Umweg über "Worksheetfunction.Product", die auch Rechenzeit kostet.

Noch ein Punkt entdecke ich: in deiner Konstellation wird die Worksheetfunciton IMMER ausgeführt.
Gemient war wahrscheinlich:
Dim m_Abmessungen

Dim m_Ergebnis

Private Sub Class_Initialize()
m_Ergebnis = False
End Sub

Property Get Masse()
If Not m_Ergebnis Then m_Ergebnis = 1296000 * Time 'entspricht 3 * 5 * Time * 24 * 3600
Masse = m_Ergebnis
End Property



VG
Yal
Anzeige
Property erst bei Bedarf berechnen
24.08.2023 18:28:47
Florian
Hallo Yal, hallo Nepumuk,

danke für Eure ausführlichen Antworten.
@Nepumuk:
"immer wenn du dir eine Eigenschaft anzeigen lässt, wird sie berechnet."
Dazu zählt offensichtlich auch das Anzeigen im Direktfenster bei schrittweiser Ausführung. Das hat mich irritiert. Weil einmal wurde neu berechnet und dann wieder nicht. Eben, ob ich da auf Me klicke oder nicht.

"abgesehen davon , dass man in Eigenschaften nichts berechnet"
Man kann aber. Geht doch. Sicher keine großen Berechnungen, aber eine kleine Multiplikation muss schon drinnen sein. Habe in meiner Internet-Recherche nichts davon gelesen, diese Erkenntnisse gewinnt man offensichtlich erst mit der Erfahrung. Danke.

@Yal:
Ich habe als Kriterium zur Neuberechnung die Existenz eines Arrays genommen. Wenn ein Array da ist, dann ist es richtig. Bei Zahlen-Variablen =0 wäre das nur bedingt gegangen, denn wenn es blöd hergeht, ist das Ergebnis des Werts dann vielleicht wirklich 0, und ich berechne unnötigerweise neu. Daher: Dein kleiner Hinweis am Rande in der Initialisierung m_Ergebnis = False zu setzen ist sehr nützlich. Ich werde das einbauen. Danke.

Ja, ich wollte nur Get, kein Let. Damit man nicht von aussen hineinpfuschen kann. Zum Schutz der Variablen.

In meiner Anwendung ist die Aufstellung des Arrays (der vielen Arrays) das große Ding, das ich nicht jedesmal durchführen will. Die Multiplikation im Get ist nur auf diese Variable bezogen, daher habe ich es da reingeschrieben.

Ja, von "Worksheetfunction.Product" bin ich wieder abgekommen. Alle Werte des Arrays in einer For Each-Schleife aufzumultiplizieren geht schneller. Hier habe ich es nur wegen der einfacheren Darstellung verwendet. Danke für den Hinweis.

LG,
Florian
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige