VBA UDF возвращается # ЗНАЧЕНИЕ! - PullRequest
2 голосов
/ 13 ноября 2010

Итак, у меня есть довольно простой UDF, написанный на Visual Basic для использования в Excel. Он рассчитывает ваш ок. налоги. Допустим, я использую это так:

=Taxes(I23-I18,I24-I20,"Married")

Если я наберу это, он прекрасно работает. Теперь, если я сохраню лист и перезапущу Excel, в ячейке появится надпись #VALUE! Если я выбираю формулу и нажимаю клавишу ввода еще раз, она хорошо ее пересчитывает. Что я делаю неправильно? Application.Volatile не нужно, но я пытался идеи ...

Private Type TaxBracket
    Perc As Double
    Floor As Currency
    Limit As Currency
End Type

Public Function Taxes(gross1 As Currency, gross2 As Currency, filingStatus As String) As Currency
    Application.Volatile True
    Dim brackets(6) As TaxBracket
    Dim stdDeduction As Currency
    Dim ssTaxRate As Double
    Dim medicareTaxRate As Double
    Dim Tax As Double

    stdDeduction = 5700
    ssTaxRoof = 106800
    ssTaxRate = 0.062
    medicareTaxRate = 0.0145

    Tax = medicareTaxRate * (gross1 + gross2)
    Tax = Tax + IIf(gross1 < ssTaxRoof, ssTaxRate * gross1, ssTaxRate * ssTaxRoof)
    Tax = Tax + IIf(gross2 < ssTaxRoof, ssTaxRate * gross2, ssTaxRate * ssTaxRoof)

    brackets(0).Perc = 0.1
    brackets(1).Perc = 0.15
    brackets(2).Perc = 0.25
    brackets(3).Perc = 0.28
    brackets(4).Perc = 0.33
    brackets(5).Perc = 0.35

    If filingStatus = "Single" Then
        brackets(0).Floor = 0
        brackets(1).Floor = 8375
        brackets(2).Floor = 34000
        brackets(3).Floor = 82400
        brackets(4).Floor = 171850
        brackets(5).Floor = 373650
        brackets(0).Limit = 8375
        brackets(1).Limit = 34000
        brackets(2).Limit = 82400
        brackets(3).Limit = 171850
        brackets(4).Limit = 373650
        brackets(5).Limit = 1000000000

        Tax = Tax + incomeTaxes(gross1, brackets, stdDeduction) + incomeTaxes(gross2, brackets, stdDeduction)
    ElseIf filingStatus = "Married" Then
        brackets(0).Floor = 0
        brackets(1).Floor = 16750
        brackets(2).Floor = 68000
        brackets(3).Floor = 137300
        brackets(4).Floor = 209250
        brackets(5).Floor = 373650
        brackets(0).Limit = 16750
        brackets(1).Limit = 68000
        brackets(2).Limit = 137300
        brackets(3).Limit = 209250
        brackets(4).Limit = 373650
        brackets(5).Limit = 1000000000

        Tax = Tax + incomeTaxes(gross1 + gross2, brackets, stdDeduction * 2)
    Else
        Taxes = "N/A"
        Return
    End If
    Taxes = Tax
End Function

Private Function incomeTaxes(gross As Currency, brackets() As TaxBracket, deduction As Currency) As Currency
    Dim Tax As Double
    Dim taxable As Double

    Tax = 0
    taxable = gross - deduction


    For i = 0 To 5
      If taxable > brackets(i).Limit Then
        Tax = Tax + (WorksheetFunction.Min(taxable, brackets(i).Limit) - brackets(i).Floor) * brackets(i).Perc
      Else
        If taxable > brackets(i).Floor Then
            Tax = Tax + (taxable - brackets(i).Floor) * brackets(i).Perc
        Else
            'tax = tax
        End If
      End If
    Next i

    incomeTaxes = Tax
End Function

1 Ответ

6 голосов
/ 13 ноября 2010

Ваш UDF выглядит нормально, за исключением использования типов данных Currency (вероятно, следует использовать двойные или варианты, так как это то, что использует Excel).Обычная причина получения #Value с UDF заключается в том, что один из входных аргументов не может быть преобразован в правильный тип.Если ваши входные ячейки не содержат числовых значений при открытии книги, вы получите #Value.Это может быть вызвано проблемами последовательности вычислений, приводящими к тому, что одна из предшествующих ячеек прецедента не будет рассчитана при первом вызове функции.Попробуйте объявить входные параметры как вариант, а не как валюту, и добавьте несколько временных операторов debug.print, чтобы отобразить входные параметры в окне Immediate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...