[Excel] Négation du Equiv

Résolu
Bonjour,

Voilà ma formule...
=SI(ESTNA(EQUIV(B2;{"test1";"test2"};0)))
=FAUX;EQUIV(B2;{"test1";"test2"};0);"")

ça marche mais ma formule est trop longue (+1024 car) à cause des conditions : ";{"test1";"test2"};" à réécrire 2 fois... Avez vous une méthode pour remplacer ce #N/A quand la condition est fausse ?

9 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Bonjour

    Excusez l'incruste

    vrai si NA
    If Sheets(feuille).Cells(ligne, colonne) = CVErr(xlErrNA) Then
    vrai si non NA
    If Not Sheets(feuille).Cells(ligne, colonne) = CVErr(xlErrNA
    ) Then

    peut-être suffisant
    If IsError(Sheets(feuille).Cells(ligne, colonne)) Then
    If Not IsError(Sheets(feuille).Cells(ligne, colonne)) Then

    1. Merci youha, mais J'ai des centaines de valeurs dans ma condition, le si ne suffirait pas... L'Equiv est limite... et ne peux donc pas être copié 2 fois. Je pensais a un script VBA...
      1. Dim Ligne,Colonne as Integer
        Dim Feuille as String
        Feuille = ActiveSheet
        
        For Ligne = 1 to ActiveSheet.UsedRange.Rows.Count
            For Colonne = 1 to ActiveSheet.UsedRange.Column.Count
                If Sheets(Feuille).Cells(Ligne,Colonne) = "#NA" then
                        Sheets(Feuille).Cells(Ligne,Colonne) = "Ce que tu veux"
                end if
           next colonne
        next ligne
        
        

        Je pense que cela devrait faire l'affaire.
    2. Merci Youha mais...

      il me dit "Erreur 438 : Propriété ou méthode non gérée par cet objet"

      qui renvoie à : Feuille = ActiveSheet
      1. Oublie de ma part, c'est ActiveSheet.CodeName
    3. Il me dit : Objet requis

      If Sheets(Feuille).Cells(Ligne, colonne) = "#NA" Then

      et quand j'enlève la colonne et que je met 1 :

      If Sheets(Feuille).Cells(Ligne,1) = "#NA" then

      il me dit : l'indice n'appartient pas a la selection .
      1. On va faire autrement.
        Dim Ligne,Colonne as Integer
        Dim Feuille as String
        Feuille = "Le Nom de Ta Feuille"
        
        For Ligne = 1 to ActiveSheet.UsedRange.Rows.Count
            For Colonne = 1 to ActiveSheet.UsedRange.Column.Count
                If Sheets(Feuille).Cells(Ligne,Colonne) = "#NA" then
                        Sheets(Feuille).Cells(Ligne,Colonne) = "Ce que tu veux"
                end if
           next colonne
        next ligne
        
        
        
        
    4. Merci, mais il me dit toujours "objet requis" :
      For Colonne = 1 to ActiveSheet.UsedRange.Column.Count

      j'ai Office Excel 2000...
      1. Ah ok, Excel 2000 (c'est très loin ça).
        Je vais te donner une liste à essayer parce que je n'ai pas Excel 2000 (et j'ai jamais eu l'occasion de travailler dessus).

        Essaye avec ça
        Sheets("Le Nom de Ta Feuille").Cells.Find("*", , , , xlByColumns, xlPrevious).Column

        Ce que fait ActiveSheet.UsedRange.Column.Count, c'est te trouver l'indice de la dernière colonne non nulle. Donc au pire, tu le vires tu ajoutes l'indice de cette colonne.

        Sinon je suis en train de me dire un truc tout con. Tu peux pas faire une Recherche (Ctrl + F) et cliquer sur "Remplacer tout" ?
    5. ça a l'air de marcher ta méthode... Mais il me met l'erreur "incompatibilité de type... à If Sheets(Feuille).Cells(Ligne, Colonne) = "#NA" Then

      mais Même lorsque je fais un truc Bidon du genre j'ai "incompatibilité de type :

      If sheets(feuil1).cells(1,1) = 1 then
      sheets(feuil1).cells(1,1) = 2
      end if

      Je dois être vraiment fatigué ^^. Et non je ne peux pas faire "recherche", puisque après je met ça dans un bouton qui fait beaucoup de choses automatiquement.
      1. AHHHH Mais oui, Excuses, c'est moi qui suis vraiment fatigué.
        Il faut mettre un .Value
        C'est donc Sheets(Feuille).Cells(Ligne, Colonne).Value (dans les nouvelles versions, le .value est la valeur par défaut)
    6. c'est vrai le value... Donc ça donne ?

      ça marche pour la 1ère colonne ^^... Après ça me met : "Objet requis". encore pour For Colonne = 1 To Sheets("Feuil1").Cells.Value.Find("*", , , , xlByColumns, xlPrevious).Column...

      Au pire je remplace la colonne par un chiffre c'est pas grave :). Les lignes c'est le plus important. Merci de ton aide !

      Private Sub CommandButton1_Click()

      Dim Ligne, Colonne As Integer
      Dim Feuille As String
      Feuille = "Feuil1"

      For Ligne = 1 To ActiveSheet.UsedRange.Rows.Count
      For Colonne = 1 To Sheets("Feuil1").Cells.Value.Find("*", , , , xlByColumns, xlPrevious).Column

      If Sheets(Feuille).Cells(Ligne, Colonne).Value = "#NA" Then
      Sheets(Feuille).Cells(Ligne, Colonne).Value = "Ce que tu veux"
      End If
      Next Colonne
      Next Ligne

      End Sub
      1. J'ai un collègue qui me dit que tu de passer par une variable intermédiaire, cela pourrait fonctionner.
        Donc ce serait :
        Dim DerniereColonne as Integer
        DerniereColonne = For Colonne = 1 To Sheets("Feuil1").Cells.Value.Find("*", , , ,xlByColumns, xlPrevious).Column

        (Et puis comme ça tu peux voir la valeur qu'aura DerniereColonne)
    7. Après de nombreux tests , il m'aura simplement fallut :

      If IsError(Sheets(feuille).Cells(ligne, colonne)) Then
      If Not IsError(Sheets(feuille).Cells(ligne, colonne)) Then

      Combinée à la boucle...

      L'inconvénient du CVErr(xlErrNA) était qu'il me mettait une erreur de type dès qu'il ne lisait pas une erreur.
      Et l'inconvénient du If Sheets(Feuille).Cells(Ligne, Colonne).Value = "#N/A"
      est qu'il ne me mettait jamais d'erreur quand il y en avait et il me mettait une erreur de type puisqu'il ne lit pas les erreurs.

      Merci à vous 2.