2012-10-12 28 views
1

下面是我创建的VBA函数,用于在Excel中将脚的测量值从数字转换为文本。例如,该函数将采用数字1.5并将其转换为字符串:1'-6“为什么这个VBA函数不正确的四舍五入?

由于某些原因,它错误地舍入了11.5英寸的值。当单元格设置为' = 11.5/12'(以英尺表示的11.5英寸),结果为0.9583,重复3次。当我将此值传递给我的txtfeet()函数时,它返回字符串1'-0“。真正的答案应该是字符串11 1/2“。

该函数可以很好地适用于其他重复数字,例如9.5英寸(0.7916与6重复)。奇怪的是,它也可以正常工作,如果通过它1英尺和11.5英寸(换句话说,1.9583与3个重复)。

任何人都可以帮助解决这个问题?

这里是我的函数的代码。

Public Function txtfeet(FeetIn As Double, Optional Denominator As Integer = 8) 

' This function will change a decimal number of feet (FeetIn) to the text string 
' representation of feet, inches, and fractional inches. 
' 
' It will round the fractional inches to the nearest 1/x where x is the denominator 
' and is given by the user as the second argument of this function. If a denominator 
' is not given, it defaults to 8 as shown above. 
' 
' Modified from MrExcel.com 

    ' set a variable to the integer portion of FeetIn 
    NbrFeet = Fix(FeetIn) 

    ' set a variable to the number of inches in decimal form 
    InchIn = (FeetIn - NbrFeet) * 12 

    ' set a variable to the integer portion of InchIn 
    NbrInches = Fix(InchIn) 

    ' set a variable to the remaining fractional inches in decimal form 
    FracIn = (InchIn - NbrInches) * Denominator 

    ' set a variable to be FracIn rounded to the nearest whole number 
    Numerator = Application.WorksheetFunction.Round(FracIn, 0) 

    ' if the fractional inches are zero, define the portion of text 
    ' that will represent the fractional inches to be blank 
    If Numerator = 0 Then 
     FracText = "" 

    ' otherwise, if the number of inches plus the fractional inches rounds up to 
    ' 12, add one to NbrFeet and set NbrInches to zero and FracText to blank 
    ElseIf (InchIn + (Numerator/Denominator)) = 12 Then 
     NbrFeet = NbrFeet + 1 
     NbrInches = 0 
     FracText = "" 

    ' otherwise, if the numerator equals the denominator, add one to NbrInches 
    ' and set FracText to blank 
    ElseIf Numerator = Denominator Then 
     NbrInches = NbrInches + 1 
     FracText = "" 

    ' otherwise, define FracText in its simplest fractional form 
    Else 
     ' use a loop to get the fractional inches to their simplest form 
     Do 
      ' if the numerator is even, divide both numerator and divisor by 2 
      If Numerator = Application.WorksheetFunction.Even(Numerator) Then 
       Numerator = Numerator/2 
       Denominator = Denominator/2 
      Else 
       FracText = " " & Numerator & "/" & Denominator 
       Exit Do 
      End If 
     Loop 
    End If 

    ' define the output of the function as a text string of feet, inches, and 
    ' fractional inches or just inches and fractional inches if NbrFeet is zero 
    ' or just fractional inches if both NbrFeet and NbrInches are zero 
    If NbrFeet = 0 And NbrInches = 0 And Numerator = 0 Then 
     txtfeet = "0""" 
    ElseIf NbrFeet = 0 And NbrInches = 0 Then 
     txtfeet = Application.WorksheetFunction.Trim(FracText) & """" 
    ElseIf NbrFeet = 0 Then 
     txtfeet = NbrInches & FracText & """" 
    Else 
     txtfeet = NbrFeet & "'-" & NbrInches & FracText & """" 
    End If 

End Function 

回答

1

我相信你行

ElseIf (InchIn + (Numerator/Denominator)) = 12 Then 
    NbrFeet = NbrFeet + 1 
    NbrInches = 0 
    FracText = "" 

应该

ElseIf (NbrInches + (Numerator/Denominator)) = 12 Then 
    NbrFeet = NbrFeet + 1 
NbrInches = 0 
FracText = " 
+0

非常感谢!它现在完美运行! –