webentwicklung-frage-antwort-db.com.de

VBA entspricht der Excel-Mod-Funktion

Gibt es ein VBA, das der Funktion mod von Excel entspricht?

36
Arlen Beiler

Du willst den Mod Operator .

The expression a Mod b is equivalent to the following formula:

a - (b * (a \ b))

Bearbeitet, um hinzuzufügen:

Es gibt einige Sonderfälle, die Sie möglicherweise berücksichtigen müssen, da Excel Gleitkomma-Mathematik verwendet (und ein float zurückgibt), wobei die VBA-Funktion eine Ganzzahl zurückgibt. Aus diesem Grund kann die Verwendung von mod mit Gleitkommazahlen zusätzliche Aufmerksamkeit erfordern:

  • Die Ergebnisse von Excel stimmen möglicherweise nicht genau mit den Vorhersagen überein. Dies wird kurz behandelt hier (siehe oberste Antwort) und ausführlich hier .

  • Wie @ André in den Kommentaren hervorhebt, können negative Zahlen in die entgegengesetzte Richtung gerundet werden. Die Fix() -Funktion, die er vorschlägt, wird erklärt hier (MSDN) .

34
egrunin

In vba ist die Funktion MOD. z.B

 5 MOD 2

Hier ist ein nützlicher Link .

57

Meine Methode, um das MOD(a,b) von Excel in VBA zu replizieren, besteht darin, XLMod(a,b) in VBA zu verwenden, wobei Sie die folgende Funktion einfügen:

Function XLMod(a, b)
    ' This replicates the Excel MOD function
    XLMod = a - b * Int(a / b)
End Function

in Ihrem VBA-Modul

8
Michael Wilson

Seien Sie sehr vorsichtig mit der Excel MOD (a, b) -Funktion und dem VBA a Mod b-Operator. Excel gibt ein Gleitkommaergebnis und VBA eine Ganzzahl zurück.

In Excel = Mod (90.123,90) gibt 0.123000000000005 anstelle von 0.123 zurück. In VBA 90.123 gibt Mod 90 0 zurück

Sie sind sicherlich nicht gleichwertig!

Äquivalent sind: In Excel: = Round (Mod (90.123,90), 3), das 0.123 zurückgibt, und in VBA: ((90.123 * 1000) Mod 90000)/1000, das auch 0.123 zurückgibt

7
Carlo

Der Operator Mod entspricht in etwa der Funktion MOD :

number Mod divisor Entspricht in etwa MOD(number, divisor).

3
LukeH
Function Remainder(Dividend As Variant, Divisor As Variant) As Variant
    Remainder = Dividend - Divisor * Int(Dividend / Divisor)
End Function

Diese Funktion funktioniert immer und ist die exakte Kopie der Excel-Funktion.

0

Wenn Sie jedoch nur den Unterschied zwischen einer ungeraden und einer geraden Iteration feststellen möchten, funktioniert dies einwandfrei:

If i Mod 2 > 0 then 'this is an odd 
   'Do Something
Else 'it is even
   'Do Something Else
End If
0
Rhys

Die Top-Antwort ist eigentlich falsch.

Die vorgeschlagene Gleichung: a - (b * (a \ b))

Wird lösen, um: a - a

Welches ist natürlich 0 in allen Fällen.

Die richtige Gleichung lautet:

a - (b * INT(a \ b))

Wenn die Zahl (a) negativ sein kann, verwenden Sie Folgendes:

a - (b * FIX(a \ b))

0
Stu