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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Beug de programme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Beug de programme

n°2188418
sadhya
Posté le 02-05-2013 à 04:14:40  profilanswer
 

Salut alors dans un Classeur j'ai des informations dans la page 2 et 3 dans la deuxième colonne il y a des références d'éléments . Je souhaite écrire dans la feuille 1  tous les éléments qui sont dans la feuille 2 mais qui sont pas dans la feuille 3 . Voici ce que j'ai déjà écris . Comme il y a énormément de ligne dans mes deux feuilles ça ne termine meme pas l'éxecution ça plante ça redémarre excel .  
 

Code :
  1. Sub Retardpmi()
  2. Dim wkb As Workbook: Set wkb = ThisWorkbook
  3. ligne2 = 3
  4. With wkb
  5.   Dim sht1 As Worksheet: Set sht1 = Worksheets("Feuil1" )
  6.   Dim sht2 As Worksheet: Set sht2 = Worksheets("Feuil2" )
  7.   Dim sht3 As Worksheet: Set sht3 = Worksheets("Feuil3" )
  8. End With
  9. Application.ScreenUpdating = False
  10. With sht2 ' Feuille 2
  11. fin = Range("A1" ).End(xlDown).Row
  12. fin1 = sht3.Range("A1" ).End(xlDown).Row
  13.   For ligne = 3 To fin
  14.      For ligne1 = 3 To fin1
  15.    ' Si cellule Feuil1 <> Feuil2
  16.    If Not (.Cells(ligne, 2) = sht3.Cells(ligne1, 2)) Then
  17.      ' cel Feuil2 prend la valeur Cel Feuil1
  18.     .Rows(ligne).Copy sht1.Rows(ligne2)
  19.     ligne2 = ligne2 + 1
  20.    End If
  21.   Next ligne1
  22.   Next ligne
  23. End With
  24.   Application.ScreenUpdating = True
  25. End Sub


J'attends vos réponses avec imaptience bisous a vous


Message édité par sadhya le 02-05-2013 à 04:22:15
mood
Publicité
Posté le 02-05-2013 à 04:14:40  profilanswer
 

n°2188521
Marc L
Posté le 02-05-2013 à 12:21:44  profilanswer
 

 
           Salut !
 
           Si la variable Fin de la ligne n°11 correspond à la Feuille 2, il manque alors le point devant le Range !
           En l'état, sans le point, elle prend la feuille active …
 
           Aussi, comme déjà souligné dans mes précédents échanges, si dans la colonne A il y a une cellule vide avant la dernière saisie,
           cette variable correspond à la cellule précédant cette cellule vide et non pas à celle de la dernière saisie …
 
           Si la problématique est correctement exposée, il y a bien un gros problème avec l'imbrication des boucles !
           En effet, telles quelles, l'exécution effectue ceci :  si la cellule de la ligne N de la colonne 2 de la feuille 2 est différente de la cellule
           de la ligne N de la colonne 2 de la feuille 3 alors la ligne N de la feuille 2 est recopiée intégralement dans la feuille 1 !
           Même si cette cellule de la ligne N de la colonne 2 de la feuille 2 est présente après la ligne N dans la colonne 2 de la feuille 3 …
 
           S'il s'agit donc bien de recopier l'intégralité d'une ligne de la feuille 2 dans la feuile 1  {1) à clarifier}
           uniquement si la valeur dans sa colonne 2 n'est pas présente parmi la colonne 2 dans la feuille 3,
           et ce qu'elle que soit sa position dans cette colonne 2 de la feuille 3  {2) à clarifier},
           alors une seule boucle est nécessaire pour parcourir la colonne 2 de la feuille 2 et,
           pour les comparer au contenu de la colonne 2 de la feuille 3, la méthode  Find  associée à un objet Range (cellule)
           s'avère vraiment utile par souci d'efficacité et de rapidité …
 
           Si je n'ai pas bien compris la problématique, une explication rigoureuse serait profitable.
 
           Sinon je te laisse plancher sur cette voie, me montrer l'évolution de ton code avant de dévoiler le mien,
           dans lequel j'envisage une boucle  For Each  afin de travailler directement avec les objets (cellules).
 
           Autres précisions :
 
           3)  Voyant la propriété ThisWorkbook, le code est bien contenu dans le classeur des feuilles à traiter ?
                 Où se trouve le code ?  Un module normal ou un module de classe feuille ou ThisWorkbook ?
 
           4)  Comment la procédure est-elle lancée ?   Par bouton, une autre procédure ?
 
           5)  Quelle est la feuille active au moment du lancement de la procédure ?   Est-ce toujours la même ?
 
           6)  La feuile 1 avant l'éxécution est-elle bien toujours vide à partir de la ligne n°3 ?


Message édité par Marc L le 02-05-2013 à 13:57:35
n°2188553
sadhya
Posté le 02-05-2013 à 15:10:16  profilanswer
 

Dans la colonne A il y a les numéros .  
- Ligne 1 fusion des cellules de A à F pour le titre
- Ligne 2 Nomination des colonnes  
1 et 2 ) Il s'agit de réécrire la ligne sur la Feuil1 de tous les éléments qui sont dans la dans la colonne B de la Feuil2 mais qui ne sont pas dans la colonne B de la Feuil3 et ce quelque soit la ligne.
 
