IsNA erreur de compilation

Bonjour le forum

J'ai un problème avec le code suivant

If IsNA(Cells(x, 3)) = True Then

Mon Excel me dit "Sub ou Function non définie" en surligant la partie "IsNA", je ne comprends pas pourquoi.

Quelqu'un aurait il la solution ?

Merci.

Bonjour,

Avec :

If WorksheetFunction.IsNA(Cells(x, 3)) = True Then

?

Ou :

If WorksheetFunction.IsNA(Cells(x, 3)) Then

Bonjour,

Ou bien :

    If Cells(x, 3) = CVErr(xlErrNA) Then

Cordialement.

Merci beaucoup pour vos réponses Oyobrans et MFerrand,

Oyobrans, les deux bouts de code fonctionnent parfaitement ,

MFerrand, je n'ai pas su faire fonctionner ton code,

Cordialement.

Comment fais-tu pour ne pas y arriver ?

Comme ceci

lastrow = [B65000].End(xlUp).Row

    For i = 1 To lastrow

        Sheets("TEST").Select
        If Cells(i, 3) = CVErr(xlErrNA) Then
            recherche = Cells(i, 2).Value
            Sheets("Ann").Select
            [E65000].End(xlUp).Offset(1, 0).Select
            ActiveCell.Formula = recherche
            Else
        End If

    Next

Oh que je n'aime pas ces Select à tour de bras !

A part ça, si la cellule (i, 3) contient la valeur d'erreur NA, la condition sera vraie. Là la question est que contient (i, 2). Tu insères son contenu en tant que formule avec la propriété Formula, ce qui suppose que la valeur (je dis bien valeur !) de (i, 2) est un texte commençant par = et qui s'il contient des références de cellules, celles-ci doivent être de style A1, et s'il contient des noms de fonctions, ceux-ci doivent être en anglais....

Cordialement.

1. Oui c'est bien ce que je me disais concernant NA, le problème étant que précédemment dans la macro j'ai du faire :

For Each cellule In MaPlage
    If cellule.HasFormula Then
    cellule.Formula = cellule.Value
    End If
Next cellule

Je pense que c'est pour cela que ça ne fonctionne pas

2. En (i, 2), j'ai une chaine de caractères qui était une Formule et convertie en Value (code précédent englobe les deux colonnes)

3. En ce qui concerne les Select, si tu peux m'aider je t'en remercie car j'ai essayé maintes fois de changer tous mes select du style :

    Sheets("TEST").Select
    lastrow = [B65000].End(xlUp).Row
    For i = 1 To lastrow
        Sheets("TEST").Select
        If WorksheetFunction.IsNA(Cells(i, 3)) = True Then
            recherche = Cells(i, 2).Value
            Sheets("Ann").Select
            [E65000].End(xlUp).Offset(1, 0).Select
            ActiveCell.Formula = recherche
            Else
        End If
    Next

Par :

lastrow = Sheets("TEST").Range("B65000").End(xlUp).Row
    For i = 1 To lastrow
        If Sheets("TEST").Function.IsNA(Cells(i, 3)) = True Then
            recherche = Cells(i, 2).Value
            Sheets("Ann").Range("E65000").End(xlUp).Offset(1, 0) = recherche
            Else
        End If
    Next

je ne comprends pas encore toute la logique du VBA et je t'avoue que sans select je suis paumé, la seule chose que j'ai réussi à faire est

Sheets("Ann").Range("E1:E1") = "inconnu"

Non, ta transformation des formules en valeurs, ne modifie pas le caractère de de valeur d'erreur, et le test fonctionne pareil, j'ai vérifié.

Pour les Select, tu vois bien que tu y arrives ! Il faut considérer que tu ne bouges pas, ne te déplaces pas dans le fichier durant l'exécution, tu nommes les objets que tu utilises, cela suffit (ça fait autant d'opérations en moins...), mais tu ne dois plus alors te référer implicitement à la feuille active et avoir toujours une référence d'objet pour toute expression. Le maillon suivant est l'utilisation de bloc With pour raccourcir l'écriture du code (et surtout cela le rend plus rapide !)

    With Sheets("TEST")
        lastrow = .Range("B65000").End(xlUp).Row
        For i = 1 To lastrow
            If WorksheetFunction.IsNA(Cells(i, 3)) Then
                recherche = .Cells(i, 2).Value
                Sheets("Ann").Range("E65000").End(xlUp).Offset(1, 0) = recherche
            Else
                '...
            End If
        Next
    End With

Ton dernier code, presque pas retouché, j'ai juste mis la feuille Test sous bloc With, sa répétition disparaît dans le bout de code, toute expression commençant par un point réfère directement à la feuille. Je n'ai eu qu'à ajouter un point devant .Cells(i, 2).

(Et rétablir WorksheetFunction que tu avais écorché, coquille lors de la copie je pense...)

J'ai supprimé le = True, juste pour t'indiquer que le = True ou = False est à peu près toujours inutile, l'expression renvoie une valeur booléenne et If... Then attend simplement True pour exécuter le code qui suit ou False pour le sauter, pas besoin de lui demander d'évaluer si True = True ou False = True...

Pour revenir au point de départ, la fonction de feuille de calcul ESTNA est tout à fait utilisable. Je n'étais intervenu que pour indiquer qu'une fonction VBA existait pour renvoyer les valeurs d'erreurs de feuille de calcul : CVErr(xlErrNA) renvoie la valeur d'erreur #N/A et pouvait également être utilisée...

Cordialement.

Bonjour MFerrand et merci beaucoup pour le temps que tu consacres à faire progresser chacun sur le forum,

Pour les select, c'est super je viens de tester dans mon fichier et je n'ai aucun problème pour m'en séparer sauf dans un cas :

If WorksheetFunction.IsNA(Cells(i, 3)) Then

Si la feuille active n'est pas la feuille "TEST" cela ne fonctionne pas, sais-tu comment je pourrais utiliser cette fonction sans utiliser de select tout en allant chercher les cellules (i, 3) de la feuille "TEST"

J'ai supprimé le = True, juste pour t'indiquer que le = True ou = False est à peu près toujours inutile, l'expression renvoie une valeur booléenne et If... Then attend simplement True pour exécuter le code qui suit ou False pour le sauter, pas besoin de lui demander d'évaluer si True = True ou False = True...

Hahaha, en effet, maintenant que tu m'explique la logique je me rends compte que ce True est totalement absurde

[EDIT] Il y avait une petite erreur dans ton code au niveau de WorkSheetFunction, il manquait le "point" (.Cells(i,3)) Then

Mais temps mieux, grâce à cette erreur, j'ai compris l'utilité du With que je n'avais pas compris précédemment.

Cela me donne donc :

With Sheets("TEST")
lastrow = .Range("B65000").End(xlUp).Row
    For i = 1 To lastrow
        If WorksheetFunction.IsNA(.Cells(i, 3)) Then
            recherche = .Cells(i, 2).Value
            Sheets("Ann").Range("E65000").End(xlUp).Offset(1, 0) = recherche
        Else
        End If
    Next
End With

Bonjour,

et bravo ! J'avais zappé le point devant .Cells(i, 3), tu l'as rétabli...

Bonne journée.

Rechercher des sujets similaires à "isna erreur compilation"