Beug de programme - VB/VBA/VBS - Programmation
Marsh Posté le 02-05-2013 à 12:21:44
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 ?
Marsh Posté le 02-05-2013 à 15:10:16
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
Marsh Posté le 02-05-2013 à 15:17:32
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 ?
Marsh Posté le 02-05-2013 à 15:19:21
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
Marsh Posté le 02-05-2013 à 15:28:51
Bien, pas de souci ! J'attends de voir la progression de ton code avant de publier le mien …
Marsh Posté le 02-05-2013 à 15:41:13
J'ai regardé la fonction Find
Je pense que je ne l'ai pas trop bien compris
voilà ce que j'ai essayé
Code :
|
Marsh Posté le 02-05-2013 à 16:41:27
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 :
|
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 …
Marsh Posté le 02-05-2013 à 18:03:23
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 .
Marsh Posté le 02-05-2013 à 21:55:34
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 :
|
Marsh Posté le 06-05-2013 à 15:55:16
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 :
|
Marsh Posté le 06-05-2013 à 19:12:20
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û !
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 …
Marsh Posté le 06-05-2013 à 19:21:30
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
Marsh Posté le 06-05-2013 à 20:36:59
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 :
|
Marsh Posté le 07-05-2013 à 00:27:25
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 :
|
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)
Marsh Posté le 13-05-2013 à 18:33:44
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 :
|
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 :
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 .
Marsh Posté le 13-05-2013 à 22:11:29
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 :
|
Marsh Posté le 13-05-2013 à 22:35:35
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 ...
Marsh Posté le 13-05-2013 à 22:44:07
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.
Marsh Posté le 13-05-2013 à 23:14:50
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
Marsh Posté le 14-05-2013 à 00:53:48
Là aussi tu aurais pu faire la modification !
Code :
|
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 …
Marsh Posté le 14-05-2013 à 01:06:06
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 :
|
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 ?
Marsh Posté le 14-05-2013 à 01:13:50
ç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 ...
Marsh Posté le 14-05-2013 à 04:12:04
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 ...
Marsh Posté le 14-05-2013 à 11:09:47
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 …
Marsh Posté le 14-05-2013 à 15:42:48
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
Marsh Posté le 14-05-2013 à 15:46:00
Je n'arrive pas à envoyer un message avec une pièce jointe
Marsh Posté le 14-05-2013 à 16:09:35
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 …
Marsh Posté le 14-05-2013 à 18:44:42
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 :
|
Marsh Posté le 14-05-2013 à 19:43:46
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.
Marsh Posté le 02-05-2013 à 04:14:40
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 .
J'attends vos réponses avec imaptience bisous a vous
Message édité par sadhya le 02-05-2013 à 04:22:15