XL 2016 VBA : rechercher la même donnée dans des colonnes de feuilles différentes

Caradel

XLDnaute Nouveau
Bonjour à tous !

après avoir lu des dizaines de pages de forum, mais n'ayant pas trouvé une solution à mon problème, je me décide à vous écrire :

je dois créer une macro qui me permet :
- dans mon onglet SYNTHESE PRR, de regarder les données présentes en colonne E
- si, dans mon onglet TABLEAU ACOMPTE, on retrouve une valeur de la colonne E de l'onglet SYNTHESE PRR dans la colonne E également, alors, on renvoie la date du jour dans la ligne concernée de la colonne F


ex :

ONGLET SYNTHESE PRR
COLONNE E
1
4

ONGLET TABLEAU ACOMPTE
COLONNE E/ F
1 /08/07/22
2
3
4 /08/07/22



en sachant que les données de mes 2 onglets ne sont pas figées et qu'elles pourront s'étendre sur plus ou moins de lignes...


quelqu'un peut m'aider svp ???

merci d'avance :)
 
Solution
@Caradel

Option Explicit : oblige le programmeur à déclarer les variables.

Sub Essai() .. End Sub : c'est la macro Essai().

If ActiveSheet.Name <> "TABLEAU ACOMPTE" Then Exit Sub : on doit être sur la feuille "TABLEAU ACOMPTE", sinon on quitte la sub sans rien faire.

Dim n& : idem que Dim n As Long : déclaration d'une variable n, de type Long.

n = Cells(Rows.Count, 5).End(3).Row : idem que : n = Cells(Rows.Count, "E").End(xlUp).Row : n = n° de la dernière ligne utilisée, selon la colonne E.

If n = 1 Then Exit Sub : on quitte la sub si n = 1 ; car E1 est pour l'en-tête de colonne "Col E" ; les...​

soan

XLDnaute Barbatruc
Inactif
Bonsoir Caradel,

bienvenue sur le site XLD ! :)

je te propose le fichier joint ci-dessous. 😉

sur la 2ème feuille "TABLEAU ACOMPTE" :

formule en F2 (déjà étirée vers le bas jusqu'en F5) :

=SI(NB.SI('SYNTHESE PRR'!E:E;E2);AUJOURDHUI();"")

soan
 

Pièces jointes

  • Exo Caradel.xlsx
    10.9 KB · Affichages: 4

Caradel

XLDnaute Nouveau
Bonjour Soan,

Merci pour ta réponse 😀. effectivement ca donne bien le résultat escompté 👍 mais je souhaite l'obtenir via une macro car l'onglet SYNTHESE PRR est amené à disparaitre au fur et à mesure du déroulement de la macro que je suis en train de faire.

la formule que tu as écrite (et qui fonctionne) se retrouverait alors avec des REF dans la colonne F de TABLEAU ACOMPTE...
de plus je ne souhaite pas que la date (qui correspond à une date d'envoi de mail) soit écrasée de mise à jour en mise à jour du fichier. c'est pour cela que je cherche à faire la correspondance entre les colonnes E des 2 onglets et à renvoyer la date du jour dans la colonne F du TABLEAU ACOMPTE uniquement si une donnée se trouve dans les 2 onglets.
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Caradel,

voici une macro VBA. :) sur la feuille "TABLEAU ACOMPTE" : fais Ctrl e

Image.jpg




code VBA de Module1 (15 lignes) :

VB:
Option Explicit

Sub Essai()
  If ActiveSheet.Name <> "TABLEAU ACOMPTE" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 5).End(3).Row: If n = 1 Then Exit Sub
  Dim cel As Range, i&: Application.ScreenUpdating = 0
  For i = 2 To n
    With Cells(i, 5)
      Set cel = _
        Worksheets("SYNTHESE PRR").Columns(5).Find(.Value, , -4163, 1, 1)
      If Not cel Is Nothing Then .Offset(, 1) = Date
    End With
  Next i
End Sub

soan
 

Pièces jointes

  • Exo Caradel.xlsm
    18.1 KB · Affichages: 9
Dernière édition:

Caradel

XLDnaute Nouveau
Bonjour Soan,

Un grand merci pour ton aide !!!

le code sur l'exemple simplifié que j'ai donné pour illustrer ma demande fonctionne bien ! :D
par contre, je n'arrive pas à l'adapter dans mon vrai fichier de travail...
est-ce que tu aurais la gentillesse de me définir une par une les lignes de codes stp ? 😇 pour que je comprenne bien à quoi ca corresponde et que je puisse ensuite le faire rentrer dans le moule final... ;)

merci par avance !
 

soan

XLDnaute Barbatruc
Inactif
@Caradel

Option Explicit : oblige le programmeur à déclarer les variables.

Sub Essai() .. End Sub : c'est la macro Essai().

If ActiveSheet.Name <> "TABLEAU ACOMPTE" Then Exit Sub : on doit être sur la feuille "TABLEAU ACOMPTE", sinon on quitte la sub sans rien faire.

Dim n& : idem que Dim n As Long : déclaration d'une variable n, de type Long.

n = Cells(Rows.Count, 5).End(3).Row : idem que : n = Cells(Rows.Count, "E").End(xlUp).Row : n = n° de la dernière ligne utilisée, selon la colonne E.

If n = 1 Then Exit Sub : on quitte la sub si n = 1 ; car E1 est pour l'en-tête de colonne "Col E" ; les données numériques 1 à 4 sont en dessous, à partir de E2.

Dim cel As Range, i& : déclaration de deux autres variables ; pour i, dans mon fichier précédent, j'avais oublié le caractère « & » ; donc au lieu d'être de type Long, i était déclaré sans type, donc c'est par défaut du type Variant ; j'ai édité mon post #4 pour mettre la version corrigée du fichier précédent, et j'ai aussi mis à jour le code VBA indiqué dans le post.

Application.ScreenUpdating = 0 : désactivation de la mise à jour de l'écran ➯ l'exécution de la sub est plus rapide.

For i = 2 To n .. Next i : boucle sur les lignes 2 à n ; ici 2 à 5.

With Cells(i, 5) .. End With : avec la cellule de la ligne n° i, colonne E ; donc au départ, c'est avec E2.
VB:
Set cel = _
  Worksheets("SYNTHESE PRR").Columns(5).Find(.Value, , -4163, 1, 1)

en colonne E de la feuille "SYNTHESE PRR", on cherche .Value qui est la valeur de la cellule du With ; donc au départ, c'est le chiffre de E2 : 1.

If Not cel Is Nothing Then .Offset(, 1) = Date : si on a trouvé la valeur cherchée, alors on écrit la date 1 colonne à droite de la cellule du With, donc en colonne F (sur la même ligne que la valeur lue) ; exemple : pour 1 qui est lu en E2, on écrit donc la date du jour en F2.​



bien sûr, si dans ton vrai fichier le nom des 2 feuilles est différent, ça sera à changer dans la sub ; j'espère qu'avec tous ces commentaires tu arriveras à adapter mon code VBA à ton fichier réel, sinon, n'hésite pas à demander des infos supplémentaires. ;)

soan
 

Discussions similaires