PDA

Vollständige Version anzeigen : Zellenaktualisierung per VBA (Function)


capricornus
14.07.2006, 11:58
Hallo!

Ich habe das Forum längere Zeit nach einer Lösung durchsucht, bin aber bis jetzt leider nicht nicht fündig geworden. Hoffe auch anderen mit meiner hoffentlich nicht dumme Frage weiterhelfen zu können:

Excel 2003

Sheet1 dient der Auswertung
Sheet2 stellt die Daten zu Verfügung

Die Zellen in Sheet1 (in denen das Ergebnis stehen wird) verweist auf eine Funktion im gleichen Sheet die auch einwandfrei funktioniert und sich die Werte über vlookup aus sheet2 sucht, berechnet und zurückgibt.

Wenn ich nun aber im sheet2 die Grundwerte manuell ändere, berechnet mir das sheet1 nicht via vlookup die Werte neu. *gr*
Ich muss immer manuell in die Zellen klicken und bestätigen, er "Neuberechnung F9" geht es leider auch nicht.

Muss ich eine Schaltfläche erstellen um das Blatt via VBA neu berechnen zu lassen??

Bin mehr in Access in VBA und traue mich nun in Excel an die ganze Sache.

Danke!!!

Capri

Trantüte
14.07.2006, 12:52
hi capri

probier mal:

Application.Volatile

ganz oben in deine funktion einzubauen.

mfg david

MRR
14.07.2006, 12:55
Hallo Capri,
wie stelle ich mir das vor? Du hast eine VBA-Funktion, die in Sheet1 aufgerufen wird?
Dann würde gleich zu Beginn der Funktion folgende Zeile weiterhelfen:
Application.Volatile

Oder was musst du mir/uns noch an Info liefern?

Hans Hofmann
14.07.2006, 14:39
Hallo zusammen,

ja, immer feste druff mit Application.Volatile. Habt ihr euch eigentlich mal überlegt, was Application.Volatile anrichtet? Nur kein Versuch die Funktion, wenn es sich darum handeln sollte, korrekt zu formulieren....
Function Tuwas(Argumente)
Wenn eine Funktion zellenbezogene Argumente erhält, dann rechnet sie auch korrekt, wenn sich in Argumente was ändert!

capricornus
14.07.2006, 15:26
Man sollte erst mal bitte darauf achten, wie man hier seine Sätze formuliert. Ich habe hier keine Lust die Definition einer Funktion zu beschreiben. Wie gesagt, in Access ist VBA kein Thema für mich, 12 Jahre Erfahrung sprechen da für sich. In Excel schauen die Befehlsparameter anders aus.

Für Hans Hofmann nun zwei Dinge.

1) Was "richtet" denn nun Application.volatile genau aus. Aus Ihrem Satz bin sicher nicht nur ich nicht wirklich schlau geworden.

2) wenn ich in einer Zelle eine Funktion, die bekanntlich einen Wert zurück liefert aufrufe wie folgt

=HoffentlichWirdsVerstanden(4711)

In dieser Funktion passiert nun folgendes. Mittels Vlookup lasse ich aus Sheet2, die dazugehörigen Werte zu 4711 suchen, berechnen und in die Zelle zurückgeben.

ÄNDERE ich nun die Werte in Sheet2 bei 4711, berechnet das Feld auf Sheet1 die Funktion HoffentlichWirdsVerstanden(4711) nicht automatisch neu. Erst nach dem ich in die Zelle ging und neu bestätigt habe.

Es ist also eine Funktion vorhanden die über Sveweis Werte aus einem anderen Sheet mit einbezieht, verhackstückelt und auch korrekt funktioniert...die Funktion :-)

Gruss
Capri

capricornus
14.07.2006, 15:28
by the way...der Vorschlag

Application.Volatile funktioniert einwandfrei. Danke Trantüte und MRR!!

Capri

Hans Hofmann
14.07.2006, 16:09
Zum einen ist aufgrund Deines Postings die Sachlage unklar, was überhaupt die Ursache für Dein Problem ist und ein vorschnell dahin geworfenes Application.volatile ohne Beschreibung der Nebenwirkungen ist kein guter Ratschlag!

Wenn also Application.volatile Dein Problem vordergründig "löst", dann muss das vertieft werden:
Nun, <b>EIN</b> Application.volatile hebelt die gesammte Berechnungshierarchie der betroffenen <b>XL-Instanz</b> aus. Damit wird grundsätzlich bei JEDEM Berechnungsschritt JEDE Funktion neu berechnet. Das geht schnell in einen Bereich, wo die Anwendung nicht mehr vernüftig arbeitet, weil die Anzahl der benötigten Berechnungsschritte expotenziell ansteigt. Man kennt auch flüchtige Funktionen, solche ohne Argument, wie z.B. JETZT(), ZUFALLSZAHL(), usw. aber auch auch INDIREKT gehört dazu, die dasgleiche bewirken.
Deshalb sollten Funktionen einen Zellenbezug als Argument erhalten. Daran entscheidet XL, ob die Funktion bei Änderung des Eingangsargumentes neu berechnet wird...