3) Oui le code est contenu dans le classeur des feuilles à traiter .  
 
4) Par le bouton exécuter  
 
5) Alors ça dépend de la personne qui fera le bilan donc elle ne sera pas toujours la même , mais si ça facilite la vie je peux faire en sorte que l'utilisateur soit toujours sur une même page  
 
6) Non elle ne sera pas toujours vide à la première utilisation elle sera vide mais aux autres utilisations il faudra écraser les données qui sont déjà dans les cellules  

n°2188555
Marc L
Posté le 02-05-2013 à 15:17:32  profilanswer
 

 
           4 & 5)  Où se trouve le bouton Exécuter ?  Sur une feuille, laquelle ?
                      Dans le cas d'une feuille, c'est toujours elle la feuille active, non ?
 
           Sinon mon interprétation de la problématique est la bonne, as-tu regardé la méthode  Find  ?


Message édité par Marc L le 02-05-2013 à 15:17:56
n°2188556
sadhya
Posté le 02-05-2013 à 15:19:21  profilanswer
 

Je n'ai pas prévu de bouton éxécuter l'utilisateur ce contente d'aller d'afficher les macros et de lancer la macro

n°2188560
Marc L
Posté le 02-05-2013 à 15:28:51  profilanswer
 

 
           Bien, pas de souci !   J'attends de voir la progression de ton code avant de publier le mien …
 

n°2188565
sadhya
Posté le 02-05-2013 à 15:41:13  profilanswer
 

J'ai regardé la fonction Find  
 
Je pense que je ne l'ai pas trop bien compris  
 
voilà ce que j'ai essayé  

Code :
  1. Sub Retardpmi()
  2. Dim wkb As Workbook: Set wkb = ThisWorkbook
  3. ligne2 = 3
  4. With wkb
  5.   Dim sht1 As Worksheet: Set sht1 = Worksheets("Feuil1" )
  6.   Dim sht2 As Worksheet: Set sht2 = Worksheets("Feuil2" )
  7.   Dim sht3 As Worksheet: Set sht3 = Worksheets("Feuil3" )
  8. End With
  9. Application.ScreenUpdating = False
  10. fin = sht2.Range("A1" ).End(xlDown).Row
  11. fin1 = sht3.Range("A1" ).End(xlDown).Row
  12.  
  13.   For ligne = 3 To fin
  14.   ValaChercher = sht2.Cells(ligne, 2)
  15.   sht3.Select
  16.   papi = Selection.Find(ValaChercher, 3, 2, fin1, 2, True)
  17.  
  18.     If papi = False Then
  19.     sht2.Rows(ligne).Copy sht1.Rows(ligne2)
  20.     ligne2 = ligne2 + 1
  21.    End If
  22.   Next ligne
  23.    Application.ScreenUpdating = True
  24. End Sub


Message édité par sadhya le 02-05-2013 à 15:51:46
n°2188581
Marc L
Posté le 02-05-2013 à 16:41:27  profilanswer
 

 
           Oui, effectivement car tu as pris le Find associé à l'application au lieu de celui associé au Range comme je l'avais pourtant indiqué !
 
           Avant de dévoiler mon code, quelques remarques …
 
           C'est bien de définir des variables objets et de s'en servir mais s'agissant du classeur contenant la procédure et de ses feuilles,
           il n'y en a pas besoin car elles existent déjà !
 
           Pour le classeur, tu définis une variable pour ThisWorkbook pour ne l'utiliser qu'une fois !
           Autant écrire directement  With ThisWorkbook  en ligne n°4 !
           
           Mais le plus grave, c'est l'oubli du point devant les  Worksheets  des lignes n°6 à 8
           car en l'état, elles font référence donc au classeur actif et si ce n'est pas celui contenant la procédure …
 
           Les variables existent déjà elles aussi pour les feuilles !
           En effet, on peut les voir dans l'environnement VBA dans les objets Excel du projet du classeur avant ThisWorkbook.
           Par exemple :   Feuil1 (Feuil1)
           Entre parenthèses, c'est le nom de la feuille tel qu'il apparait dans les onglets du classeur dans Excel.
           Avant les parenthèses, c'est la propriété CodeName, la variable objet de la feuille en quelque sorte
           et donc, comme ThisWorkbook, directement utilisable dans le code …
 
           Même si le nom de la feuille est changé, son CodeName ne l'est pas lui !
           Il peut être modifié manuellement dans l'environnement VBA dans la fenêtre des propriétés de la feuille ou par code …
           
           J'ai écrit le code à la volée sans le tester.
           Normalement le CodeName  Feuil1  équivaut à ThisWorkbook.Worksheets(Feuil1.Name).
           A vérifier quand même si un autre classeur est actif, l'appel de la procédure se passe sans encombre …

Code :
  1. Sub RetardPMI()
  2.     Application.ScreenUpdating = False
  3.     Feuil2.Activate
  4.     R = 3
  5.     X = Rows.Count
  6.     Feuil1.Rows("3:" & X).ClearContents
  7.    
  8.     For Each Cel In Range("B3", Cells(X, 2).End(xlUp))
  9.         If Cel > "" Then
  10.             Set Rg = Feuil3.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  11.    
  12.             If Rg Is Nothing Then
  13.                 Cel.EntireRow.Copy Feuil1.Rows(R)
  14.                 If R < X Then R = R + 1 Else Exit For
  15.             End If
  16.         End If
  17.     Next
  18.    
  19.     Feuil1.Activate
  20.     Application.ScreenUpdating = True
  21. End Sub


            Si la feuille 2 n'était pas activée en ligne n°3, il faudrait alors préciser la feuille pour chaque objet de la ligne n°8 :
 
                   For Each Cel In Feuil2.Range("B3", Feuil2.Cells(X, 2).End(xlUp))
 
           Ligne n°9   :  seules les cellules non vides de la deuxième colonne sont traitées …
 
           Ligne n°10 :  la recherche s'effectue dans l'intégralité de la colonne, la méthode  Find  étant d'une telle célérité !
                               Mais face à un puriste (comme pour .Value), il faudrait peut-être indiquer seulement la plage des saisies de la colonne …
 
           La feuille 1 est affichée en fin de procédure pour voir le résultat …


Message édité par Marc L le 03-05-2013 à 21:41:31
n°2188619
sadhya
Posté le 02-05-2013 à 18:03:23  profilanswer
 

Salut Marc L ,  
 
Je suis en pleine compréhension de ton code et même là je vois que tu es vraiment plsu synthétique que moi :) .  
 
Le seul truc que je n'ai pas compris c'est la ligne 12 , Qu'elle est la valeur du nothing j'ai essayé de faire des test pour voir si j'avais compris cette notion en essayant par exemple de prendre non pas les éléments différents mais les éléments présent dans les deux colonnes en écrivant Rg Is True mais là ça me donne une erreur donc je ne pense pas avoir compris la notion du Is Nothing .

n°2188662
Marc L
Posté le 02-05-2013 à 21:55:34  profilanswer
 

 
           En fait rien qu'en consultant l'aide de Find pour un Range et son exemple  (voir aussi Nothing)  …
 
           Cette méthode renvoie un objet Range si elle trouve une correspondance et non pas un booléen.
           Si rien n'est trouvé, la variable objet en retour n'est pas initialisée, donc à nothing

Code :
  1. Sub Demo()
  2.     Dim Rg As Range
  3.     MsgBox Rg Is Nothing
  4. End Sub


Message édité par Marc L le 02-05-2013 à 21:59:36
mood
Publicité
Posté le 02-05-2013 à 21:55:34  profilanswer
 

n°2189112
sadhya
Posté le 06-05-2013 à 15:55:16  profilanswer
 

Salut tous le monde,  
 
Super ça fonctionne très bien merci beaucoup Marc L tu m'a beaucoup aidé durant mon projet et surtout tu m'as beaucoup aidé à comprendre la programmation en vba mais j'ai essayé de rajouter une condition au programme que tu m'avais soumis et ça ne prend pas en compte.  
 
Alors je vous explique la problématique :  
 
Dans la feuille numéro 3 je dois afficher les appareils en retard. Donc je compare premièrement la colonne B de la feuille 1 et 2 pour obtenir tous les éléments en retard mais je me suis rendu compte qu'il fallait rajouter une condition pour rendre ces données justes. Dans la feuille 6 jai les données bruts exportées du logiciel.  
 
La condition : une fois les données stockées en feuille 3 je dois à nouveau comparer les données des colonnes B de la feuille 3 et 6 . Et si il trouve un élément identique à un autre et que la cellule 5 de la feuille 6 est égale à "-" alors il supprime la ligne dans la page 3.
 
 
1) Ca n'effectue aucune ou presqu 'aucune modification au fichier sans condition  
 
2) J'ai remarqué que ça copiait parfois deux fois le même élément  
 
Voici le code  

Code :
  1. Sub bis()
  2. Application.ScreenUpdating = False
  3. Feuil1.Activate
  4. R = 3
  5. X = Rows.Count
  6. Feuil3.Rows("3:" & X).ClearContents
  7.  
  8. For Each Cel In Range("B3", Cells(X, 3).End(xlUp))
  9.     If Cel > "" Then
  10.         Set Rg = Feuil2.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  11.  
  12.         If Rg Is Nothing Then
  13.             Cel.EntireRow.Copy Feuil3.Rows(R)
  14.             If R < X Then R = R + 1 Else Exit For
  15.             End If
  16.         End If
  17.     Next
  18.  
  19. Feuil3.Activate
  20. R = 3
  21. X = Rows.Count
  22. For Each Cel In Range("B3", Cells(X, 3).End(xlUp))
  23.     If Cel > "" Then
  24.         Set Rg = Feuil6.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  25.    
  26.         If (Not Rg Is Nothing) And (Feuil6.Cells(X, 5).Value = "-" ) Then
  27.            
  28.             Cel.EntireRow.Delete
  29.            
  30.             End If
  31.         End If
  32.     Next
  33. Application.ScreenUpdating = True
  34. End Sub


