Amélioration fonction

Bonjour,

J'ai créé une fonction qui me retourne prochaine ligne ou la valeur est trouvé. Voici un exemple pour plus de compréhension

Valeur de mes cellules

OK

OK

WARNING

OK

KO

ma fonction retournerais 3 si je recherche WARNING et 5 si je recherche KO.

Cela fonctionne mais mon problème est que ma variable qui définit la colonne où faire la recherche doit être mise en texte entre " ". Je ne peux donc pas sélectionner toute une colonne lors de la mise en place de ma fonction dans une cellule.

Voici les valeurs d'une cellule pour appeler la commande : =lancement("B")

Et voila ce que j'aimerais avoir : =lancement(B:B)

J'ai essayé en changent la définissions de ma variable colonne, en intégrant une commande "awk" (pas sur de l'avoir bien faite) mais sans résultat.

Quelqu'un aurait la réponse ?

Voici ma fonction :

Private Function lancement(colonne As String, Optional ByVal startday As Integer = 1) As Integer ' Recherche du premier Warning après le paramètre startday ' Définition des variable Ligne = startday ' Recherche du premier jour ouvré après le paramètre startday Do While Ligne < 33 If Sheets("Calcul").Range(colonne & Ligne).Value = "WARNING" Then lancement = Ligne Exit Do End If Ligne = Ligne + 1 Loop End Function

Bonjour,

Pourquoi utiliser une fonction VBA ?

Cette fonction ressemble beaucoup à la fonction Excel EQUIV(). Cette dernière peut être combinée à une fonction INDIRECT() ou DECALER() si besoin de changer la ligne de départ.

Bonjour,

Merci pour la réponse rapide. Je viens de tester la fonction mais elle me retourne pas le bon résultat.

J'ai créé un colonne avec les valeurs suivante :

ko

ko

ko

ko

ok

ko

ko

ko

ko

ok

ko

la commande =EQUIV("ok";A:A) retourne 10 comme valeur (qui correspond au dernier ok) mais si je modifie ma colonne A les valeur change aléatoirement (il prend soit le dernier ok soit le numéro de la dernière cellule avec une valeur.

Ce que j'aimerais c'est qu'il me sort le premier ok et non le dernier.

Comme je dois aussi faire la même chose mais en inverse (trouvé la ligne précédente avec la valeur demandé) j'étais partie sur deux fonctions avec une légère modif. La fonction EQUIV peut le faire en inversé ?

La fonction EQUIV renvoie bien la première valeur trouvée si vous faire une recherche exacte (voir : Support Excel - EQUIV). Voilà donc votre formule exemple corrigée :

=EQUIV("ok";A:A;0)

Je n'ai pas bien saisie le principe de votre fonction inversée... Pouvez vous détailler (un exemple ?) ?

Merci pour la correction, je n'avais pas vu l'option 0.

Pour la fonction inversée :

Voici un exemple :

ko

ko

ko

ko

ok

ko

ko

ko

ok

ko

ko

ko

ok

je voudrais dire à la fonction de commencer à la ligne 11 et de me trouver le premier OK avant (soit la ligne 9).

Pour la fonction limitée à une certaine plage, c'était l'objet de ma première proposition : utiliser la fonction DECALER ou INDIRECT.

INDIRECT : permet d'interpréter un texte comme une référence de plage valide. Exemple :

=SOMME(INDIRECT("A1:A" & $B$2))

Si B2 contient la valeur 10, la fonction SOMME se fera sur la plage A1:A10.

DECALER : permet de décaler une plage de référence d'un nombre de ligne(s) ou de colonne(s) paramétré, et/ou de changer la dimension de cette même plage (nombre de ligne(s) ou colonne(s)).

Exemple sur le site de Jacques Boisgontier : http://boisgontierjacques.free.fr/pages_site/decaler.htm

J'avais réussi avec les fonctions DECALER ET INDIRECT sur la première version.

Par contre sur la deuxième version je ne vois pas comment lui faire remonter les lignes au lieu de les descendre.

dans mon message précédent, j'indique que la fonction doit retourner la ligne au dessus.

Merci pour la correction, je n'avais pas vu l'option 0.

Pour la fonction inversée :

Voici un exemple :

ko

ko

ko

ko

ok

ko

ko

ko

ok

ko

ko

ko

ok

je voudrais dire à la fonction de commencer à la ligne 11 et de me trouver le premier OK avant (soit la ligne 9).

Je n'avais pas bien compris le besoin de cette 2ème partie. A moins de pouvoir créer une nouvelle colonne pour y inverser toute ta plage, je ne vois pas comment faire avec les fonctionnalités de base.

C'est là où VBA peux avoir un intérêt...

Exemple à tester :

Function EQUIV_INVERSE(ValCherch As Variant, Plage As Range) As Long

    Dim MonTab(), MonTab2(), i As Long, Max As Long

    MonTab = Plage.Value
    Max = UBound(MonTab)
    ReDim MonTab2(Max)
    For i = Max To 0 Step - 1
        MonTab2(Max - i) = MonTab(i)
    Next i
    EQUIV_INVERSE = Application.Match(ValCherch, MonTab2, 0)

End Function

Plutôt qu'une plage à redimensionner toi-même, si tu préfères indiquer la position de la dernière ligne à regarder (ex : ligne 11). Il te suffit d'ajouter dans les paramètres de la fonction VBA : Max As Long, et de supprimer Max = UBound(MonTab).

Bonjour,

Je viens de tester ta fonction, mais le retour est #valeur!

j'ai essayé avec les deux méthode que tu indique avec le même résultat.

j'ai crée une liste dans la colonne A :

ko

ko

ko

ko

ko

ok

ko

ko

ok

ko

ok

et mis ça en variable de la fonction :

ça c'est en définissant moi même la dernoière ligne à vérifier

=EQUIV_INVERSE("ok";8;A1:A11)

et ça c'est avec le Max = UBound(MonTab)

=EQUIV_INVERSE1("ok";A1:A11)

pour les deux j'ai le retour #VALEUR!

Bonjour,

Je viens de tester ta fonction, mais le retour est #valeur!

C'est ma faute, j'ai été trop vite sans me relire. Voilà une proposition fonctionnelle :

Option Base 1
Public Function EQUIV_INVERSE(ValCherch As Variant, Plage As Range, Optional Max As Long = 0) As Long

    Dim MonTab() As Variant, MonTab2() As Variant, i As Long

    MonTab = Plage.Value
    If Max = 0 Then Max = UBound(MonTab) Else Max = Max - 1
    ReDim MonTab2(Max)
    For i = Max To 1 Step -1
        MonTab2(Max - i + 1) = MonTab(i, 1)
    Next i
    EQUIV_INVERSE = Max + 1 - Application.Match(ValCherch, MonTab2, 0)

End Function

PS : le paramètre MAX est optionnel, si tu ne mets rien, il prend toute la plage.

Parfait.

Merci, la fonction fonctionne parfaitement.

Merci de ton retour et d'avoir passé le sujet en résolu ! Bonne continuation.

Rechercher des sujets similaires à "amelioration fonction"