VBA - Fonction SI et RechercheV pour deux onglets précédents
Bonjour,
J'ai un code VBA qui fait une RechercheV dans un onglet précédent pour récupérer un commentaire :
Sub test ()
Dim sht As Worksheet, rng As Range
Set sht = Worksheets(ActiveSheet.Index - 1)
Set rng = sht.Range("E4:R500")
ActiveSheet.Range("N4").Formula = "=VLOOKUP(E4," & rng.Address(external:=True) & ",11,FALSE)"
End Sub Je souhaite améliorer mon code : le code doit chercher un commentaire qui se trouve deux onglets avant si jamais il n'a pas trouvé de commentaire sur l'onglet précédent.
En plus clair :
"Faire
RECHERCHEV onglet précédent
SI pas de commentaire dans onglet précédent
Alors
RECHERCHEV deux onglets avant
Fin SI"
Je ne vois pas comment imbriquer une formule IF sans casser mon VLOOKUP...
Merci pour votre aide!
Bonjour,
Pas besoin de VBA pour ça, une simple formule suffit.
Dans l'exemple suivant 3 feuilles: "Feuil1, Feuil2, Feuil3" si la formule est dans la feuille 3, on cherche d'abord dans la feuille2 , si rien n'est trouvé, on cherche dans la feuille 1, et si toujours rien alors on ne met rien
=SIERREUR(SIERREUR(RECHERCHEV($E$4;Feuil2!$E$4:$R$500;11;0);RECHERCHEV($E$4;Feuil1!$E$4:$R$500;11;0));"")Cdlt
Bonjour,
Merci pour votre réponse !
Ma demande s'intègre dans une macro qui crée chaque mois un nouvel onglet, et chaque onglet comporte des noms bien différents
Votre formule marche bien, mais il est donc essentiel que je puisse intégrer l'équivalent dans la macro VBA
Pourriez-vous m'aider ?
Ecrivez la formule dans la cellule qui lui est destinée, puis ouvrez l'enregistreur de macros, validez la formule dans la barre de formule puis arrêtez l'enregistrement . Récupérez le code et collez-le dans votre macro.
Après difficile d'en dire plus vu que je n'ai pas la vision de votre fichier.
Je ne peux malheureusement pas partager le fichier, et l'alléger pour le montrer ne permettrait pas de comprendre grand chose...
J'ai pu tester votre formule en VBA grâce à votre technique, merci ! Voila ce que ça donne :
Sub test()
'RechercheV Anciens commentaires
Dim sht1 As Worksheet, rng1 As Range
Dim sht2 As Worksheet, rng2 As Range
Set sht1 = Worksheets(ActiveSheet.Index - 1)
Set rng1 = sht1.Range("E4:P500")
Set sht2 = Worksheets(ActiveSheet.Index - 2)
Set rng2 = sht2.Range("E4:P500")
ActiveSheet.Range("N4").Formula = _
"=IFERROR(IFERROR(VLOOKUP(E4," & rng1.Address(external:=True) & ",11,FALSE),VLOOKUP(E4," & rng2.Address(external:=True) & ",11,FALSE)),"""")"
End SubMais j'ai toujours un soucis : il ne m'affiche que les commentaires de l'onglet précédent et laisse la case vide lorsqu'il ne trouve pas de commentaire.
Il ne prends donc pas en compte l'onglet N-2!
Je pense que la première RECHERCHEV donne 0 quand elle ne trouve pas de résultat, et donc considère que ce n'est pas une erreur...
Une idée pour détourner ça ?
Encore merci pour votre aide, je sais que ce n'est pas évident sans le fichier...
Bizarre, je viens de faire des essais et tout marche bien.
Voici le fichier test avec lequel je fais les essais, si la valeur dans la feuille 2 n'est pas trouvée, c'est bien celle de la valeur de la feuille 1 qui remonte.
Edit: A moins que dans la feuill2 -2 le résultat ne se trouve pas dans la même colonne que la feuille -1
Bonjour Arturo,
Merci pour ton aide ! La formule a en effet l'air de marcher sur ton fichier. De mon côté, je suis finalement passé par une formule SI :
SI(Feuil1!$O4="";RECHERCHEV(E4;Feuil2!$E$4:$P$500;11;FAUX);RECHERCHEV(E4;Feuil1!$E$4:$P$500;11;FAUX))
(Il vient me chercher les infos de l'onglet N-2 s'il voit que je n'ai pas de valeur dans la colonne O de l'onglet N-1).
En code ça me donne ça :
Sub test()
'
Dim sht1 As Worksheet, rng1 As Range, cel As Range
Dim sht2 As Worksheet, rng2 As Range
Set sht1 = Worksheets(ActiveSheet.Index - 1)
Set rng1 = sht1.Range("E4:P500")
Set cel = sht1.Range("O4")
Set sht2 = Worksheets(ActiveSheet.Index - 2)
Set rng2 = sht2.Range("E4:P500")
ActiveSheet.Range("N4").Formula = _
"=IF(" & cel.Address(external:=True) & "="""",VLOOKUP(E4," & rng2.Address(external:=True) & ",11,FALSE),VLOOKUP(E4," & rng1.Address(external:=True) & ",11,FALSE))"
End SubPar contre, lorsque je lance mon code, j'obtiens à chaque fois
SI(Feuil1!$O$4="";RECHERCHEV(E4;Feuil2!$E$4:$P$500;11;FAUX);RECHERCHEV(E4;Feuil1!$E$4:$P$500;11;FAUX))
J'aimerai qu'il m'affiche $O4 et pas $O$4... J'ai l'impression que c'est due à ma fonction .Range ?
Est-ce que tu sais ce qu'il faudrait que je change dans mon code ?
Encore merci !
Cordialement
Rebonjour,
j'ai trouvé mon erreur, il fallait que je rajoute (RowAbsolute:=False)
Sub test()
Dim sht1 As Worksheet, rng1 As Range, cel As Range
Dim sht2 As Worksheet, rng2 As Range
Set sht1 = Worksheets(ActiveSheet.Index - 1)
Set rng1 = sht1.Range("E4:P500")
Set cel = sht1.Range("O4")
Set sht2 = Worksheets(ActiveSheet.Index - 2)
Set rng2 = sht2.Range("E4:P500")
ActiveSheet.Range("N4").Formula = _
"=IF(" & cel.Address(RowAbsolute:=False, external:=True) & "="""",VLOOKUP(E4," & rng2.Address(external:=True) & ",11,FALSE),VLOOKUP(E4," & rng1.Address(external:=True) & ",11,FALSE))"
End SubEncore merci pour votre aide et votre temps !