n°2189138
Marc L
Posté le 06-05-2013 à 19:12:20  profilanswer
 

 
           Salut !   J'avoue ma perplexité car dans l'explication précédente, il s'agissait de vider la feuille 1
                        puis de l'alimenter par les lignes de la feuille 2 n'existant pas dans la feuille 3
                        mais là la première boucle vide la feuille 3 puis l'alimente par les lignes de la feuille 1 n'existant pas dans la feuille 2 …
 
           Genre le chat courant après sa queue ! …
           Si c'est une nouvelle procédure, un nouveau sujet créer tu aurais dû !   http://smileys.sur-la-toile.com/repository/Films_et_TV/tete-yoda-3d.gif
 
 
           Au niveau du code de la procédure Bis :
 
         - les lignes n° 20 & 21 ne servent à rien car déjà créées au début de la procédure !
 
         - ligne 22 :  mauvaise conception de boucle pour la suppression !
                           J'ai pourtant insisté sur ce point plusieurs fois dans tes sujets précédents ...   A relire !
 
         - Une méchante erreur en ligne 26 :  la variable X représente la dernière ligne de la feuille ‼
           Littéralement :  si une correspondance est trouvée en feuille 6
                                  et la cellule de la cinquième colonne de la dernière ligne de la feuille 6 est égale à "-" …
 
 
           Encore une fois seule une boucle serait nécessaire car, avant d'écrire dans la feuille 3,
           ne serait-il pas mieux d'effectuer le contrôle dans la feuille 6, non ?
 
           Si doublon il y a dans la copie, doublon il y a dans la source !
           Dans ce cas, ne serait-il pas mieux de vérifier avant de copier ?
 
           Bref cela demande encore de la réflexion, bien tout mettre à plat afin de pouvoir nous exposer clairement tes besoins …


Message édité par Marc L le 06-05-2013 à 19:37:55
n°2189139
sadhya
Posté le 06-05-2013 à 19:21:30  profilanswer
 

Ok Je réfléchis et je reviens vers vous et ce n'est pas un nouveau sujet c'est juste que j'ai affiné la programmation en réunissant toutes mes données dans un seul calsseur je pense que ça sera plus facile de jongler avec des feuilles d'un même classeur plutôt que d'ouvrir et fermer d'autres classeur

n°2189146
sadhya
Posté le 06-05-2013 à 20:36:59  profilanswer
 

Alors là grand désespoir lol je crois que le programme est trop lourd pour excel ça plante, ça me dit qu'excel ne réponds plus ...  
 
Ce que je souhaitais faire au départ c'était comparer les éléments qui sont dans la colonne B des feuilles 1 et 2. Si l'élément est dans la feuille 1 et n'est pas dans la feuille 2 alors la ligne contenant l'élément de la feuille 1 est copié dans la feuille 3.
 
je me suis rendu compte qu'il manquait une condition celle ci  
 
Si (l'élément est dans la feuille 1 et n'est pas dans la feuille 2 ) et  ( l'élément Cel de la feuille 1 est égale à un élément de la feuille 6 à la ligne i) et  ( la colonne 5 de la feuille 6 de la ligne i doit être différente de "-" ) alors la ligne contenant l'élément de la feuille 1 est copié dans la feuille 3.
 
Mon esprit est très très dur je me trouve très complexe quand je développe quelques choses en programmation j'espère que vous allez comprendre ce que j'ai voulu faire voici le code :  
 

Code :
  1. Sub bis()
  2. Application.ScreenUpdating = False
  3. Feuil1.Activate
  4. R = 3
  5. X = Rows.Count
  6. Feuil3.Rows("3:" & X).ClearContents
  7. For Each Cel1 In Range("B3", Cells(X, 3).End(xlUp))
  8.     If Cel1 > "" Then
  9.         Set Rg = Feuil2.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  10.         Feuil6.Activate
  11.         Y = Range("A2" ).End(xlDown).Row
  12.         For i = 3 To Y
  13.             If (Rg Is Nothing) And (Cel = Cells(i, 2)) And (Cells(i, 5) <> "-" ) Then
  14.                 Feuil1.Activate
  15.                 Cel.EntireRow.Copy Feuil3.Rows(R)
  16.                 If R < X Then R = R + 1 Else Exit For
  17.             End If
  18.         Next
  19.     End If
  20. Next
  21. Feuil3.Activate
  22. Application.ScreenUpdating = True
  23. End Sub


n°2189161
Marc L
Posté le 07-05-2013 à 00:27:25  profilanswer
 

  • Activate, comme Select, ralentit l'exécution surtout si on en abuse au sein de boucles …
  • La variable de la boucle en ligne n°7 est Cel1 mais la recherche en ligne 9 est sur Cel qui est donc vide ‼
  • Même problème de variable en ligne n°13 & 15 …   Quand un nom de cellule est modifié, il doit l'être partout !
  • Astuce de puriste (ou d'étourdi) pour éviter ce problème :  Option Explicit  obligeant la définition de chaque variable …
  • La boucle de la ligne n°12 est incongrue car mal placée et de toute manière chronophage !   Tandis que la méthode Find est si rapide …


           Ton raisonnement veut aussi dire qu'une cellule de la feuille 1 inexistante en feuille 6 ne sera pas recopiée dans la feuille 3 …
           Sinon les critères n'ont pas été bien exposés …

Code :
  1. Sub Bis()
  2.     Application.ScreenUpdating = False
  3.     Feuil3.Activate
  4.     R = 3
  5.     X = Rows.Count
  6.     Rows("3:" & X).ClearContents
  7.    
  8.     For Each Cel In Feuil1.Range("B3", Feuil1.Cells(X, 3).End(xlUp))
  9.         If Cel > "" Then
  10.             Set Rg = Feuil2.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  11.    
  12.             If Rg Is Nothing Then
  13.                 With Feuil6.Columns(2)
  14.                     Set Rg = .Find(Cel, , xlValues, xlWhole, , , True)
  15.    
  16.                     If Not Rg Is Nothing Then
  17.                         A = Rg.Address
  18.                         B = True
  19.    
  20.                         Do
  21.                             If Rg.Offset(, 3) = "-" Then B = False: Exit Do
  22.                             Set Rg = .FindNext(Rg)
  23.                         Loop While Not Rg Is Nothing And Rg.Address <> A
  24.    
  25.                         If B Then
  26.                             Cel.EntireRow.Copy Rows(R)
  27.                             If R < X Then R = R + 1 Else Exit For
  28.                         End If
  29.                     End If
  30.                 End With
  31.             End If
  32.         End If
  33.     Next
  34.    
  35.     Application.ScreenUpdating = True
  36. End Sub

           Quand un objet concerne la feuille active, pas besoin de la mentionner.   (exemple ligne n°6)
 
           Dans le cas contraire, il faut obligatoirement préciser la feuille de chaque objet.  (exemple ligne n°8)
 

n°2189990
sadhya
Posté le 13-05-2013 à 18:33:44  profilanswer
 

Bonjour,  
 
Je reviens vers vous parceque le programme que Marc L, me laisse un peu sans voix.  
 
Le programe est bon mais je pense que les informations que je vous ai donné ne sont pas assez conséquentes c'est pour cela je pense que ça ne répond pas à mes attentes.
voici le programme de Marc L :

Code :
  1. Sub RetardDuPmi()
  2.    Application.ScreenUpdating = False
  3.     Feuil3.Activate
  4.     R = 3
  5.     X = Rows.Count
  6.     Rows("3:" & X).ClearContents
  7.  
  8.     For Each Cel In Feuil1.Range("B3", Feuil1.Cells(X, 3).End(xlUp))
  9.         If Cel > "" Then
  10.             Set Rg = Feuil2.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  11.  
  12.             If Rg Is Nothing Then
  13.                 With Feuil6.Columns(2)
  14.                     Set Rg = .Find(Cel, , xlValues, xlWhole, , , True)
  15.  
  16.                     If Not Rg Is Nothing Then
  17.                         A = Rg.Address
  18.                         B = True
  19.  
  20.                         Do
  21.                             If Rg.Offset(, 5) = "-" Then B = False: Exit Do
  22.                             Set Rg = .FindNext(Rg)
  23.                         Loop While Not Rg Is Nothing And Rg.Address <> A
  24.  
  25.                         If B Then
  26.                             Cel.EntireRow.Copy Rows(R)
  27.                             If R < X Then R = R + 1 Else Exit For
  28.                         End If
  29.                     End If
  30.                 End With
  31.             End If
  32.         End If
  33.     Next
  34.     P = Application.Count(Range("A:A" ))
  35.     Cells(P + 3, 1) = "Il y a"
  36.     Cells(P + 3, 2) = P
  37.     Cells(P + 3, 3) = "Interventions en retard du PMI"
  38.     Application.ScreenUpdating = True
  39. End Sub


Les informations complémentaires sont :
1- Pour chaque élément qui se trouve dans la deuxième colonne de la feuille 1 rechercher dans la deuxième colonne de la feuille 2 s'il y a une élément identique
2- Si il y aucun élément de la feuille 2 qui est dans la feuille 1 alors :  
         

  • Rechercher dans la feuille 6 un élément identique à l'élément recherché dans la feuille 2  

       

  • Si il est identique alors vérifier que dans la colonne 5 de la feuille 6 il n'y a pas "-"  

                 

  • Si oui aucune suite  

                 

  • Si non, alors copier toute la ligne de de l'élément en feuille 1 et la coller en feuille 3  


NB : - Dans la feuille 6 il peut y avoir plusieurs fois l'élément, donc si il trouve l'élément 15 fois dans la feuille 6 par exemple il doit vérifier pour les 15 lignes où il y a l'élément si il n'y a pas de "-" si il trouve un élément qui n'a pas dans la colonne 5 de la feuille 6 un "-" alors il peut recopier toute la ligne contenant l'élément en feuille 1.
       - Toutes les cellules en feuille 1 sont obligatoirement en feuille 6 car la feuille 1 est le résultat de manipulation sur la feuille 6
 
J'espère avoir au plus vite de vos nouvelles parce que je comprend vraiment pas ce qu'il se passe parce que j'ai étudié plusieurs foirs le code Marc L et je ne vois pas pourquoi ça ne fait pas ce que ça doit faire .  

n°2190014
Marc L
Posté le 13-05-2013 à 22:11:29  profilanswer
 

 
           Bonsoir,
 
           ça ne fait pas ce que ça doit faire quand le faire est mal exposé …   Et ce n'est vraiment pas compliqué à corriger !
 

Code :
  1. Sub RetardDuPmi()
  2.     Application.ScreenUpdating = False
  3.     Feuil3.Activate
  4.     R = 2
  5.     X = Rows.Count
  6.     Rows("3:" & X).ClearContents
  7.    
  8.     For Each Cel In Feuil1.Range("B3", Feuil1.Cells(X, 3).End(xlUp))
  9.         If Cel > "" Then
  10.             Set Rg = Feuil2.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  11.    
  12.             If Rg Is Nothing Then
  13.                 With Feuil6.Columns(2)
  14.                     Set Rg = .Find(Cel, , xlValues, xlWhole, , , True)
  15.    
  16.                     If Not Rg Is Nothing Then
  17.                         A = Rg.Address
  18.    
  19.                         Do
  20.                             If Rg.Offset(, 5) <> "-" Then
  21.                                 R = R + 1
  22.                                 If R > X Then Exit For Else Cel.EntireRow.Copy Rows(R)
  23.                             End If
  24.    
  25.                             Set Rg = .FindNext(Rg)
  26.                         Loop While Not Rg Is Nothing And Rg.Address <> A
  27.                     End If
  28.                 End With
  29.             End If
  30.         End If
  31.     Next
  32.    
  33.     Cells(IIf(R + 3 > X, X, R + 3), 1) = "Il y a " & R - 2 & " interventions en retard du PMI"
  34.     Application.ScreenUpdating = True
  35. End Sub

 

n°2190017
sadhya
Posté le 13-05-2013 à 22:35:35  profilanswer
 

Salut de la ligne 14 à la ligne 28 je ne suis plus ce que tu fais ... :(  
Et je les testé ça fonctionne pas ... Si tu n'as pas trop compris et que tu souhaite toujours m'aider tu peux me poser des questions concrètes comme nos derniers échanges pour que j'y réponde ...

n°2190018
Marc L
Posté le 13-05-2013 à 22:44:07  profilanswer
 

 
           Je viens de repérer une erreur en ligne n°8 prenant les colonnes B & C au lieu de la colonne B seule …
 
           Correction :   For Each Cel In Feuil1.Range("B3", Feuil1.Cells(X, 2).End(xlUp))
 
           Sinon c'est censé faire comme dans ta dernière description.
 
           Si ce n'est toujours pas bon, vérifier les n° de feuilles, de colonnes, etc … et donner plus de précisions.
 

n°2190023
sadhya
Posté le 13-05-2013 à 23:14:50  profilanswer
 

ce n'est pas bon parce que ça me renvois 361 élément alors que je devrais en avoir 17 et ça recopie l'élément plusieurs fois ce qui doit pas arriver car dans la feuille 6, il peut y avoir plusieurs fois un même élément avec "-" dans la colonne 5 mais ce même élément déjà présent plusieurs fois ne peut avoir qu'une seule ligne ayant une date dans la colonne 5.
 
Mais je viens de réfléchir à une solution qui je pense va être plus facile :  Pour chaque cellule de la colonne B de la feuille 1 on cherche si dans la feuille 2 il y a correspondance.  
 
Si l'élément de la cellule de la colonne B de la feuille 1 ne correspond à aucune des cellules de la colonne B de la feuille 2 alors  
         on cherche d'abord si une cellule de la colonne B de la feuille 1                              correspond à une cellule de la colonne B de la feuille 6
         si oui  alors  
             pour chaque linge de chacun des résultats si la cellule de la colonne 5 = cellule de la colonne B de la feuille 1 alors  
                       on copie la ligne entière contenant la cellule de la colonne B de la feuille 1 dans la feuille 3  
 
 

n°2190030
Marc L
Posté le 14-05-2013 à 00:53:48  profilanswer
 

 
           Là aussi tu aurais pu faire la modification !

Code :
  1. Sub RetardDuPmi()
  2.     Application.ScreenUpdating = False
  3.     Feuil3.Activate
  4.     R = 2
  5.     X = Rows.Count
  6.     Rows("3:" & X).ClearContents
  7.    
  8.     For Each Cel In Feuil1.Range("B3", Feuil1.Cells(X, 2).End(xlUp))
  9.         If Cel > "" Then
  10.             Set Rg = Feuil2.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  11.    
  12.             If Rg Is Nothing Then
  13.                 With Feuil6.Columns(2)
  14.                     Set Rg = .Find(Cel, , xlValues, xlWhole, , , True)
  15.    
  16.                     If Not Rg Is Nothing Then
  17.                         A = Rg.Address
  18.    
  19.                         Do
  20.                             If Rg.Offset(, 3) = Cel Then
  21.                                 R = R + 1
  22.                                 If R < X Then Cel.EntireRow.Copy Rows(R) Else Exit For
  23.                             End If
  24.    
  25.                             Set Rg = .FindNext(Rg)
  26.                         Loop Until Rg.Address = A
  27.                     End If
  28.                 End With
  29.             End If
  30.         End If
  31.     Next
  32.    
  33.     Cells(IIf(R + 3 > X, X, R + 3), 1) = "Il y a " & R - 2 & " interventions en retard du PMI"
  34.     Application.ScreenUpdating = True
  35. End Sub


           En fait je viens de repérer une autre erreur :   comme pour la ligne n°8 où tu as changé le 2 pour un 3,
           tu as fait la même dans la ligne n°20 où tu as modifié mon 3 par un 5 ‼
 
           Évidemment cela ne peut plus fonctionner …  
 
           Voir l'aide d'Offset pour mieux comprendre !   Et à faire avant de modifier des valeurs …


Message édité par Marc L le 14-05-2013 à 01:00:27
n°2190031
sadhya
Posté le 14-05-2013 à 01:06:06  profilanswer
 

Ce que je te demandais est de savoir si la méthode que j'ai décris littéralement correspond à ce que tu avais compris  
 
Parce que je comprend vraiment pas ton code :( là ça renvois zéro intervention ça ne rentre jamais dans le If à la ligne 22  
 
Peux tu m'expliquer stp cette partie  

Code :
  1. If Not Rg Is Nothing Then
  2.                         A = Rg.Address
  3.  
  4.                         Do
  5.                             If Rg.Offset(, 3) = Cel Then
  6.                                 r = r + 1
  7.                                 If r < X Then Cel.EntireRow.Copy Rows(r) Else Exit For
  8.                             End If
  9.  
  10.                             Set Rg = .FindNext(Rg)
  11.                         Loop Until Rg.Address = A
  12.                     End If


 
Ne t'inquiète pas je ne programme peux etre pas comme toi mais j'ai essayé pleins de choses qui renvoyais rien aussi ... As tu compris ma problématique ?


Message édité par sadhya le 14-05-2013 à 01:13:13
n°2190032
Marc L
Posté le 14-05-2013 à 01:13:50  profilanswer
 

 
           ça ne rentre jamais dans le If à la ligne 22 parce que tu as modifié la colonne de comparaison de la ligne n°20 …
 
           Bien recopier mon dernier code et lire l'explication le suivant ...

n°2190038
sadhya
Posté le 14-05-2013 à 04:12:04  profilanswer
 

Marc L j"ai copié collé à l'identique ça ne rentre toujours pas dans le If de la ligne 22, alors j'ai observé et comme mon fichier est vide alors X=0 il y a que les deux premières lignes qui ont du texte.  
 Alors je me suis empressée de changer la condition de la ligne 220 en mettant R>X et toujours rien ....  
J'ai compris l'utilisation de .Offset et effectivement c'est un 3 car on décale de 3 colonnes vers la droite en partant de la deuxième. Mais ça ne fonctionne toujours pas ...

n°2190077
Marc L
Posté le 14-05-2013 à 11:09:47  profilanswer
 

 
          http://smileys.sur-la-toile.com/repository/Messages/panneau-tournant-danger.gif X ne peut être égal à zéro et cela n'a rien à voir avec le contenu de la feuille ‼
 
                        Si tel est vraiment le cas, rien ne sert de poursuivre !
                        Car il s'agirait d'un grave dysfonctionnement de ton PC provenant d'Excel ou de Windows …
 
 
           De mon côté sur deux ordinateurs dotés chacun d'une version différente d'Excel,
           cela fonctionne bien avec mon dernier code et même avec  <> "-"  en ligne n°20 …
 

n°2190116
sadhya
Posté le 14-05-2013 à 15:42:48  profilanswer
 

J'ai aussi essayé sur deux ordinateurs ça me donne toujours le même résultat zéro interventions, ou une interventions ou 89 interventions quand je modifie deux ou trois trucs  le précédent code avec <>'"-" me donne les éléments que l'on avait au début  c'est à dire 89 interventions mais ça ne répond pas à la demande car je te passe le fichier j'ai enlevé toutes les interventions confidentielles tu as juste la périodicité, la date de réalisation , les dates prochaines et les références d'éléments .  
 
Dans l'onglet PMI tu as toutes les interventions qui doivent etre prévues du 1/01/2013 au 1/04/2013 .  Dans l'onglet Interventions réalisées tu as toutes les interventions faites par les techiniciens du 1/01/2012 au 1/04/2013.  Dans l'onglet 6 il y a toutes les interventions des 4 dernières années récupérées sur le logiciel directement. Un appareil peux être présents plusieurs fois. Si un appareil n'a pas de date prochaine dans la feuille 6 c'est qu'il y a eu une nouvelle intervention effectuée sur lui. ça veut dire que même si cette appareil entre dans le Pmi et que l'on réécris sa date prochaine, lors du retard du pmi il faut tenir compte qu'entre temps il a été fais. Et qu'il a une nouvelle date prochaine qui ne rentre pas dans l'intervalle de l'utilisateur.
 
 
Le retard du PMI sont toutes les interventions qui appartiennent à l'onglet 1 et qui n'appartiennent pas à l'onglet 2 ET faut rechercher dans l'onglet 6 si il trouve un élément identique à l'élément sélectionné dans l'onglet 1 si OUI ( je pense que là faudrait mettre deux conditions ) si la cellule de la colonne 5 = Cel ou est diiférent de "-" ETla cellule de la colonne 4 de la ligne séelectionnée dans la feuille 6 est égale à la cellule de la colonne 4 de la ligne sélectionnée dans la feuille 1 ALORS ON COPIE LA LIGNE SELECTIONNE DANS LA FEUILLE 3.
penses tu que c'est une bonne idée ? As tu plus compris mon problème ?  
 
 
Ps : je n'arrive pas à mettre le fichier en pièce jointe pour ce qui le souhaite je vous l'envois directement

n°2190117
sadhya
Posté le 14-05-2013 à 15:46:00  profilanswer
 

Je n'arrive pas à envoyer un message avec une pièce jointe :(


Message édité par sadhya le 14-05-2013 à 15:46:39
n°2190129
Marc L
Posté le 14-05-2013 à 16:09:35  profilanswer
 

 
           Selon où je me trouve, je n'ai pas la possibilité de télécharger par mesures de sécurité.
 
           Et, pas besoin de pièce jointe quand la problématique est bien présentée …
 
           Ce qui est loin d'être le cas car après 12 jours et plus d'une vingtaine d'échanges, boom ,
           un nouveau critère apparaît concernant la colonne 4 !          Il sort d'où, d'un chapeau ?‼
 
           Si un effort de réflexion n'est pas rondement mené avant de présenter un problème, rien de bon ne pourra en sortir !
 
           Je te laisse intégrer cette nouvelle condition en ligne n°20 car tu as tout ce qu'il faut pour le faire
           (les objets Cel & Rg ainsi que la connaissance de la propriété Offset), puis nous publier ton nouveau code …
 

n°2190161
sadhya
Posté le 14-05-2013 à 18:44:42  profilanswer
 

Coucou Marc L,  
 
MEEREEEEEEEERRRRRRRRRCCCCCIIIIIIIIII Franchement wahouw je me croyais pas capable d'aller au bout du tunnel mais les réflexions que tu m'as poussé à avoir tout au long de mon projet m'ont permise d'arriver à ça aujourd'hui.  
 

Citation :

Ce qui est loin d'être le cas car après 12 jours et plus d'une vingtaine d'échanges, boom , un nouveau critère apparaît concernant la colonne 4 !   Il sort d'où, d'un chapeau ?‼

Non bha en faite c'est en réfléchissant je me suis dis voilà ça fonctionne pas en rajoutant des coditions supplémentaires à respecter peux etre que ça fonctionnera ...  
 
Merci de m'avoir permise de découvrir ce nouveau language en somme je garderais de cette programmation qu'il faut d'abord bien connaitre et étudier les commandes astucieuses mises en place dans ce language sans quoi en se calquant sur du déjà vu en C ou en C++ on y arrive pas.  
 
Le code de cette partie :  
 

Code :
  1. Sub RetardDuPmi()
  2.     Application.ScreenUpdating = False
  3.     Feuil3.Activate
  4.     R = 2
  5.     X = Rows.Count
  6.     Rows("3:" & X).ClearContents
  7.  
  8.     For Each Cel In Feuil1.Range("B3", Feuil1.Cells(X, 2).End(xlUp))
  9.         If Cel > "" Then
  10.             Set Rg = Feuil2.Columns(2).Find(Cel, , xlValues, xlWhole, , , True)
  11.  
  12.             If Rg Is Nothing Then
  13.                 With Feuil6.Columns(2)
  14.                     Set Rg = .Find(Cel, , xlValues, xlWhole, , , True)
  15.  
  16.                     If Not Rg Is Nothing Then
  17.                         A = Rg.Address
  18.  
  19.                         Do
  20.                             If (Rg.Offset(, 2) = Cel.Offset(, 2)) And (Rg.Offset(, 3) <> "-" ) Then
  21.                                 R = R + 1
  22.                                 If R > X Then Exit For Else Cel.EntireRow.Copy Rows(R)
  23.                             End If
  24.  
  25.                             Set Rg = .FindNext(Rg)
  26.                         Loop While Not Rg Is Nothing And Rg.Address <> A
  27.                     End If
  28.                 End With
  29.             End If
  30.         End If
  31.     Next
  32.  
  33.     Cells(IIf(R + 3 > X, X, R + 3), 1) = "Il y a " & R - 2 & " interventions en retard du PMI"
  34.     Application.ScreenUpdating = True

n°2190163
Marc L
Posté le 14-05-2013 à 19:43:46  profilanswer
 

 
           Félicitations !
 
           Et je n'ai pas mieux pour la ligne n°20 …
 
           Le primordial est de savoir schématiquement d'où tu pars, où tu veux arriver, quelles sont les étapes intermédiaires …
           C'est un gain de temps énorme et peut éviter en outre l'usine à gaz.
 

mood
Publicité
Posté le   profilanswer
 


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

  Beug de programme

 

Sujets relatifs
Amélioration de programmeAide programme démineur
aide programme fortranProgramme fonctionnant avec proxy et pas sans
[C] A l'aide je ne comprends rien a ce programmeProgramme VBA trouvant une valeur répondant à des conditions ET/OU
SOS VBA Besoin d'aide pour un programmePrintf qui change le résultat d'un programme ??
Programme débutantRe-programmer un logiciel ?
Plus de sujets relatifs à : Beug de programme


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