Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3017 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  problème de compteur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème de compteur

n°2178501
minimoack
Posté le 04-03-2013 à 10:57:55  profilanswer
 

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:

mood
Publicité
Posté le 04-03-2013 à 10:57:55  profilanswer
 

n°2178507
minimoack
Posté le 04-03-2013 à 11:09:56  profilanswer
 

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 ...

n°2178511
Yonel
Monde de merde !
Posté le 04-03-2013 à 11:16:55  profilanswer
 

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.

n°2178513
minimoack
Posté le 04-03-2013 à 11:19:48  profilanswer
 

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

n°2178515
minimoack
Posté le 04-03-2013 à 11:24:05  profilanswer
 

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
n°2178517
Yonel
Monde de merde !
Posté le 04-03-2013 à 11:28:32  profilanswer
 

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
n°2178519
minimoack
Posté le 04-03-2013 à 11:32:22  profilanswer
 

ok merci je vais voir ça :D

n°2178522
Yonel
Monde de merde !
Posté le 04-03-2013 à 11:36:42  profilanswer
 

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

n°2178525
minimoack
Posté le 04-03-2013 à 11:47:55  profilanswer
 

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)

n°2178526
minimoack
Posté le 04-03-2013 à 11:50:25  profilanswer
 

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...

mood
Publicité
Posté le 04-03-2013 à 11:50:25  profilanswer
 

n°2178527
minimoack
Posté le 04-03-2013 à 11:52:06  profilanswer
 

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

n°2178548
Yonel
Monde de merde !
Posté le 04-03-2013 à 13:16:16  profilanswer
 

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.

n°2178550
Yonel
Monde de merde !
Posté le 04-03-2013 à 13:21:18  profilanswer
 

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
n°2178555
minimoack
Posté le 04-03-2013 à 13:56:46  profilanswer
 

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.

n°2178561
Yonel
Monde de merde !
Posté le 04-03-2013 à 14:01:44  profilanswer
 

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.

n°2178565
minimoack
Posté le 04-03-2013 à 14:04:42  profilanswer
 

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...

n°2178566
minimoack
Posté le 04-03-2013 à 14:04:57  profilanswer
 

Je vais essayer de modifier mon code

n°2178567
Yonel
Monde de merde !
Posté le 04-03-2013 à 14:07:40  profilanswer
 

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

n°2178572
minimoack
Posté le 04-03-2013 à 14:15:05  profilanswer
 

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

n°2178575
Yonel
Monde de merde !
Posté le 04-03-2013 à 14:17:34  profilanswer
 

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

n°2178579
minimoack
Posté le 04-03-2013 à 14:24:44  profilanswer
 

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"  
 
...

n°2178580
Yonel
Monde de merde !
Posté le 04-03-2013 à 14:28:36  profilanswer
 

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

n°2178581
minimoack
Posté le 04-03-2013 à 14:37:18  profilanswer
 

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

n°2178582
minimoack
Posté le 04-03-2013 à 14:38:29  profilanswer
 

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

n°2178583
Yonel
Monde de merde !
Posté le 04-03-2013 à 14:39:26  profilanswer
 

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.

n°2178586
minimoack
Posté le 04-03-2013 à 14:41:09  profilanswer
 

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?

n°2178587
minimoack
Posté le 04-03-2013 à 14:42:52  profilanswer
 

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
n°2178590
Yonel
Monde de merde !
Posté le 04-03-2013 à 14:57:58  profilanswer
 

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.

n°2178592
minimoack
Posté le 04-03-2013 à 15:01:22  profilanswer
 

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

n°2178604
Marc L
Posté le 04-03-2013 à 15:38:26  profilanswer
 

 
           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 ‼
 

n°2178607
minimoack
Posté le 04-03-2013 à 15:41:13  profilanswer
 

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:

n°2178614
minimoack
Posté le 04-03-2013 à 15:56:57  profilanswer
 

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

n°2178632
minimoack
Posté le 04-03-2013 à 16:18:04  profilanswer
 

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

n°2178668
Marc L
Posté le 04-03-2013 à 17:44:00  profilanswer
 

 
           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
n°2178747
minimoack
Posté le 05-03-2013 à 09:02:19  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  problème de compteur

 

Sujets relatifs
Problème de compteurrecuperation d'IP sur serveur distant, probleme de compteur
[SQL] Problème de compteurcompteur de telechargement mal placé: problème code html ?
[PHP/SQL] Problème compteurPetit problème en C... compteur par rapport à un nombre de jours
[VBnet] Problème avec un compteur[PHP] Probleme de compteur de visite et de cookie
[php] probleme de synthaxe compteurprobleme dans la gestions des cookies pour compteur graphique
Plus de sujets relatifs à : problème de compteur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR