I created a little form with txtMM as the input and txtFT, txtIn,
txtNumerator (aka top fraction), and txtDenominator (aka bottom
fraction) as the outputs. The following is the conversion code (using a
command button - cmdCalc) to drive it:
Private Sub cmdCalc_Click()
Const CONV_FACTOR As Double = 304.8 'mm to ft
Const PROXIMITY As Double = 0.1
Const MAX_ITERATIONS As Integer = 1000
Dim mm As Double
Dim feet As Double
Dim inches As Double
Dim numerator As Double
Dim denominator As Integer
Dim remainder As Double
If Not IsNumeric(Me.txtMM) Then
MsgBox "Error"
Exit Sub
End If
mm = CDbl(Me.txtMM)
feet = mm / CONV_FACTOR
Me.txtFt = Int(feet)
remainder = feet - CInt(feet)
inches = remainder * 12
Me.txtIn = Int(inches)
remainder = inches - Int(inches)
denominator = 1
Do
denominator = denominator + 1
numerator = remainder * denominator
Loop While Abs(numerator - Round(numerator, 0)) PROXIMITY _
And (denominator <= MAX_ITERATIONS)
If denominator = MAX_ITERATIONS Then
MsgBox "Cannot calculate to desired proximity"
Else
Me.txtNumerator = CInt(numerator)
Me.txtDenominator = denominator
End If
End Sub
The PROXIMITY value is how close you want the numerator to be to a
whole number. The smaller the number, the more funky (but more
accurate) results you'll get. The MAX_ITERATIONS is the maximum number
of times you want the loop to run.
I get 5' 5-3/4", which I verified as correct.
----
Nick Hebb
BreezeTree Software
http://www.breezetree.com