2009-10-09 9 views
0

J'ai un code assez ancien qui tourne bien dans les versions Excel avant 2007. En 2007, il génère une erreur d'exécution: run-time error 16 : expression is too complex. L'expression est assez simple et l'erreur semble sans rapport avec le problème réel.Est-ce que le moyen Excel évalue le type Date modifié dans Excel 2007

J'essaie de comparer 2 dates.

code exemple suivant:

Function getContractEnd() As Date 
    getContractEnd = Range("ContractEndDate").Value 
End Function 

Sub Foo() 
    Dim currentDate As Date 
    Do 
     'stuff 
    Loop Until currentDate > getContractEnd 'run-time error 16 
End Sub 

Excel 2007 fonctionne très bien lorsque la condition est changée en:

Loop Until DateValue(currentDate) > DateValue(getContractEnd) 

Pourquoi Excel 2007 me force essentiellement de jeter ces paramètres? Les deux devraient évaluer les types de données à Date? La seule explication possible que je puisse imaginer est que quelque chose a changé dans la façon dont la valeur de retour de la fonction getContractEnd est évaluée dans Excel 2007, mais je ne trouve aucune documentation pour le supporter.

Répondre

1

J'ai été capable de reproduire votre problème dans Excel 2003 avec VBA 6.3 - très drôle!

Cela semble être un problème spécifique à la construction de boucle qui ne peut pas gérer l'instruction conditionnelle impliquant deux types "Date".

Dès qu'au moins l'un des termes devient un Variant/Date, il commence à fonctionner. J'ai prouvé cela en supprimant soit le "As Date" dans l'état Sub Foo() ... Dim ou dans la fonction getContractEnd().

Bizarrement un Debug.Print VarType (...) retournera toujours 7, peu importe si la date ou la variante/Date

La même erreur se produit lors de la réécriture de Loop While

Bizarrement (2) Je n'ai pas pu reproduire ce comportement dans une instruction If. Même un Do Do While and Do jusqu'à fonctionne bien.

Hope this helps

Bonne chance MikeD

+0

Works pour moi. J'aimerais voir une documentation expliquant pourquoi ce comportement existe, mais j'ai été capable de changer le comportement dans Excel 2007 en jouant avec le type de retour et en passant à une boucle while. Je n'arrive toujours pas à le casser sur Excel 2003, mais je vais accepter qu'il s'agit plus de Loop et moins de passer de 2003 à 2007. Merci. – DaveParillo

Questions connexes