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

VBA-Function schreiben

VBA-Function schreiben
09.08.2016 20:09:33
Niclaus
Grüezi miteinander
Aus der Excel-Hilfe:
Bei der Tabellenfunktion RANG wirkt sich das Vorhandensein zweier gleicher Zahlen auf die Ränge der nachfolgenden Zahlen aus. Ist die Zahl 10 zum Beispiel zweimal in einer Liste ganzer Zahlen vertreten, die in aufsteigender Reihenfolge sortiert sind, und hat die Zahl 10 den Rang 5, dann hat die Zahl 11 den Rang 7 (keine Zahl hat den Rang 6).
Nun gibt es eine interessante Formel, welche diese "leeren" Ränge eliminiert. Die Zahl 11 hätte dann den Rang 6. Wenn die Zahlen, die zu rangieren sind, sich in B2:B10 befinden, lautet die Formel dazu:
=SUMMENPRODUKT((B2

In der angehängten Excel-Tabelle habe ich ein paar Zahlen und die Formeln eingetragen. – Die Formel funktioniert bestens.
https://www.herber.de/bbs/user/107511.xlsx
Mein Anliegen ist folgendes: Ich hätte diese Tabellenformel gern in eine VBA-Function umgewandelt, die dann etwa so ausschauen würde:
Function RANGNEU(bereich As Range, wert As Range)
RANGNEU = WorksheetFunction.SumProduct((wert 

bereich wäre in D2 meiner Tabelle ($B$2:$B$10) – wert wäre: (B2)
Dass das funktionieren würde, hatte ich gar nicht erhofft. Dass man Matrizen nicht so einfach in VBA erfassen kann, ist mir klar. Aber wie macht man es korrekt? Kann mir jemand von Euch helfen?
Vielen Dank Niclaus
PS In der Excel-Hilfe zu RANGE wird zum Thema "leere Ränge" auf einen Korrekturfaktor hingewiesen, der in meinen Augen nichts bringt.

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Falls deine Fml stimmt, kannst du sie so in ...
09.08.2016 21:01:42
Luc:-?
…einer eigenen UDF einsetzen, Niclaus:
RANGNEU = Evaluate("sumproduct((" & wert.address &"<" & bereich.address & ")/countif(" & bereich.address &"," & bereich.address & "))+1")
Beachte aber, dass man eine UDF, die die vbFkt Evaluate enthält, selbst nicht AUSWERTEN (XLM-Fkt!) kann (Auswerten innerhalb einer Auswertung ist nicht möglich)!
Andere Möglichkeiten erforderten komplexe VBA-Strukturen.
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Falls deine Fml stimmt, kannst du sie so in ...
09.08.2016 23:27:57
Niclaus
Hallo Luc
Vielen Dank! Leider funkt es nicht mit Evaluate. Auch nach der Korrektur des kleinen Tippfehlers:
& bereich.address &"," & bereich: das Komma muss Strichpunkt sein.
Das Formelergebnis ist immer #WERT! - Die Antwort von Daniel hilft mir weiter.
Aber eine gute Anregung für andere Problemlösungen ist mir Deine Antwort doch!
Noch einmal vielen Dank und viele Grüsse
Niclaus
Das war kein TippFehler! Evaluate verlangt ...
10.08.2016 00:39:21
Luc:-?
…US-Original-Fml-Notation, Niclaus!
Luc :-?
AW: VBA-Function schreiben
09.08.2016 22:37:00
Daniel
Hi
eine Excel-Matrixfunktion ist im Prinzip nichts anderes, als eine Schleife über die Zellen eines Parameters, welcher normalerweise einen Einzelwert erwartet.
Die Worksheetfunctions können diese Schleifen der Matrixfunktionen nicht immer nachbilden, dann muss man sie selber programmieren:
Function RANGNEU(bereich As Range, wert As Range)
Dim Zelle As Range
For Each Zelle In bereich
RANGNEU = RANGNEU - (wert 
das "-" steht in der Formel, weil in VBA der Wahrheitswert WAHR nicht als 1, sondern als -1 in Berechnungen verwendet wird.
man könnte hier auch schreiben:
Function RANGNEU(bereich As Range, wert As Range)
Dim Zelle As Range
For Each Zelle In bereich
If wert 
Gruß Daniel
Anzeige
AW: VBA-Function schreiben
10.08.2016 00:02:31
Niclaus
Hallo Daniel
Perfekt!
Falls es Dich interessiert: Bei der Excel-Formel RANG() gibt es ja ein optionales Argument "Reihenfolge":
Ist Reihenfolge mit 0 (Null) belegt oder nicht angegeben, bestimmt Microsoft Excel den Rang von Zahl so, als wäre Bezug eine in absteigender Reihenfolge sortierte Liste. Ist Reihenfolge mit einem Wert ungleich 0 belegt, bestimmt Microsoft Excel den Rang von Zahl so, als wäre Bezug eine in aufsteigender Reihenfolge sortierte Liste.

Sozusagen zur eigenen Selbstbefriedigung habe ich dieses optionale Argument in die Function eingebaut:

Function RANGNEU(bereich As Range, wert As Range, Optional rf)
'rf = Reihenfolge: 0 = absteigend,  0 = aufsteigend
Dim Zelle As Range
If IsMissing(rf) Then rf = 0
For Each Zelle In bereich
If rf = 0 Then
RANGNEU = RANGNEU - (wert  Zelle) / WorksheetFunction.CountIf(bereich, Zelle)
End If
Next
RANGNEU = RANGNEU + 1
End Function
Ganz herzlichen Dank und viele Grüsse
Niclaus
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige