problème de compteur

problème de compteur - VB/VBA/VBS - Programmation

Marsh Posté le 04-03-2013 à 10:57:55    

Bonjour!
 
J'ai un fichier avec 3 feuilles. je fais une boucle qui pour chaque cellules de la colonne 5 de la feuille 1, cherche une correspondance dans la colonne 5 de la feuille 2. Si on trouve une correspondance, on copie/colle la ligne de la feuille 1 dans la feuille 3.
 
Afin de faciliter les recherches des lignes après l'execution de la macro, j'ai rajouté deux colonnes à mon tableau qui contiennent le numéro de la ligne de la feuille 1, et le numéro de la ligne correspondante dans la feuille 2.
 
voici mon code :  

Code :
  1. Public Function ProgrammesSensibles(nomFeuil1, nomFeuil2, nomFeuil3 As String)
  2. ' Cette fonction prend en paramètres les noms des différentes feuilles
  3.      Dim i As Integer
  4.      Dim j As Integer
  5.      Dim k As Integer
  6.      Dim ligneMaxSh1 As Integer
  7.      Dim ligneMaxSh2 As Integer
  8.    
  9.      Dim rg As Range
  10.      Dim plage As String
  11.      ligneMaxSh1 = ActiveWorkbook.Sheets(nomFeuil1).Range("A65536 " ).End(xlUp).Row
  12.      ligneMaxSh2 = ActiveWorkbook.Sheets(nomFeuil2).Range("A65536 " ).End(xlUp).Row
  13.    
  14.      plage = "E1:E" & ligneMaxSh2
  15.    
  16.      k = 2
  17.      For i = ligneMaxSh1 To 2 Step -1
  18.           For j = ligneMaxSh2 To 2 Step -1
  19.                Set rg = ActiveWorkbook.Sheets(nomFeuil2).Range(plage).Find(ActiveWorkbook.Sheets(nomFeuil1).Cells(i, 5).Value)
  20.                If Not rg Is Nothing Then
  21.                     ActiveWorkbook.Sheets(nomFeuil1).Activate
  22.                     ActiveWorkbook.Sheets(nomFeuil1).Rows(i).Select
  23.                     Selection.Copy
  24.                     ActiveWorkbook.Sheets(nomFeuil3).Activate
  25.                     ActiveWorkbook.Sheets(nomFeuil3).Rows(k).Select
  26.                     ActiveSheet.Paste
  27.                     Cells(k, 11).Value = i
  28.                     Cells(k, 12).Value = j
  29.                     k = k + 1
  30.                     Exit For
  31.                End If
  32.              
  33.           Next
  34.      Next
  35.    
  36. End Function


 
Le "Cells(k, 11).Value = i" fonctionne correctement, et m'indique bien le numéro de ma ligne de la feuille 1.
Par contre, le "Cells(k, 12).Value = j" ne marche pas, et m'indique constamment 768, qui correspond à la valeur de ligneMaxSh2 ...
 
une idée?
 
merci  :jap:

Reply

Marsh Posté le 04-03-2013 à 10:57:55   

Reply

Marsh Posté le 04-03-2013 à 11:09:56    

j'ai pourtant arreté ma macro en pleine exécution afin de vérifier dans le code les valeurs de mes variables, et dans mon If, le compteur j n'a pas pour valeur 768 ...

Reply

Marsh Posté le 04-03-2013 à 11:16:55    

Juste comme ça sans avoir regardé en détail le code, pourquoi tu as pas utilisé la fonction Excel VLOOKUP (ou RECHERCHEV en français) ? J'ai l'impression que ça fait exactement ce que tu veux et ça t'aurait évité de coder.

Reply

Marsh Posté le 04-03-2013 à 11:19:48    

euh... parce que je n'ai jamais utilisé cette fonction :)
je vais essayer

Reply

Marsh Posté le 04-03-2013 à 11:24:05    

je dois faire dans ma boucle For i :  

Code :
  1. ActiveWorkbook.Sheets(nomFeuil1).cells(i, 5).Value = ActiveWorkbook.Sheets(nomFeuil2).VLookup(.Range("E1" ).Value, Sheets(nomFeuil2).Range("E1:E" & ligneMaxSh2), 2, False)


 
?
 
mais comment je peux faire pour mes compteurs? pour vérifier s'il a trouvé quelquechose?


Message édité par minimoack le 04-03-2013 à 11:24:37
Reply

Marsh Posté le 04-03-2013 à 11:28:32    

Si tu utilises cette fonction (regarde comment ça marche, ya pas mal de sites qui expliquent), elle renvoie la valeur #N/A dans le cas où aucune ligne n'a été trouvé.
Du coup pas besoin de compteur ni même de code en macro, t'aurais une formule du genre IF(ISNA(VLOOKUP(...))) dans ta Sheet3.
 
C'est une fonction extrêmement utile et très puissante d'Excel. Je recommanderais de regarder comment ça fonctionne.


Message édité par Yonel le 04-03-2013 à 11:31:00
Reply

Marsh Posté le 04-03-2013 à 11:32:22    

ok merci je vais voir ça :D

Reply

Marsh Posté le 04-03-2013 à 11:36:42    

Ca doit être une formule du genre :
=IF(ISNA(VLOOKUP(Sheet2!A1:A5;Sheet1!$A$1:$B$5;2;FALSE));"Pas trouvé !";"Trouvé !" )
à appliquer dans les cellules de ta Sheet3

Reply

Marsh Posté le 04-03-2013 à 11:47:55    

Code :
  1. For i = ligneMaxSh1 To 2 Step -1
  2.           If Not (IsNA(VLookup(ActiveWorkbook.Sheets(nomFeuil1).Cells(i, 5).Value, ActiveWorkbook.Sheets(nomFeuil2), "E:E", False))) Then
  3.                ActiveWorkbook.Sheets(nomFeuil1).Activate
  4.                ActiveWorkbook.Sheets(nomFeuil1).Rows(i).Select
  5.                Selection.Copy
  6.                ActiveWorkbook.Sheets(nomFeuil3).Activate
  7.                ActiveWorkbook.Sheets(nomFeuil3).Rows(k).Select
  8.                ActiveSheet.Paste
  9.                Cells(k, 11).Value = i
  10.                k = k + 1
  11.           End If
  12.      Next


 

Citation :

Sub ou Fonction non définie


 
je dois ajouter une référence pour utiliser VlookUp? (Excel 2002)

Reply

Marsh Posté le 04-03-2013 à 11:50:25    

Ce que tu viens d'écrire renvoie Pas trouvé  ou trouvé c'est ça?  
est-ce que tu pourrais détailler ta ligne?
je comprends l'utilisation de VlookUp, mais les ; après je ne sais pas...

Reply

Marsh Posté le 04-03-2013 à 11:50:25   

Reply

Marsh Posté le 04-03-2013 à 11:52:06    

