Private Sub Command1_Click()
Dim d As Long, n As Long, m As Long
Dim v() As String
v = Split(Text1.Text, "/")
d = Val(v(0)) 'Val(Right$(Text1.Text, 1))
n = Val(v(1)) 'val(Left$(Text1.Text, 1))
m = MCD(d, n)
Text2.Text = "MCD= " & CStr(m) & "; Reducción de la fracción: " & CStr(d) & "/" & CStr(n)
End Sub
' Den= Denominador
' Num= Numerador
' Halla el máximo común divisor de los valores fraccionarios dados...
Public Function MCD(ByRef Den As Long, ByRef Num As Long) As Long
Dim v As Long ' contendrá temporalmente el valor MCD calculado
Dim Ix As Long ' índice usado en el bucle.
Dim max As Long ' valor máximo que debe cabría esperar que fuera divisor, así 'a lo bruto'.
' Comprobamos que es menor si el denominador o el numerador.
' para luego hallar su mitad, que entregamos en max
' como max es un long, el valor devuelto es entero.
' El objetivo de esto (max) es conocer el mayor valor tras el cual
' es imposible que haya otro que divida a dichos números.
' Si el valor es 20, es absurdo usar un número mayor de 20
' pero incluso basta con la mitad (ya que el primo menor es 2).
If Den < Num Then
max = (Den \ 2) + 1
Else
max = (Num \ 2) + 1
End If
v = 1
For Ix = max To 2 Step -1 ' este bucle recorre los números.
Do ' este bucle permite recoger cuantas veces esté un número...
If Den Mod Ix <> 0 Then Exit Do ' si no es múltiplo, no lo divide
If Num Mod Ix <> 0 Then Exit Do ' si es múltiplo del den, pero no del num, no vale.
v = v * Ix ' calculando sobre la marcha el MCD...
Den = Den \ Ix ' lo dividimos
Num = Num \ Ix ' lo dividimos
Loop
Next
MCD = v
End Function