Berechnugsformel für Motoren in VBA excel?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

PWolff  01.07.2020, 12:04

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.

1
DanKirpan  01.07.2020, 12:21
@PWolff

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

1
PWolff  01.07.2020, 12:41
@DanKirpan

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)

1
DanKirpan  01.07.2020, 12:51
@PWolff

So ähnlich hatte ich es auch versucht und jetzt hat es auch funktioniert :? Wahrscheinlich irgendwo einen Tippfehler drin gehabt, Danke für die Aufklärung

0

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.

Woher ich das weiß:Recherche
PWolff  01.07.2020, 12:16

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.)

0

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.

Bild zum Beitrag

 - (Computer, programmieren, Microsoft Excel)
IchMalWiederXY  01.07.2020, 18:07
Hier doch besser mehr Präzision:
Public Function fncMotor(ByVal Wert1 as Double,ByVal Wert2 as Double,ByVal Wert3 as Double)

 

0