Der Verweis auf Application.volatile kann notwendig sein, sollte aber immer auch die Konsequenzen beschreiben - wenn man wirklich Hilfestellung leisten will und nicht neue kaum noch zu ergründende Probleme auftürmen will.

capricornus
15.07.2006, 09:52
Ich weiß was Du meinst jedoch solltest Du auch wissen das der Ton in einem Forum immer eine Rolle spielt! Wenn meine Erklärung die Sachlage nicht klar dargestellt hat, kann man das auch einfach erfragen und nicht gleich Dinge in Frage stellen:

"Nur kein Versuch die Funktion, wenn es sich darum handeln sollte...", also bitte.

Hast Du denn die Sachlage nun verstanden oder soll ich Dir das File mitschicken damit es verstanden wird?

jinx
16.07.2006, 07:22
<font size="2" face="Century Gothic">Moin, capricornus,

<i>Hast Du denn die Sachlage nun verstanden ...</i> widerspricht meiner Meinung nach ganz eindeutig <i>Man sollte erst mal bitte darauf achten, wie man hier seine Sätze formuliert.</i> Und das sagt einer, der im Glashaus sitzt... :grins:</font>

capricornus
16.07.2006, 09:42
Hallo Jinx,

wenn eine Frage in einem Forum gestellt wird und dort nicht auf das Problem ansich eingegangen, sondern angezweifelt wird ob es sich überhaupt um eine "Funktion" handele, dann ich meine Aussage berechtigt. Gemeckert, geschimpft aber nichts dazu beigetragen. Meine Frage ob nun die zweite Erklärung verstanden wurde, ist schliesslich unbeantwortet.

Deutsches Forum = Zickenforum? Bin ich hier im Kindergarten?

Also, weder sitze ich im Glashaus, noch werde ich mit Steinen aber mal sollte schon auf den Boden der Tatsachen bleiben. ich habe die AGB´s zu beginn hier genau gelesen.

Capri

jinx
16.07.2006, 17:40
<font size="2" face="Century Gothic">Moin, Capri,

wenn Du Dir den Gummischuh wegen des Glashauses unbedingt anziehen möchtest, kein Problem - war ursprünglich und direkt auf mich gemünzt...

Was die AGB angeht: ich habe zwar in diesem Forum einiges an Beiträgen und Erklärungen gelesen, die AGB als Allgemeine Geschäfzsbedingungen im Sinne des HGB sind mir wissentlich bisher noch nicht über den Weg "gelaufen". Wahrscheinlich halte ich mich immer in falschen Bereichen des Forums auf, um mein "Unwesen" zu treiben. :grins:</font>

capricornus
17.07.2006, 08:46
Wortspiele kann man sich sicher sparen. Aber so ein gewisse Nettigkeit sollte doch erhalten bleiben. Genau wie den Betreff eines Topics so zu wählen das man auch damit etwas anfangen kann :-)

Entweder hat Hr. Hofmann selbst keine Idee oder keine Lust mehr? Schade, hätte gern gewusst wie er das Problem gelöst hätte. Das muss eine einfache Sache sein, kann mir nicht vorstellen das es ein grundlegendes Problem ist, eher habe ich vielleicht ein Fehler weil ich zuviel aus Access denke.

Gruss
Capri

capricornus
19.07.2006, 13:34
Hallo,

ich muss hier Hr. Hofmann nachträglich Recht geben. ;)

Die volitare Lösung belastet das ganze zu sehr. Kompliment Hr. Hofmann!

Ich habe mal ein sehr abgespecktes Beispiel angehängt und hoffe derjenige der sich diesem Thema animmt, wird daraus schlau. Kommentare sind im File selbst. Beantworte gerne weitere Fragen!!!!

Bin sehr gespannt was ich falsch gemacht habe.

Gruss
Capri

Trantüte
24.07.2006, 11:12
Hi Capri

XL-Gott Hoffmann hat doch schon den richtigen Ansatz geliefert. Du mußt der Funktion einen Zellbezug als Argument mitgeben. :)

Ich habe mal die Funktion folgendermaßen umgebaut:


Public Function Netto(Temp As String, Temp2 As Long, r_Suchbereich As Range)

On Error Resume Next

Dim StrPn As String

StrPn = Temp

Temp = Application.WorksheetFunction.VLookup(StrPn, r_Suchbereich, Temp2, 0)

If Temp < 0 Or IsNull(Temp) = True Then Temp = 0

Netto = Temp

End Function


Die Formel auf dem Tabelleblatt muss dann so aussehen:

=Netto($E$7;SpBeg+D$2;MGK!$A:$AT)+Netto($E$8;SpBeg+D$2;MGK!$A:$AT)+Netto($E$9;Sp Beg+D$2;MGK!$A:$AT)

Ich hoffe es hilft Dir weiter und Herr Hoffmann ist etwas stolz auf mich :eek:

mfg David

capricornus
24.07.2006, 11:41
Hi David,

nicht nur das Deine Lösung super funktioniert, ne, ich hab auch noch gleich etwas dazu gelernt wie XL mit VBA arbeitet. Auf die Idee wäre ich sicher nicht gekommen das es an einem Zellbezug auf dieser Art liegt!

1000 Dank!!!

Gruss
Capri