eigene Funktionen automatisch neu berechnen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: eigene Funktionen automatisch neu berechnen von: background
Geschrieben am: 07.04.2005 16:50:09

Hi

Kann man Excel dazu bringen, auch selbstgeschriebene VBA-Funktionen automatisch neu zu berechen? Bisher muss ich immer Strg-Alt-F9 drücken...

Danke.

Bild


Betrifft: an die Stimme aus dem Background von: Luc
Geschrieben am: 07.04.2005 20:40:06

Hi Hintergründler,
wenn du richtig programmiert hast, xl auf Automatik gestellt und nicht automatisch wieder verstellt wird, läuft das immer auch ohne F9. Im Gegenteil, es können Situationen eintreten, wo das gar nicht mehr wünschenswert ist - in Abhängigkeit von Anzahl, Umfang und Vernetzung deiner UDF und natürlich ihres Grades an Optimalität. Ich muss die Automatik in mancher Tabelle regelmäßig ausschalten, sonst könnte ich nichts mehr in akzeptabler Zeit eingeben! Vielleicht tragen deine "Funktionen" ja deutsche Formeln in zelle.Formula ein (hier schon des Öfteren behandelt). Das würde das Phänomen erklären.
Gruß Luc :-?


Bild


Betrifft: AW: an die Stimme aus dem Background von: Thomas
Geschrieben am: 08.04.2005 14:08:36

Hallo Luc

Hmm, nach weiteren Experimenten stellt sich mein Problem nun anders dar.
Anscheinend berechnet XL die Funktion(sergebnisse) tatsächlich neu, wenn sich an den Ausgangsdaten im Tabellenblatt was ändert.

Aber es bleibt ein anderes Problem: Ich verwende die Funktion (die ich in eine XLA gepackt habe) in mehreren Blättern einer Datei. Wenn nun neu berechnet wird (wodurch auch immer), ändern sich die Ergebnisse in allen Blättern, d.h. die Ergebnisse in allen sind nur passend zum aktiven Blatt. Die Blätter sind alle identisch aufgebaut, nur die Ausgangsdaten sind unterschiedlich.

Hier mal die Funktion:


Function Rangfolge(Kriterium As Range, Daten As Range, Optional Aufsteigend As Boolean = False)
    Dim Feld() As Variant, k As Integer, w As Variant, r As String, op As String
    'Bereiche müssen gleiche Größe haben
    If Kriterium.Count <> Daten.Count Then
        Rangfolge = "#WERT"
        Exit Function
    End If
    ReDim Feld(1 To Kriterium.Count, 0 To 1)
    k = 1
    For Each w In Kriterium
        Feld(k, 0) = w
        k = k + 1
    Next
    k = 1
    For Each w In Daten
        Feld(k, 1) = w
        k = k + 1
    Next
    QuickSort Feld, 1, Kriterium.Count, 0, Aufsteigend
    If Aufsteigend Then op = "<" Else op = ">"
    For k = 1 To Kriterium.Count
        If k > 1 Then r = r & op
        r = r & Feld(k, 1)
    Next
    Rangfolge = r
End Function


Danke für jeden Tip
Thomas (der Hintergündige)


Bild


Betrifft: AW: zuerst mal dieses Problem! von: Luc
Geschrieben am: 08.04.2005 21:18:35

Hallo Thomas,
obwohl sich mir die Ermittlung von r als Basis des Rangfolge-Rückgabewertes nicht recht erschließen will, denke ich, dass du eher ein Referenzproblem hast, der Hund also in der Übergabe der Argumente an die Funktion begraben liegt. Standardmäßig stellt xl zu Argumenten ByRef ein, wahrscheinlich ist hier aber ByVal sinnvoller. Das müsstest du aber explizit im Funktionskopf angeben. Ich mache das fast immer so und hatte noch nie ein derartiges Problem!
Vielleicht klappt dann auch das Andere!
Mal sehen! Bis dann
Luc :-?


Bild


Betrifft: AW: zuerst mal dieses Problem! von: Thomas
Geschrieben am: 11.04.2005 14:00:47

Hallo Luc

ByVal hab ich schon mal ausprobiert, hat aber nichts geändert.
Möglicherweise liegt es ja nicht an der Funktion selbst, sondern an der Art des Aufrufs, es funktioniert nämlich mit einfacheren Funktionen auch nicht. Ich rufe sie im Blatt in folgender Form auf:

=Rangfolge((A4;A10;A16;A28);(B1;B7;B13;B25))

Wenn ich dies neu einfüge oder mit Return in der Bearbeitungszeile bestätige, aktualisiert Excel korrekt nur das aktive Blatt. Wenn ich aber Strg-Alt-F9 benutze oder das Sheet neu öffne, werden alle Blätter geändert und es stehen in allen Blättern die selben Ergebnisse des einen Blattes.

Thomas

P.S.: Falls dich die Funktion interessiert: Sie gibt die Texte aus "Daten" in der Sortierung aus, die durch "Kriterium" bestimmt wird. Beispiel: die Tabelle enthält folgende Daten:
| A | B
----------
1| 3 | ein
2| 1 | Dies
3| 4 | Test
4| 2 | ist
Dann liefert Rangfolge(A1:A4,B1:B4) den String "DiesisteinTest"


Bild


Betrifft: AW: Aha! Das ist natürlich was anderes,... von: Luc
Geschrieben am: 11.04.2005 15:50:10

Thomas,
aber diese Art der Bereichsangabe kann auch zu Problemen führen. Viele Xl-Standardfunktionen kommen damit zurecht, deine offensichtlich nicht. Vielleicht würde sie funktionieren, wenn die Zellen in Form einer Union vorliegen würden. Das müsstest du in deiner Funktion mal zu berücksichtigen versuchen.
Gruß Luc :-?


Bild


Betrifft: AW: Aha! Das ist natürlich was anderes,... von: Luc
Geschrieben am: 11.04.2005 15:50:10

Thomas,
aber diese Art der Bereichsangabe kann auch zu Problemen führen. Viele Xl-Standardfunktionen kommen damit zurecht, deine offensichtlich nicht. Vielleicht würde sie funktionieren, wenn die Zellen in Form einer Union vorliegen würden. Das müsstest du in deiner Funktion mal zu berücksichtigen versuchen.
Gruß Luc :-?


Bild


Betrifft: mal Kriterium.Count anzeigen lassen! - owT von: Luc
Geschrieben am: 11.04.2005 15:55:21




Bild


Betrifft: AW: mal Kriterium.Count anzeigen lassen! - owT von: Thomas
Geschrieben am: 11.04.2005 17:06:34

Hi Luc

solches Debugging hab ich alles schon hinter mir, Count und die Daten stimmen, wenn ich die Funktion schrittweise ausführe. Ich bin inzwischen sicher, dass es nicht am Inneren der Funktion liegt, denn selbst folgende Funktion


Function TrivialSumme(ByVal Werte As Range)
    Dim s As Double, w As Variant
    For Each w In Werte
        s = s + w
    Next
    TrivialSumme = s
End Function


liefert bei Aufruf mit

=TrivialSumme((A2;A8;A14;A26))

das korrekte Ergebnis bei einzelnem Aufruf, nicht aber, wenn ich Strg-Alt-F9 benutze.
Tatsächlich bekomme ich mit Aufrufen ala =TrivialSumme(A1:A3) immer richtige Ergebnisse.
Es sieht also so aus, als ob Excel bei Strg-Alt-F9 den Ausdruck (A2;A8;A14;A26) nur einmal für das aktuelle Blatt auswertet und dann bei jedem Aufruf auch aus anderen Blättern einsetzt. Wenn ich mit Msgbox die übergebenen Daten ausgeben lasse, werden bei drei Aufrufen aus drei Blättern dreimal dieselben Daten aus dem aktiven Blatt ausgegeben.

Wie geht das mit Union?

Thomas


Bild


Betrifft: AW: Union() in Editorhilfe, aber du könntest... von: Luc
Geschrieben am: 11.04.2005 19:55:43

...schon recht haben, Thomas.
1. Es könnte sein, dass Xl alle Blätter auswählt, ohne dass das an den Fußreitern zu sehen ist - habe auch so einen Effekt, allerdings bei sehr vielen udFkt + Ereignisprozeduren auf einem Einzelblatt - auf zusätzlichen Blättern passiert stets das Gleiche, warum...??? oder wahrscheinlicher...
2. es tritt ein Effekt ein, der von vergebenen Namen für Bereiche bekannt ist. Wenn kein Tabellenname mit angegeben wird, hat der Name auf allen Blättern den gleichen Bereich auf dem zuerst ausgewählten Blatt zum Inhalt.
Wenn du vielleicht mal die Blattreihenfolge ändern würdest, könntest du feststellen, ob immer das 1.Blatt als Bezug dient. Dann wäre es sicher hilfreich, die Zelladressen mit dem Namen der jeweiligen Tabelle zu ergänzen. Evtl. kommt dann deine Fkt damit nicht klar, aber erst mal sehen. Notationsform: 'Tab 1'!A1:Z9 wenn im Tabnamen störende Zeichen enthalten sind - sonst können die Apostrophs auch fehlen.
Schönen Abend Luc :-?


Bild


Betrifft: AW: Union() in Editorhilfe, aber du könntest... von: Thomas
Geschrieben am: 12.04.2005 17:33:05

Hallo Luc

Union() auf VBA-Seite ist mir klar, aber was hilft mir das im Tabellenblatt?

Weitere Experimente:
- Umstellen der Tabellen bringt keine Änderung,
- genausowenig das Voranstellen des Tabellennamens,
- oder das Benennen der Bereiche, z.B. =Rangfolge(Zahlen,Namen).
- Quelle der Werte bei Strg-Alt-F9 ist nicht die erste Tabelle, sondern die bei Drücken aktive Tabelle. Die kann sogar in einer anderen Datei sein und rein gar nichts mit der Funktion zu tun haben.
- steht die Zelle mit dem Funktionsaufruf in einem anderen Blatt als die Werte, geht alles

Ich würde ja statt der gruppierten Parameter ParamArrays verwenden, leider geht aber nur eines pro Function.
Außerdem könnte ich auf Strg-Alt-F9 verzichten, leider macht aber die Aktualisierung beim Öffnen der Datei genau dasselbe.
Weiter könnte ich mir als Workaround vorstellen, die Verweise als Strings zu übergeben und innerhalb der Funktion aufzulösen.

Ich hätte aber gerne verstanden, warum es nicht geht.

Gruß
Thomas


Bild


Betrifft: AW: an die Stimme aus dem Background von: Thomas (background)
Geschrieben am: 08.04.2005 14:40:56

Noch ein Nachtrag:

Die Funktion wird tatsächlich nur neu berechnet, wenn ich eine der Quell-Zellen direkt ändere, nicht, wenn sie mit einer anderen Tabelle verknüpft ist und die Verknüpfung aktualisiert wird.


 Bild

Beiträge aus den Excel-Beispielen zum Thema "eigene Funktionen automatisch neu berechnen"