1

以下は、フィートの測定値を数値からテキストに変換するために Excel で使用するために作成した VBA 関数です。たとえば、この関数は数値 1.5 を受け取り、文字列 1'-6" に変換します。

ただし、何らかの理由で、11.5 インチの値を誤って丸めています。セルが '=11.5/12' (フィートで表される 11.5 インチ) に設定されている場合、結果は 3 の繰り返しで 0.9583 になります。この値を txtfeet() 関数に渡すと、文字列 1'-0" が返されます。実際の答えは、文字列 11 1/2" になるはずです。

この関数は、9.5 インチ (6 の繰り返しで 0.7916) などの他の繰り返し数字に対しても正常に機能します。奇妙なことに、1 フィートと 11.5 インチ (つまり、3 の繰り返しで 1.9583) を渡しても問題なく動作します。

誰でもこのエラーを修正できますか?

これが私の関数のコードです。

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
4

1 に答える 1

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 = "
于 2012-10-12T20:55:25.593 に答える