Berechnugsformel für Motoren in VBA excel?
Moin.
mich hab Probleme bei ner Formel in VBA. Für die Formel muss von 3 werten jeweils der höchste und der niedrigste ausgelesen werden und mit diesem muss dann weitergerechnet werden. Ich habe das bisher über die normalen Formeln gemacht und wollte es nun mit vba machen das es schneller geht. Hab aber kein Plan wie ich das programmiere das der min und Max wert ausgelesen wird.
meine formel war diese:
„ =((MAX(C5:C7))-(MIN(C5:C7)))/(SUMME(C5:C7)/3)*100“
ich würds gerne machen das ich eingebe:
=Funktion(Wert1;Wert2;Wert3)
ist das umsetzbar ?
Gruß !
3 Antworten
Hi,
mit "Application.WorksheetFunction." ist es möglich in Vba die Tabellenblattformeln zu verwenden:
Function Motor(Wert1, Wert2, Wert3)
Dim maxWert As Long
Dim minWert As Long
If Wert1 = "" Or Wert2 = "" Or Wert3 = "" Then
Motor = "Leerwert in der Auswahl"
Else
maxWert = Application.WorksheetFunction.Max(Wert1, Wert2, Wert3)
minWert = Application.WorksheetFunction.Min(Wert1, Wert2, Wert3)
Motor = ((maxWert - minWert) / ((Wert1 + Wert2 + Wert3) / 3)) * 100
End If
End Function
Nachdem du diesen Code in ein Modul eingefügt hast, kannst du sie wie andere Formeln eingeben: =Motor(Wert1;Wert2;Wert3). Du musst sie bei dieser Variante allerdings einzeln als C5;C6;C7 eingeben, eine Range C5:C7 funktioniert nicht.
Der FS UltraRWE wollte es ja ohnehin per VBA beschleunigen, da muss er sie doch sowieso als Mappe mit Makros speichern?
Übrigens geht es auch, wenn man ein Range übergibt - man muss dann die Funktionen etwas anders aufrufen.
Genau das war mein Problem ich weiß nicht wie man es als Range aufruft und dann weiterverwenden kann
Stimmt, wenn man ohnehin Makros verwendet, kann und sollte man auch für so etwas eigene Funktionen verwenden.
Argument vom Typ Range: siehe meine Antwort (in der Praxis getestet)
Anscheinend nicht (ohne Makro): https://www.google.com/search?q=excel+spannweite+einer+verteilung
Immerhin kannst du
SUMME(C5:C7)/3
durch
MITTELWERT(C5:C7)
ersetzen.
-----
Übrigens würde ich das "*100" weglassen und stattdessen das Zahlenformat der Zelle(n) auf "Prozentwert" setzen.
Mit Makro:
Public Function SPANNWEITERELATIV(rg As Range) As Double
SPANNWEITERELATIV = SPANNWEITE(rg) / WorksheetFunction.Average(rg)
End Function
Public Function SPANNWEITE(rg As Range) As Double
SPANNWEITE = WorksheetFunction.Max(rg) - WorksheetFunction.Min(rg)
End Function
und dann
=SPANNWEITERELATIV(C5:C7)
Mit Zahlenformat der Zelle "Prozent"
(Start -> Zellen -> Format -> Zellen formatieren... -> Zahlen -> Kategorie: Prozent)
-----
(Ich habe 2 Funktionen draus gemacht, weil ich damit rechne, dass die Funktion SPANNWEITE häufiger benötigt werden dürfte als die Funktion SPANNWEITERELATIV. Normalerweise wäre dies eine "verfrühte Optimierung", aber in Fällen wie diesem ist es nach meiner Erfahrung gerechtfertigt. - Pro Tip:
Den Kunden darauf hinweisen; und wenn er dafür nicht extra bezahlen will, als private function implementieren und den Kunden das Dreifache extra bezahlen lassen, wenn er es später dann doch haben will - was praktisch sicher der Fall sein wird. Geht so ohne Weiteres aber nur mit Closed Source. Ansonsten als Programmschnipsel vorbereiten und einen GUID in den Kommentar zur Funktion schreiben.)
DanKirpan hat die Dinge im Prinzip fertig:
Damit man dies im Excel Blatt selbst verwenden kann muss man die datei im xlsm Format abspeichern und den Code in ein Modul legen:
Tippt man dann im Blatt nach dem = den Start der Funktion los kommt im Kontaxt Menü der gewünschte Eintrag vor.

Hier doch besser mehr Präzision:
Public Function fncMotor(ByVal Wert1 as Double,ByVal Wert2 as Double,ByVal Wert3 as Double)
Nachteil: muss als Excel-Sheet mit Makros abgespeichert werden und lässt sich von anderen - oder je nach Einstellungen auch von dem Autor selbst - nicht ohne Rückfrage oder überhaupt nicht öffnen.
(Soweit ich weiß, hat Microsoft bisher leider keine Möglichkeit eingebaut, Makro-Funktionen, die ausschließlich "sichere" Funktionen / Methoden und Schleifen verwenden, auf einfachere Weise zuzulassen als generelle Makros)
-----
Übrigens geht es auch, wenn man ein Range übergibt - man muss dann die Funktionen etwas anders aufrufen.