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

Funktionsaufruf bei Änderung eines Parameter

Funktionsaufruf bei Änderung eines Parameter
07.11.2016 09:22:06
Peter
Hallo,
für mein Problem möchte ich euch zunächst die Ausgangslage beschreiben.
Ich habe in VBA eine eigene Funktion erstellt eta(); sie besitzt drei Argumente (p1,p2,t1). In meiner Excel Tabelle rufe ich diese Funktion in einer Zelle auf. Die 3 Argumente haben ihren Bezug auf 3 verschiedene andere Zellen. Ändert sich nun der Wert einer dieser "Argument-Zellen" aktualisiert sich die Zelle mit der Funktion. Soweit so gut.
Wenn nun andere Berechnung auf der Tabelle ausgeführt werden, die die 3 "Argument-Zellen" verändern, führt dies zum 3-maligen Aufruf meiner Funktion eta.
Aus Performancegründen möchte ich das vermeiden.
Gibt es eine Möglichkeit, das meine Funktion nur neu berechnet wird, wenn sich bspw. ausschließlich p1 ändert, also eine Änderung der anderen Argumente keine Neuberechnung veranlasst?
Hoffe mein Problem verständlich erklärt zu haben. Danke für eure Hilfe!
Gruß Peter

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Application.Volatile...
07.11.2016 10:42:20
Michael
Hallo Peter,
...ist hier vermutlich das Stichwort. Wenn Du in Deiner UDF Application.Volatile nutzt, dann wird die Zelle, in der die jeweilige UDF eingesetzt wird, bei jeder Neuberechnung auf dem Blatt ebenfalls neu berechnet. Standardmäßig (und ohne Nutzung o.a. Methode) wird eine UDF aber immer nur neu berechnet, wenn sich eine Änderung in Ihren Eingabe-Parametern ergibt.
Evtl. ist auch noch die Frage, wie sich die Werte aus den drei Argument-Zellen ergeben; wenn da ebenfalls volatile UDF vorkommen, wird's natürlich knackig...
Siehe auch: https://msdn.microsoft.com/en-us/library/office/ff195441.aspx
LG
Michael
Anzeige
AW: Application.Volatile...
07.11.2016 11:01:30
Peter
Danke Michael,
aber leider würde Volatile, so wie ich das verstehe, genau das Gegenteil von dem bewirken was ich möchte. Meine Funktion soll sich eigentlich NUR dann neu berechnen, wenn sich der Wert p1 ändert. Heißt jegliche Änderung anderer Zellen/Werte/Eingabe-Parameter soll NICHT zur Neuberechnung führen.
Im Grunde suche ich das Gegenteil von Volatile - Nicht aktualisieren, außer bei einer Ausnahme (Ein von mir ausgewählter Eingabe-Parameter ändert sich).
Gruß Peter
Das ist mir schon klar...
07.11.2016 11:17:12
Michael
Peter,
...was Du willst. Ich meinte, dass das von Dir beschriebene Verhalten dann auftritt, wenn Du eine volatile Funktion nutzt - und ob eben in den Zellen, die Dir die Parameter P1-3 für die betroffene UDF liefern, ebenfalls UDF eingesetzt werden, die womöglich volatil sind. Standardmäßig ist eine UDF nie volatil.
Allerdings hast Du Dein Ziel meines Erachtens jetzt neu beschrieben bzw. im Detail geklärt, wenn Du schreibst
NUR dann neu berechnen, wenn sich der Wert p1 ändert. Heißt jegliche Änderung anderer Zellen/Werte/Eingabe-Parameter soll NICHT zur Neuberechnung führen.
D.h. für mich: Du übergibst Deiner UDF 3 Zelladressen, aber lediglich Änderungen in einer dieser drei, sollen zur Neuberechnung führen?!
Ich glaube nicht, dass dies möglich ist; aus meiner Sicht werden alle Funktions-Parameter gleich behandelt. Workaround kenne ich nicht; das heißt allerdings nicht, dass es keinen gibt...
LG
Michael
Anzeige
AW: Das ist mir schon klar...
07.11.2016 11:27:38
Peter
Dann habe ich es wohl am Anfang nicht gut beschrieben, sry.
Aber "Du übergibst Deiner UDF 3 Zelladressen, aber lediglich Änderungen in einer dieser drei, sollen zur Neuberechnung führen?! " beschreibt es wohl am besten :)
Wäre schade wenn das nicht funktioniert, trotzdem vielen Dank Michael!
Vielleich findet sich ja noch jemand mit einer Idee.
Gruß, Peter
Naja, eine Idee hab ich schon...
07.11.2016 12:34:39
Michael
Peter,
...die Frage ist, ob sich das bei Dir im Konkreten umsetzen lässt.
Schau Dir mal das an: https://www.herber.de/bbs/user/109243.xlsm
Die Frage ist eben, ob Du nur den Parameter 1 direkt der Funktion übergibst, und die Parameter 2 und 3 erst innerhalb der Funktion dazuholst, sofern sich eine Systematik in der Beziehung zwischen Parameter 1 zu Parameter 2 und 3 herstellen lässt.
Das kann, je nach Aufgabe Deiner UDF und Aufbau Deiner Tabelle, funktionieren oder auch nicht.
LG
Michael
Anzeige
AW: Naja, eine Idee hab ich schon...
07.11.2016 13:24:38
Peter
Michael,
an sich funktioniert das prima, vorausgesetzt der Offset bleibt konstant. Ist leider in meiner Tabelle nicht zwangsläufig so. Aber ich sehe in welche Richtung es gehen könnte.
Manchmal braucht man nur den richtigen Denkanstoß. Ich danke vielmals!
VG Peter
Evtl. gibt's auch eine Systematik ohne Offset...
07.11.2016 13:29:24
Michael
Peter,
...aber da musst Du vermutlich viel ausprobieren. Das Offset-Beispiel war jetzt nur schnell von der Hand geschrieben, aber theoretisch könntest Du Dir ja die zwei weiteren Parameter auch durch andere Konstruktionen etc. dazuholen; aber das musst Du selbst bei Deinen Gegebenheiten testen.
Insgesamt bzgl. an sich funktioniert das prima ... ich sehe in welche Richtung es gehen könnte
Freut mich! Und Manchmal braucht man nur den richtigen Denkanstoß... ja, willkommen im Forum ;-).
LG
Michael
Anzeige
Das ist grundsätzlich nur mit Texten machbar, ...
07.11.2016 19:20:36
Luc:-?
…Peter (& Michael),
denn eine Fml ist selbst ein Text, der von Xl erst interpretiert wdn muss. Alles, was nicht explizit Text ist, wird von Xl, wenn es sich um eine ZellAdresse handelt, der Aktuali­sierungs­Routine unterworfen. Dabei wdn UDFs ggf ohnehin öfter neu berechnet als zumindest manche StandardFkt. Das hat mit impliziter Fkts­Volatilität auch rein gar nichts zu tun. Das läuft immer so!
Im TabBlatt musst du das also so Schreiben: =Eta(p1-adresse;"p2-adresse";"t1-adresse")
Bei zusätzlicher Verwendung von INDIREKT müsstest du zwar nichts an der UDF ändern, das wäre aber kontraproduktiv, denn INDIREKT ist volatil! Folglich musst du in die UDF eine Erkennung von p2 und t1 einbauen, was dir nicht schwer fallen sollte.
Falls du die Fml trotzdem „ziehbar“ machen willst, musst du so vorgehen wie bei gleichem Anliegen für die XlFktt INDIREKT und HYPERLINK (ADRESSE usw), die dir (bis auf generelle Volatilität) die Lösung deines Problems ja schon vormachen!
Gruß, Luc :-?
PS @ Michael: Hättest du dich an der Hallowe(e/n)n-Diskussion beteiligt oder wenigstens eine meiner BspDateien angesehen, hättest du auch darauf kommen können, denn die Demo-UDF simIf verwendet auch ein TextArgument (ganze Fml!), um ein bestimmtes, von der Norm abweichendes Verhalten von Xl zu erzwingen!
Besser informiert mit …
Anzeige
OT@ Luc: Nö, Hallowenn ist mir zu theoretisch...
08.11.2016 10:01:21
Michael
Morgen,
...Excel (und VBA) sind mir Mittel zum Zweck, Werkzeuge, die ich, wie ich meine, passabel beherrsche um damit bestimmte Aufgaben meiner Arbeitswelt zu lösen. Ich kann im Garten auch ganz passabel mit einer Säge hantieren, würde aber mit Sicherheit bei den Highland Games oder sonstigen Sägewettbewerben kläglich an der Konkurrenz scheitern; das ist mir aber auch egal, weil ich nicht an Highland Games teilnehme! Soll heißen: Ich hab wohl kurz in den Hallowe(e/n)n-Faden gesehen, mich kurz umgesehen und befunden, dass mir das viel zu abstrakt und theoretisch daherkommt; wohlgemerkt für meine Bedürfnisse und Anwendungsszenarien.
Wie unsere Freunde über'm Teich sagen würden: My two cents, your mileage may vary!
LG und schönen Dienstag
Michael
Anzeige
Na, dann; aber hier hast du ja offensichtlich ...
08.11.2016 22:09:13
Luc:-?
…über deine Bedürfnisse „gelebt“, Michael… ;-]
Übrigens, zwischen mir und meinen Freunden liegt kein Teich…
Gruß, Luc :-?
AW: Na, dann; aber hier hast du ja offensichtlich ...
09.11.2016 00:40:51
Michael
Luc,
... darüber entscheide ich schon selbst; das einzuschätzen vermagst Du nicht, ungeachtet Deiner Programmierkenntnisse. Ganz schön anmaßend, würde ich meinen, hättest Du nicht noch ein Emoji gesetzt...
Und, dass ich nicht über Deine oder meine "echten" Freunde gesprochen habe, war Dir schon klar. Man muss nicht jede Aussage semantisch zerlegen...
Lg und schönen Abend
Michael
Na, na, auch ohne Emoji ist das ja als nahezu ...
09.11.2016 19:07:46
Luc:-?
…politisches Wortspiel zu verstehen, Michael,
bezogen auf die von dir erwähnten Bedürfnisse. ;-)
Und die Freunde überm Teich sind dann unechte…? ;-]
Luc :-?
Anzeige
@Luc: Ja, seit heute gar keine Freunde mehr :-),oT
09.11.2016 23:23:10
Michael
Warum erst seit heute, ...
10.11.2016 01:11:27
Luc:-?
…Michael…?
War übrigens recht spannend und ich habe das ebenso wie dein Namensvetter Moore kommen sehen. Fr Clinton war keine echte Alternative (hat die Partei­Führung der Demokraten verbockt und Trump - mit pfälzischem Großvater - hat die der Republikaner als eigentlich Unabhängiger über­tölpelt, was beiden recht geschieht!) oder wie ein bekannter dt BallSportler es neulich mal aus­drückte, die US-Bürger hatten die Wahl zwischen Pest und Cholera und die Pest hat gewonnen, wie A.Müller meint. Aber viell bleibt uns so ja auch der 3.Weltkrieg (vorerst) erspart…
Was würdest du wählen, wenn du weißt, bei der einen Alternative bleibt alles so wie es ist oder wird gar noch schlimmer und bei der anderen ist alles offen? Die Hoffnung stirbt ja bekanntlich zuletzt und wenn man nicht alles infrage stellen will oder kann, greift man auch nach einem Strohhalm. Trotzdem soll ja in der Wahlnacht zu einem bestimmten ZeitPkt (gerüchtweise!) der Server der kanadischen Einwan­derungs­behörde zusammen­gebrochen sein… ;-]
Na, wir wdn ja ab Jan/Feb sehen, was daraus wird…
Gruß, Luc :-?
Anzeige
Da hast Du auch wieder Recht...
11.11.2016 10:53:35
Michael
Luc,
(sorry, war eingespannt und daher reagiere ich erst jetzt)
...eine solche Wahl zwischen "Alternativen" ist sicherlich schwierig.
der Server der kanadischen Einwan­derungs­behörde zusammen­gebrochen sein Ja, hab ich auch gehört, genauso wie die Zugriffszahlen auf neuseeländische Informationen im Web (Einreisebestimmungen etc.) ebenfalls exponentiell gestiegen sein sollen. Wen will's wundern?
Die Hoffnung stirbt ja bekanntlich zuletzt In diesem Sinne: Schönes Wochenende!
Michael
Dito WE! ;-) Gruß owT
11.11.2016 21:17:30
Luc:-?
:-?
Hallo wenn und Hallo Wien
11.11.2016 15:31:28
Michael
Hi,
irgendwie ist mir Lucs Faden auch entgangen, aber dank des Hinweises an Werner habe ich ihn dann doch einigermaßen gründlich überflogen.
Insbesondere die Zusammenfassung hat mir getaugt, wenn ich auch zugeben muß, daß ich die Besonderheiten mit strings als Parameter überlesen habe.
In dem Zusammenhang fällt mir ein, daß man mal überprüfen könnte, inwieweit Excel nicht die Zweige, sondern die Bedingungen auswertet: bei meinem guten, alten Pascal-Compiler (TP 3.01) hieß es, daß nachfolgende Bedingungen ("rechts") gar nicht mehr berechnet werden, sobald ein eindeutiges Ergebnis vorliegt.
Was ich so verstehe, daß bei einer Konstruktion wie a=0:b=1: If (a=b) And (weitere Bedingungen) alles nach dem And schon wurscht ist, weil durch das false links vom And der ganze Ausdruck false ist.
Die Bedeutung liegt dann in der optimierten Umsetzung der (erwarteten) Priorität von Bedingungen, anhand derer man die Ifs formuliert und ggf. verschachtelt, um z.B. ein Event-Makro möglichst schnell verlassen zu können, falls nichts zu tun ist.
Man sehe sich an:
Option Explicit
Dim jj&, kk&
Function fj(i) As Boolean
jj = jj + 1
fj = (i And 2) = 2
End Function
Function fk(i) As Boolean
kk = kk + 1
fk = (i And 4) = 4
End Function
Sub testen()        ' *** die hier aufrufen ***
Const wdh = 10000
Cells.Clear
Call test0("A", wdh)
Call test1("D", wdh)
End Sub
Sub test1(sp$, wdh&)
Dim i&, j&, k&, w&
Dim a(499, 1)
Dim t0 As Single
For i = 0 To 499: a(i, 0) = i: Next
t0 = Timer
For w = 1 To wdh
kk = 0: jj = 0
For i = 0 To 499
If (i And 1) = 1 Then If fj(i) Then If fk(i) Then a(i, 1) = 1
Next
Next
Range(sp & "3") = "t : " & (Timer - t0)
Range(sp & "1") = "jj: " & jj
Range(sp & "2") = "kk: " & kk
Range(sp & "4").Resize(500, 2) = a
End Sub
Sub test0(sp$, wdh&)
Dim i&, j&, k&, w&
Dim a(499, 1)
Dim t0 As Single
For i = 0 To 499: a(i, 0) = i: Next
t0 = Timer
For w = 1 To wdh
kk = 0: jj = 0
For i = 0 To 499
If ((i And 1) = 1) And fj(i) And fk(i) Then a(i, 1) = 1
Next
Next
Range(sp & "3") = "t : " & (Timer - t0)
Range(sp & "1") = "jj: " & jj
Range(sp & "2") = "kk: " & kk
Range(sp & "4").Resize(500, 2) = a
End Sub
Wenn man das Ding mit kleinen wdh einsetzt, ist der Unterschied wurscht, aber bei wdh=10000 sieht man schon, worauf es hinausläuft.
Schöne Grüße & baba nach Wien,
Michael
Anzeige
Ja, das ist auch bei VBA so, ...
11.11.2016 21:23:44
Luc:-?
…Michael,
nur war das bei Fmln nicht unbedingt zu erwarten, da WENN hier eine Fkt ist. Aber da jede Fml Text ist und erst interpretiert wdn muss, kann so etwas der Interpreter realisieren, macht das auch meist, aber nicht in jedem Fall, weil noch andere Bedingungen und daraus abgeleitete Aktivitäten desselben eine Rolle spielen.
Gruß, Luc :-?
AW: Ja, das ist auch bei VBA so, ...
12.11.2016 18:49:47
Michael
Hi,
genau genommen war das damals ein Compiler-Schalter, mit dem man das Verhalten beeinflussen konnte.
Bei "normalen" Functions isses ja (bis auf die Zeit) eh wurscht, aber wenn ein Aufruf derselben noch was anderes beeinflußt (wie meine globalen Variablen oben), sollte man wissen, was man tut.
Naja, ich arbeite daran...
Schöne Grüße,
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige