Fonction Si + RechercheV

Bonjour à tous,

je suis tout nouveau sur le forum, mais également dans les macros VBA donc soyez indulgents svp

Je rencontre deux problèmes dans une macro que je suis entrain de monter ,je vous explique :

je travaille sur un fichier avec 3 onglets.

Le 1er onglet est ma base de travail que je dois alimenter grace aux deux autres onglets.

Je voudrais faire une rechercheV sur la colonne A de mon 1er onglet avec les infos présents dans l'onglet 2, puis filtrer sur la colonne A de mon 1er onglet avec tous les #N/A et refaire une rechercheV avec les infos de l'onglet 3.

j'ai testé pas mal de choses avec des IF et VLOOKUP mais ca n'a rien donné..

Mon 2ème soucis ressemble un peu au premier je pense :

je voudrais appliquer différents filtres sur plusieurs colonnes et au final mettre un commentaire dans une colonne additionnelle :

exemple : si colonne A = 0 , colonne B > 20 et colonne C > 50 alors mettre le commentaire OK en colonne D .

N'hésitez pas à me demander plus d'infos.

Merci d'avance pour vos retours.

Cordialement

Personne n'a d'idée ? Je pense que c'est assez simple pour un expert.

Merci

Bonjour

Pour augmenter tes chances d'avoir une réponse il faut

  1. compléter ton profil de ta version Excel
  2. poster un fichier exemple représentatif

Bonjour Chris, merci pour ton intervention.

Je viens de mettre à jour mon profil => office 365

je met également un exemple de fichier.

1er problème : onglet A en colonne A, pouvoir récupérer les noms via les matricules et une/des recherche V sur les onglets B et C /

2e problème : alimenter en onglet A , colonne E commentaires = "OK" si colonne C>2000, colonne D = Paris et colonne E < 30

merci

RE

23personnel.xlsx (13.70 Ko)

Merci pour ton retour Chris.

Est- ce possible de l'avoir en écritue VBA ?

Je n'ai pas le visuel sur l'onglet développeur sur ton fchier d'ailleurs.

J'aurais aimer avoir le fichier non rempli ( comme je te l'ai envoyé ) et lancer la macro et ensuite avoir le résultat.

RE

Pas sûr de comprendre concrètement ton objectif

Soit tu fais du VBA soit SI et RECHERCHEV.

Si le but n'est pas d'écrire une formule, en VBA on n'utilise pas RECHERCHEV mais des boucles ou des Find

J'ai mis des formules, pas de code

L'onglet développeur est à activer dans ton interface, cela n'est pas lié au classeur

Quel intérêt de faire du VBA alors qu'avec des tableaux structurés, la formule va automatiquement se recopier sur toute nouvelle ligne

Bonjour Chris,

désolé si je n'ai pas été assez clair.

En fait je monte une macro pour des collègues qui passent des heures à manipuler des fichiers excel en faisant des tonnes de filtres, des copier coller, des suppressions , des rechercheV etc...

j'ai deja bien avancer mais là je bloque.

Voilà ou j'ens uis sur mon 1er bloquage :

Range("A6:A" & maxrowA).FormulaR1C1 = "=VLOOKUP(RC[4],IJEDI!C:C[10],8,FALSE)" => rechercheV sur le 2e onglet pour obtenir la BU

ActiveSheet.Range("$A$5:$AC$146").AutoFilter Field:=1, Criteria1:="=#N/A", Operator:=xlAnd => filtre sur les #N/A

Range("A6:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlVisible).Cells(1, 1).Select 'selection premiere ligne filtrée => selection de la 1ere ligne filtrée visible
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[4],'M-1'!C:C[1],2,FALSE)" => rechercheV sur le 3e onglet pour obtenir les BU manquantes

Le problème est que je n'arrive pas descendre la formule car le nombre de cellules ainsi que la premiere cellule visible aprés le filtre ne seront jamais les même selon les mois et les personnes qui vont manipuler les fichier ou la macro.

Donc, je voudrais savoir si il existe une formule ou un code ou une fonction en mode VBA qui puisse lancer une rechercheV sur l'onglet 2 et que si le résultat d'une cellule est #N/A, alors il lance la rechercheV sur le 3e onglet?

Pour mon 2e probléme cela est semblable car il y a pas mal de filtres, voilà ou j'en suis :

Range("A4:AB" & maxrowA).AutoFilter Field:=9, Criteria1:="=0,00", Operator:=xlAnd ' solde compta = 0
Range("A4:AB" & maxrowA).AutoFilter Field:=6, Criteria1:="=0,00", Operator:=xlAnd ' paie compta =0
Range("A4:AB" & maxrowA).AutoFilter Field:=7, Criteria1:="=0,00", Operator:=xlAnd 'regule compta = 0

'Mettre le commentaire " 01-Anomalie lettrage : arrêt soldé paie = compta " dans la colonne " commentaires "

Donc, je voudrais savoir si il existe une formule ou un code ou une fonction en mode VBA pour dire que après avoir fait tel filtre sur la colonne A, tel filtre sur la colonne B et tel filtre sur la colonne C , alors le commentaire "xxxxxx" se met automatiquement en colonne D ?

J'espère que c'est plus clair ainsi, merci d'avance pour vos retours

Bonne soirée

RE

Je t'ai donné la formule donc si tu tiens à la mettre en VBA il suffit de la transposer en anglais

    Range("t_Synthese[[Nom ]]").FormulaR1C1 = _
        "=VLOOKUP([@[Matricule ]],IF(COUNTIF(T_Personnes1[[Matricule ]],[@[Matricule ]])>0,T_Personnes1,T_Personnes2),2,0)"

Comme déjà dit si tu utilises des tableaux structurés, le nombre de lignes est géré par le tableau, les formules suivent automatiquement donc les vieilles méthodes de xlup pour trouver ne servent plus

Ta demande pour le commentaire n'est pas la même que vendredi

Filtrer des lignes pour écrire des formules différentes selon les lignes est une très mauvaise pratique alors qu'une formule unique gère cela très bien comme je l'ai montré

Tu essaye d'automatiser une mauvaise approche...

Tu as 365 alors tires-en parti : tableaux structurés (existent dans Excel depuis 17 ans), PowerQuery souvent plus efficace que VBA

Bonsoir à tous,

Pas sûr que ça change quelque chose, mais je suis 100% d'accord avec Chris et je ne vois rien ici qui ne soit pas réalisable avec des formules relativement simples. Et je ne vois pas non plus l'intérêt de passer par du VBA ici ....

Si c'est juste pour réinventer la roue, des fois, ça ne vaut vraiment pas le coup.

Bonjour,

merci pour vos retours.

C'est clair que avec des tableaux structurés cela serait nikel mais le problème est que les deux onglets en question sur lesquels je récupère les infos grâce aux rechercheV sont des extractions de logiciels interne à ma boite et donc ne sont pas sous format structurés.

Dans ce cas ne faudrait -il pas que j'exporte depuis ces extractions que les colonnes qui m'interessent vers mon fichier ou sera ma macro ( dans 2 onglets différents ) sous des tableaux structurés ?

Bonjour

Tu as 365, utilise PowerQuery : tu auras une synthèse automatique, sous forme de tableau structuré, des 2 listes de personnes et du coup un RECHERCHEV (si toujours utile) bien plus simple

Les fichiers extrait peuvent rester indépendant du classeur qui les utilise ce qui simplifie également

je viens de regarder ton lien ainsi que quelques videos sur power Query et ça à l'air super.

Je compte m'y mettre bientot.

Cepedant, je n'ai pas le choix de finir en VBA ce qui a été commencé depuis un moment.

J'essaye d'adapter ta formule VBA à mes fichiers mais je n'y arrive pas, désolé mais cest très complexe pour moi..

Range("t_Synthese[[Nom ]]").FormulaR1C1 = _
"=VLOOKUP([@[Matricule ]],IF(COUNTIF(T_Personnes1[[Matricule ]],[@[Matricule ]])>0,T_Personnes1,T_Personnes2),2,0)"

t_synthèse => c'est ma feuille ou je vais lancer ma rechercheV OK

Nom => ce que l'on recherche - colonne NOM OK

après cela se complique car je pense que ta formule est adapté que à des tableaux structuré .

RechercheV avec le matricule , colonne matricule de la feuille ou je mance ma rechercheV

Après je ne comprends plus.. les @ et les crochets je ne maitrise pas du tout..

Faut il que mes trois colonnes ou se situe les matricules se nomment Matricule pour que le formule fonctionne ?

RE

Non T_Syntese est le nom du tableau structuré de la feuille onglet A

Si tu ne mets pas tes 2 autres plages des onglets B et C en tableaux structurés

    Range("t_Synthese[[Nom ]]").FormulaR1C1 = _
        "=VLOOKUP([@[Matricule ]],IF(COUNTIF('onglet B'!C1,[@[Matricule ]])>0,'onglet B'!C1:C2,'onglet C'!C1:C2),2,0)"

Ok , merci Chris.

dernière question sur ce projet :

j'ai pu trouvé la fonction adéquate pour reporter les commentaires voulus selon certains filtres appliqués.

Cependant j'ai un soucis pour écrire ma boucle quand j'ai plusieurs valuers comprise "entre"

voilà ma boucle de base :

For Each Cellule In Sheets("ANALYSE").Rang("A6:A65536")
If Sheets("ANALYSE").Cells(Cellule.Row, 5) <> "" Then
If Sheets("ANALYSE").Cells(Cellule.Row, 17) = 0 And Sheets("ANALYSE").Cells(Cellule.Row, 9) = 0 And Sheets("ANALYSE").Cells(Cellule.Row, 18) = 0 Then
'MsgBox Cellule.Text
Sheets("ANALYSE").Cells(Cellule.Row, 19) = " 10-Ecart < 20 euros - OD à passer "
End If
End If
Next

Sauf que maintenant je voudrais faire même boucle avec colonne 17 et 9 valeur comprise entre -20 et 20 et la colonne 18 égale à "vide" .

Merci d'avance

Bonjour

Comme déjà dit, utiliser des filtres pour mettre des formules ou même des constantes n'est pas la bonne pratique

Pas sûr d'avoir bien compris

Fait plutôt un Select case. Ici avec un seul cas mais n'ayant pas le tableau ni la logique, ce n'est qu'un exemple à améliorer

N'utilise pas Cells(Cellule.Row, 9) mais des offset

For Each cellule In [t_Synthese].ListObject.ListColumns(1).DataBodyRange
    If cellule.Offset(0, 4) <> "" Then
        Select Case cellule.Offset(0, 8)
            Case 0, -20 To 20
                If (cellule.Offset(0, 17) = 0 And cellule.Offset(0, 16) = 0) Or _
            (cellule.Offset(0, 17) = "" And cellule.Offset(0, 16) >= -20 And cellule.Offset(0, 16) <= 20) Then _
                cellule.Offset(0, 18) = "10-Ecart < 20 euros - OD à passer"
        End Select
    End If
Next

En fait Chris, je voudrais conserver la structure que j'ai mis en place même si cela peut sembler inapproprié pour les experts.

En effet elle marche bien et j'en suis satisfait.

Je voudrais juste connaitre l'écriture à mettre en place pour les deux cas exposés :

If Sheets("ANALYSE").Cells(Cellule.Row, 17) = entre -20 et 20 And Sheets("ANALYSE").Cells(Cellule.Row, 9) = entre -20 et 20 And Sheets("ANALYSE").Cells(Cellule.Row, 18) =

vide

Comment dois je écrire ces possibiltés en gardant ma fonction en l'état ?

Bonjour,

je viens de tester les offsets et cela marche bien.

par contre je n'arrive pas à faire fonctionner cette formule quand je cherche deux cellules avec des valeurs comprises entre -20 et 20 ..

RE

Si tu relis mon code tu as la réponse ...

cellule.Offset(0, 16) >= -20 And cellule.Offset(0, 16) <= 20)

Salut Chris,

J'ai bien lu mais cela concerne une seule colonne avec ce critère .

Si je veux les conditions suivantes :

si colonne A comprise entre -20 et 20 et colonne B comprise entre -20 et 20, then etc....

peut on cumuler ces 2 conditions avec la fonction Offset ?

Rechercher des sujets similaires à "fonction recherchev"