Wie kommt ein Schneepflugfahrer morgens zur Arbeit?

Hallo Rene

Ich habe keine Ahnung, ob das bei ExcelNervt schon mal erwähnt wurde, jedenfalls habe ich es nicht entdeckt.
Es gibt einen gravierenden Unterschied zwischen der Tabellenfunktion REST und der entsprechenden VBA-Funktion Mod.

Gegeben sind zwei Werte a und b.
Wert für a (Bsp.): 65468284,8784835
Wert für b (Bsp.): 360

Ergebnis bei der EXCEL-Funktion REST: 124.878483496606 ( =REST(B1;B2) )
Ergebnis bei der VBA-Funktion MOD: 125.000000000000 ( =Org_Mod(B1;B2) )

MOD ist da sehr irritierend und schlichtweg falsch. Und der „Notnagel“ mit Application.WorksheetFunction(mod(a, b)) klappt auch nicht, da Mod nicht als Ausdruck existiert.

Die eigentlich simple VBA-Funktion


Function Org_Mod(a As Double, b As Double) As Double
Org_Mod = a Mod b
End Function

liefert immer einen Integer-Wert zurück. Erst eine Suche im Internet brachte dann einen Hinweis die Funktionsweise von Mod bei VBA und eine Lösung:
gefunden habe ich die Lösung hier:

https://www.reddit.com/r/excel/comments/16r0c81/mod_works_differently_with_negative_numbers_in/?tl=de

Und Microsoft erklärt dazu folgendes:
Beispiel
In diesem Beispiel wird der Mod -Operator zum Dividieren von zwei Zahlen verwendet, wobei nur der Rest zurückgegeben wird. Wenn es sich bei einer der beiden Zahlen um eine Gleitkommazahl handelt, wird sie zunächst auf eine Ganzzahl gerundet.
siehe:

https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/mod-operator

Mit dieser Funktion klappt es dann…

Function Neu_Mod(a As Double, b As Double) As Double
Neu_Mod = a - b * Int(a / b)
End Function

Das muss man wissen, sonst ist man ewig auf Fehlersuche….

Die Fehler bei der Gleitkommaberechnung lasse ich außen vor, das kann man EXCEL nicht unbedingt ankreiden.
mit freundlichen Grüßen
Heinz-Jürgen Ladberg

#####

Ein Nachtrag von mir:

Richtig: ich habe bislang noch einen Artikel über die Excel-Funktion REST, beziehungsweise über den Verknüpfungsoperator MOD in VBA geschrieben.

Eigentlich ist Modulo für Ganzzahlen definiert. Bei wikipedia lese ich:

Wenn zwei natürliche Zahlen, der Dividend a {\displaystyle a} und der Divisor m {\displaystyle m} (ungleich 0), mit Rest dividiert werden sollen, wenn also a : m {\displaystyle a:m}

berechnet werden soll, so wird gefragt, wie man die Zahl a {\displaystyle a} als Vielfaches von m {\displaystyle m} und einem „kleinen Rest“ darstellen kann: a = m ⋅ q + r {\displaystyle a=m\cdot q+r}

Hier ist q {\displaystyle q} der sogenannte Ganzzahlquotient und r {\displaystyle r} der Rest. Entscheidende Nebenbedingung ist, dass r {\displaystyle r} eine der Zahlen 0 , 1 , … , m − 1 {\displaystyle 0,1,\dotsc ,m-1} ist. Hierdurch wird r {\displaystyle r} eindeutig bestimmt.

Also ist Rest (modulo) eigentlich definiert für ganze Zahlen. So habe ich ihn bisher eingesetzt.

Allerdings hat Heinz-Jürgen recht:

  • Die Funktion REST ist nicht in der Liste der Application.WorksheetFunction zu finden
  • Bei Dezimalzahlen recht REST anders als MOD. Das heißt: Man muss in VBA die Funktion REST nachbauen.

Da nervt doch Excel mal wieder …