2010-11-13 4 views
2

J'ai donc un UDF assez simple écrit en Visual Basic pour une utilisation en Excel. Il calcule votre approx. taxes Disons que je l'utilise comme tel:VBA UDF renvoyant #VALUE!

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

Si je tape ceci, cela fonctionne très bien. Maintenant, si je sauvegarde la feuille et redémarre Excel la cellule dit maintenant #VALUE! Si je sélectionne la formule et que j'appuie sur Entrée une fois de plus, il la recalcule correctement. Qu'est-ce que je fais mal? Application.Volatile ne devrait pas être nécessaire, mais je tentais des idées ...

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 

Répondre

6

Votre look UDF de OK, à l'exception de l'utilisation de types de données de devises (devrait probablement utiliser des doubles ou des variantes puisque c'est ce que Excel utilise).
La raison habituelle pour obtenir #Value avec un UDF est que l'un des arguments d'entrée ne peut pas être converti au type correct. Si vos cellules d'entrée ne contiennent pas de valeurs numériques lorsque le classeur s'ouvre, vous obtiendrez #Value.
Cela peut être dû à des problèmes de séquence de calcul entraînant la non-calcul de l'une des cellules précédentes en amont la première fois que la fonction est appelée.
Essayez de déclarer les paramètres d'entrée en tant que variante plutôt que devise et ajoutez des instructions debug.print temporaires pour afficher les paramètres d'entrée dans la fenêtre Exécution.

+0

Merci pour l'entrée. J'ai changé tous les arguments en varients mais pas de chance. J'ai aussi essayé cette formule: = Taxes (100000,200000, "Single"). Cette formule ne repose pas sur une autre cellule mais toujours pas de chance. Tester les sorties de débogage dès maintenant. D'autres idées? –

+0

Après une enquête plus approfondie qui semble avoir fonctionné. J'avais juste besoin de tout rafraichir une fois. Merci! –

+0

David, je ne suis pas en train de suivre - quelle était votre solution? – Schalton