et le IF(ISNA(vlookup) ...
ISNA correspond à ce qu'a renvoyé vlookup?
genre : Si la fonction vlookup n'a rien trouvé (ISNA) alors ...
 
?

Reply

Marsh Posté le 04-03-2013 à 13:16:16    

minimoack a écrit :

et le IF(ISNA(vlookup) ...
ISNA correspond à ce qu'a renvoyé vlookup?
genre : Si la fonction vlookup n'a rien trouvé (ISNA) alors ...
 
?


 
Oui le N/A c'est le retour du VLOOKUP. Dans ton cas tu cherches en colonne 5 c'est ça ?
Du coup ça donnerait :
 
=IF(ISNA(VLOOKUP(Sheet2!E1:E65536;Sheet1!$A$1:$E$65536;5;FALSE));"Pas trouvé !";"Trouvé !" )  
 
(colonne 5 dans le tableau Sheet1!$A$1:$E$65536, colonne E dans la Sheet2).
 
Ensuite le ISNA, si vrai retourne "Pas trouvé", sinon retourne "Trouvé". Mais si tu veux tu peux retourner la ligne en question à la place.

Reply

Marsh Posté le 04-03-2013 à 13:21:18    

minimoack a écrit :

Code :
  1. For i = ligneMaxSh1 To 2 Step -1
  2.           If Not (IsNA(VLookup(ActiveWorkbook.Sheets(nomFeuil1).Cells(i, 5).Value, ActiveWorkbook.Sheets(nomFeuil2), "E:E", False))) Then
  3.                ActiveWorkbook.Sheets(nomFeuil1).Activate
  4.                ActiveWorkbook.Sheets(nomFeuil1).Rows(i).Select
  5.                Selection.Copy
  6.                ActiveWorkbook.Sheets(nomFeuil3).Activate
  7.                ActiveWorkbook.Sheets(nomFeuil3).Rows(k).Select
  8.                ActiveSheet.Paste
  9.                Cells(k, 11).Value = i
  10.                k = k + 1
  11.           End If
  12.      Next


 

Citation :

Sub ou Fonction non définie


 
je dois ajouter une référence pour utiliser VlookUp? (Excel 2002)


 
Le code que je t'ai donné n'est pas un code de Macro. C'est une formule à appliquer directement aux cellules de ta Sheet3. Je pense que tu n'as pas besoin de code VB dans le cas présent.

Message cité 1 fois
Message édité par Yonel le 04-03-2013 à 13:23:21
Reply

Marsh Posté le 04-03-2013 à 13:56:46    

Yonel a écrit :


 
Le code que je t'ai donné n'est pas un code de Macro. C'est une formule à appliquer directement aux cellules de ta Sheet3. Je pense que tu n'as pas besoin de code VB dans le cas présent.


 
En fait, mon but, est qu'à l'ouverture d'un certain fichier, ces actions s'effectuent automatiquement, afin de permettre un gain de temps non négligeable. C'est pour cela que je fais une macro. Mon programme principal est dans le Workbook_Open, afin de s'exéctuer lors de l'ouverture du fichier, puis il appelle cette fonction.

Reply

Marsh Posté le 04-03-2013 à 14:01:44    

minimoack a écrit :


 
En fait, mon but, est qu'à l'ouverture d'un certain fichier, ces actions s'effectuent automatiquement, afin de permettre un gain de temps non négligeable. C'est pour cela que je fais une macro. Mon programme principal est dans le Workbook_Open, afin de s'exéctuer lors de l'ouverture du fichier, puis il appelle cette fonction.


 
A ce moment là la partie importante c'est le VLookup. Le ISNA n'est là que pour pouvoir exploiter le résultat. Essaye de coder ta macro en utilisant VLookup seulement, pour voir si tu as aussi un problème de références.

Reply

Marsh Posté le 04-03-2013 à 14:04:42    

En fait, si une donnée de la feuille 1 est également dans la feuille 2, c'est une donnée sensible, et je dois donc récupérer la ligne de cette donnée pour la mettre en feuille 3, et répertorier le numéro de la ligne de cette donnée en feuille 1 et en feuille 2 afin de les mettre en feuille 3...

Reply

Marsh Posté le 04-03-2013 à 14:04:57    

Je vais essayer de modifier mon code

Reply

Marsh Posté le 04-03-2013 à 14:07:40    

Essaye la fonction Match dans ce cas, ça permet de renvoyer le numéro de ligne.

Reply

Marsh Posté le 04-03-2013 à 14:15:05    

pour Match, il me met le même message d'erreur que pour VlookUp, "sub ou function non définie" ...

Reply

Marsh Posté le 04-03-2013 à 14:17:34    

Essaye de préfixer avec genre :
 
Application.Match  
Application.WorksheetFunction.Vlookup

Reply

Marsh Posté le 04-03-2013 à 14:24:44    

j'ai mis  

Code :
  1. If Not (Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(ActiveWorkbook.Sheets(nomFeuil1).Cells(i, 5).Value, ActiveWorkbook.Sheets(nomFeuil2), "E:E", False))) Then


 
et ça me donne :  
"Impossible de lire la propriété VLookUp de la classe WorkSheetFunction"  
 
...

Reply

Marsh Posté le 04-03-2013 à 14:28:36    

Copie/colle l'erreur dans google ya plusieurs solutions, notamment une sur ce même forum :
 
http://forum.hardware.fr/hfr/Progr [...] 9417_1.htm
http://www.commentcamarche.net/for [...] p-vba-2003

Reply

Marsh Posté le 04-03-2013 à 14:37:18    

le vlookup ne fonctionne que si la valeur à rechercher est dans la première colonne?

Reply

Marsh Posté le 04-03-2013 à 14:38:29    

Code :
  1. VLookup(ActiveWorkbook.Sheets(nomFeuil1).Cells(i, 5).Value, ActiveWorkbook.Sheets(nomFeuil2), 5, False)


parce que moi c'est en colonne 5 dans les 2 feuilles

Reply

Marsh Posté le 04-03-2013 à 14:39:26    

Non normalement tu passes l'index de la colonne à chercher en 3ème paramètre. En tout cas c'est comme ça que ça fonctionne en formule, en macro je ne sais pas mais j'imagine que c'est similaire.

Reply

Marsh Posté le 04-03-2013 à 14:41:09    

Après, ma fonction initiale fonctionnait très bien, excepté le compteur j qui me retournait ligneMaxSh2, le copier/coller fonctionnait correctement, et ma macro trouvait les correspondances entre les 2 feuilles, et me les mettait en feuille 3... tu n'aurais pas une idée pour j?

Reply

Marsh Posté le 04-03-2013 à 14:42:52    

Yonel a écrit :

Non normalement tu passes l'index de la colonne à chercher en 3ème paramètre. En tout cas c'est comme ça que ça fonctionne en formule, en macro je ne sais pas mais j'imagine que c'est similaire.


http://forum.hardware.fr/hfr/Progr [...] 9417_1.htm
 
dans le lien que tu m'as donné, le problème était que la valeur qu'on recherchait n'était pas dans la première colonne.
ici, on recherche une valeur DE la 5ème colonne de la feuille 1 DANS la 5ème colonne de la feuille 2


Message édité par minimoack le 04-03-2013 à 14:43:32
Reply

Marsh Posté le 04-03-2013 à 14:57:58    

minimoack a écrit :

Après, ma fonction initiale fonctionnait très bien, excepté le compteur j qui me retournait ligneMaxSh2, le copier/coller fonctionnait correctement, et ma macro trouvait les correspondances entre les 2 feuilles, et me les mettait en feuille 3... tu n'aurais pas une idée pour j?


 
Mmmh c'est assez difficile de débugger un cas comme ça en lisant le code. Essaye d'exécuter en pas-à-pas pour voir ce qui se passe dans ta boucle avec j.
Pour le VLookUp en VBA il doit y avoir moyen de le faire fonctionner, d'habitude je l'utilise en formule donc je sais pas. Tu peux ptet essayer avec Index(Match(,,0) si tu es bloqué sur ton premier code.

Reply

Marsh Posté le 04-03-2013 à 15:01:22    

Merci beaucoup pour ton aide, je vais essayer :jap: :D

Reply

Marsh Posté le 04-03-2013 à 15:38:26    

 
           Bonjour !   Comme cela à la louche (en ce moment je n'ai pas trop le temps), je crois bien déceler une erreur de conception
                           dans ton code de départ :   à quoi sert ta boucle j en ligne 22 ?
 
           Ensuite pour les lignes 25 à 32, c'est dommage (encore !) de travailler à coups d'horribles Activate / Select
           alors que c'est bien plus efficace de gérer directement les objets ‼
 

Reply

Marsh Posté le 04-03-2013 à 15:41:13    

pour la boucle, effectivement, je me rends compte qu'elle est de trop merci :)
qu'entends-tu par "gérer directement les objets" ?
 
merci de m'accorder un peu de temps :jap:

Reply

Marsh Posté le 04-03-2013 à 15:56:57    

et en fait, je viens de regarder un peu, la boucle j me permet de récupérer le numéro de la ligne de la feuille 2

Reply

Marsh Posté le 04-03-2013 à 16:18:04    

Code :
  1. For i = ligneMaxSh1 To 2 Step -1
  2.                Set rg = ActiveWorkbook.Sheets(nomFeuil2).Range(plage).Find(ActiveWorkbook.Sheets(nomFeuil1).Cells(i, 5).Value)
  3.                If Not rg Is Nothing Then
  4.                     ActiveWorkbook.Sheets(nomFeuil1).Activate
  5.                     ActiveWorkbook.Sheets(nomFeuil1).Rows(i).Select
  6.                     Selection.Copy
  7.                     ActiveWorkbook.Sheets(nomFeuil3).Activate
  8.                     ActiveWorkbook.Sheets(nomFeuil3).Rows(k).Select
  9.                     ActiveSheet.Paste
  10.                     Cells(k, 11).Value = i
  11.                     Cells(k, 12).Value = rg.Row
  12.                     k = k + 1
  13.                End If
  14.      Next


 
ça, ça fonctionne :D

Reply

Marsh Posté le 04-03-2013 à 17:44:00    

 
           Et oui avec un peu de réflexion !   ;)  
 
           Sinon en lisant l'aide par exemple de la méthode Copy (je n'invente rien …), avec l'existence de son argument Destination,
           tes six lignes n°4 à 9 de ton dernier code peuvent (doivent !) être remplacées par une seule, si si ‼

     ActiveWorkbook.Sheets(nomFeuil1).Rows(i).Copy  ActiveWorkbook.Sheets(nomFeuil3).Rows(k)

           En clair, voilà comment travailler efficacement avec les objets sans recourir aux affreux ralentisseurs  Activate  &  Select  !
 
           Quant aux lignes n°10 & 11, il faudrait alors y préciser leur feuille …


Message édité par Marc L le 04-03-2013 à 17:58:55
Reply

Marsh Posté le 05-03-2013 à 09:02:19    

ok merci :)
je débute en vba, donc j'ai encore un peu de mal :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed