| |||||||||||||||||||||||||||||||||||||
bonjour a tous Sub suivante() 'Anti scintillement 'insert une ligne en 1998 Const Col As String = "G" 'colonne de Travail désirée, ici colonne G
End If End Sub
ps peu t on envoyer un fichier joint et comment | |||||||||||||||||||||||||||||||||||||
Publicité | |||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||
Astucien | Bonsoir, C'est effectivement un peu brouillon , et quelques éléments me laissent dubitatif. Un fichier ne serait pas de trop pour éviter des interprétations erronées. Utiliser http://www.cjoint.com et mettre le lien dans un prochain post. | ||||||||||||||||||||||||||||||||||||
bonjour ferrand je te joins un fichier et te remerci pour ta réponse http://cjoint.com/?0Ewf6y2BgDg
bonne journée A+ aiglon74 | |||||||||||||||||||||||||||||||||||||
Astucien | Bonjour, Pas encore eu le temps de plonger dans le détail de ton fichier. La situation me paraît cependant assez confuse. D'abord, dans la mesure où il s'agit d'un modèle où presque toutes les données sont numériques, il s'agit de savoir quel est le type de données qui figure en réalité dans ta base. A préciser. D'autre part, tu disais au départ que ta macro fonctionnait, certes elle fait quelque chose mais je n'ai pas le sentiment qu'elle fait exactement ce qui était prévu... Il serait d'ailleurs bien que tu indiques le fonctionnement global de ton projet, pour avoir une vue précise de ce qui doit être ! Nous avons un classeur avec une feuille "Base", et 3 feuilles destinées rspectivement à entrer une nouvelle référence, rechercher et supprimer (cette dernière masquée, avec macro manquante affectée à la forme ovale). Les deux autres disposent aussi d'une forme avec macro attachée. Mais en outre on a (éditeur VBA) mention d'un bouton (et d'un ComboBox) qui ne figurent nulle part, dont la macro lancée au clic se balade sur un module standard (ce qui n'est pas sa place), une fonction 'recherche' sans utilisation, du code qui se balade hors procédure. Au premier survol, l'ensemble paraît donc assez chaotique. Je vais voir si j'arrive à m'y retrouver dans la macro... | ||||||||||||||||||||||||||||||||||||
Astucien | Je crois que j'ai à peu près reconstitué ce qui se passait ! J'y reviens plus tard. | ||||||||||||||||||||||||||||||||||||
bonjour , type de donné
en feuille base je récupère les données de la feuille nouvelle référence ou je doit pouvoir efface une ligne en recherchant son emplacement et la macro "suivante "me servirait de passer d'une ligne a l'autre celle qui on les mêmes
je joins mon fichier réel
A+ aiglon74 | |||||||||||||||||||||||||||||||||||||
Astucien | Re, Voyons la macro 'suivante', sur laquelle la question est posée (à partir du modèle) - elle désactive la mise à jour de l'affichage (mais pas de réactivation en fin d'opération, ce qui serait logique) et inhibe les actions liées aux évènements (on ne voit pas pourquoi, vu qu'il n'y a aucune évènementielle) - elle affecte à une variable (non déclarée) la valeur de B12 (feuille recherche) - active la feuille base (non nécessaire, sous réserve de qualifier les références d'objets dans le code) - initie une boucle sur les cellules B5 à B6000 (feuille base), y recherche la valeur A (=B12 [feuille recherche]) A ce stade, il faut noter qu'il y a dans le fichier modèle 6 lignes qui répondent à la condition (valeur de la colonne B = variable A (B12) = 1) : les lignes 13 à 15 et 1995 à 1997), situation qui résulte certainement d'une exécution antérieure de la macro). Notons les valeurs de la colonne G pour ces 6 lignes (AA suivi d'un nombre) : pour les lignes 13à 15 : 15, 14, 1 ; pour les autres : 16, 4, 23. Nous somme dans les actions suivantes au 1er tour de la boucle. - si trouvée (au 1er tour : ce sera donc ligne 13), elle copie la ligne pour l'insérer en position 1998 (?), et supprime la ligne initiale (l'insertion se retrouve donc en ligne 1997) - déclare une constante pour désigner la colonne (inutile) et un variable de type long (déclarations en milieu de procédure, pas à leur place) - introduit un gestionnaire destiné à masquer les erreurs susceptibles de survenir (aïe !) - la variable précédemment déclarée est destinée à recueillir le numéro de la dernière ligne de la base (en colonne G) en utilisant la méthode Find (c'est atypique...) : cependant une erreur 91 survient sur cette ligne (le gestionnaire fait passer outre)... - la commande suivante : suppression des lignes pour lesquelles la colonne G est vide, dont on s'attendrait à ce qu'elle ne soit pas exécutée, l'est ! (je suis encore surpris par VBA , malgré l'erreur, la procédure continue (normal) avec la valeur de la dernière ligne (1997) affectée à la variable (oh ! malgré l'erreur) et malgré le fait que la lettre G soit portée à la place du numéro de colonne (7) On noterait donc à l'issue de ce 1er tour que les 6 lignes précitées se retrouve aux positions 13 à 18 : les numéros en colonnes G étant successivement 14, 1, 16, 4, 23, 15, soit la succession initiale (mais en lignes consécutives) le 15 étant passé de la première position à la dernière. Rien aux lignes 1995 à 1997. Je n'aurais pas parié sur l'exécution conforme de la procédure dans ces conditions, mais elle s'exécute bien ! - Mais le 1er tour n'est pas terminé, il se poursuit par l'activation de la feuille 'recherche' (on se demande pourquoi) avant de passer au tour suivant. - Au 2e tour, la procédure reprend sur la ligne suivante répondant à la condition (ligne 14) mais la feuille active n'est plus Base, donc la ligne insérée en 1998 va y rester, les lignes vides intermédiaires n'étant plus supprimées (si la feuille recherche n'était pas protégée, son contenu serait d'ailleurs effacé puisqu'il s'agit de la feuille active). On obtient donc en colonne G, aux lignes 13 à 17 les valeurs 14, 16, 4, 23, 15 ; et 1 en ligne 1997 (qui occupait la ligne 14 au tour précédent). - 3e tour, ligne suivante répondant à la condition = ligne 15. On obtient (en G) ligne 13 à 16 : 14, 16, 23, 15 ; et 1 en ligne 1996, 4 (antérieurement en 15) en ligne 1997. - 4e tour, ligne suivante répondant à la condition = ligne 16. On obtient ligne 13 à 15 : 14, 16, 23 ; et 1 en ligne 1995, 4 en 1996 et 15 (en 16 au tour précédent) en 1997. - 5e tour, ligne suivante répondant à la condition = ligne 1995. Les ligne 13 à 15 ne bougent plus ; les lignes 1995 à 1997 deviennent 4, 15, 1 (le 1 antérieurement en 1995 est repassé en fin de trio). - 6e tour, ligne suivante répondant à la condition = ligne 1996. Les lignes 1995 à 1997 deviennent : 4, 1, 15 (le 15 était antérieurement en 1996). - 7e tour, ligne suivante répondant à la condition = ligne 1997. Le 15, alors en 1997, est déplacé pour y revenir. Plus d'autre ligne répondant à la condition, cela ne bougera donc plus. Il ne semble pas que ce résultat soit exactement la situation recherchée. La procédure a pour effet de regrouper les lignes ayant la même valeur en col. B, comme on le note au 1er tour, dans le contexte spécifique du modèle. Ensuite, les choses dévient en raison de l'absence de qualificateurs (déjà signalée) et du fait qu'on procède à des suppressions dans une boucle croissante (on le fait toujours dans une boucle décroissante pour éviter que des lignes soient inévitablement ignorées si la boucle est croissante). Avant de se lancer dans des rectifications, il est indispensable d'établir ce que doit être le résultat final de cette procédure : simple regroupement comme aperçu ? à quel endroit ? quel est l'objet de la recherche ? (pour regrouper, un simple tri suffirait).
Excuse-moi mais pour moi l'objectif n'est pas clair ! | ||||||||||||||||||||||||||||||||||||
bonsoir l'objectif et de ma recherche la valeur b12 d12 f12 h12 en feuille recherche réf allez le chercher en feuille base puis l'afficher le résultat en feuille recherche réf e17 résultat étant G en feuille base
au lieu d'appuyer sur le bouton suivante pour passer a la ligne suivante qui correspond a la recherche je voudrais appuyer sur enter idéal serait d'avoir un message qui me dirait 1er solution sur X 2eme solution sur X ECT..
A+ aiglon74
| |||||||||||||||||||||||||||||||||||||
Astucien | A quoi donc sert la formule en E17 alors ? Je ne vois pas de rapport avec ce que fait la macro ! Que veut dire 'passer à la ligne suivante' ? La macro ne fait rien de la sorte ! Et que sont ces différentes solutions qui apparaissent pour la première fois ? Je comprends de moins en moins ce que tu veux ! Quant à vouloir lancer une macro avec la touche Entrée, tu oublies ! Une macro peut se lancer manuellement avec la boîte macro, en la sélectionnant puis clic sur Exécuter (ou touche Entrée puisque ce bouton est sélectionné par défaut), ou par une combinaison de touche que tu définis, ou en l'attachant à un bouton ou autre contrôle, ou en faisant en sorte qu'elle se lance toute seule à partir d'un évènement. Pour l'instant, ce qui serait bien, serait de savoir quel doit être le résultat de l'exécution de la macro : quelle modification elle apporte à la feuille base ? Et qu'est-ce qu'elle doit faire apparaître ou modifier sur la feuille recherche ? Dans le détail autant que possible. | ||||||||||||||||||||||||||||||||||||
Astucien | Il me semble avoir compris ce que tu peux rechercher, en examinant ton fichier "réel". Quelque chose comme ça peut-être ? Si c'est le cas, pas besoin de macros, on l'obtient avec des formules. | ||||||||||||||||||||||||||||||||||||
bonjour ferrand
ta solution te mettre tous les emplacements sur la même ligne ok je vais réfléchir a la formule mille merci pour ton aide A+ aiglon74
| |||||||||||||||||||||||||||||||||||||
Astucien | Bonjour, Voilà mes suggestions pour ton fichier (à l'exception de la procédure d'impression que je n'ai pas du tout regardée). Côté formules - Pour la recherche par références : • en A17 : =SI(BASE!J1<>"";SOMMEPROD(--(BASE!F:F=BASE!J1));0) elle calcule le nombre de références correspondant à la demande. • en B16 : =SI(COLONNE()-2<$A$17;EQUIV(BASE!$J$1;DECALER(BASE!$F:$F;A16;;6000);0)+A16;"") qui définit la ligne où se trouve le premier emplacement correspondant à la demande dans la base. • en C17 : =SI(B16<>"";INDEX(BASE!$G:$G;B16);"") affiche le premier emplacement détecté. Les cellules H17 à J17 ne sont pas pré-mises en forme : se mettront en forme par MFC s'il y a lieu (si le nombre d'emplacements dépasse 5). Pour la recherche par emplacement : Modifications proposées pour alléger formules antérieures et inhiber l'affichage de valeurs d'erreur. • en A12 : =SIERREUR(EQUIV(E17;BASE!G:G;0);"") renvoie le numéro de ligne de l'emplacement dans la base. • en B12 : =SI($A$12<>"";INDIRECT("BASE!"&CAR(COLONNE()/2+65)&$A$12);"") renvoie la référence "désignation" de l'emplacement. Même aménagement des formules pour la suppression emplacement. Côté macros - Un peu de nettoyage et de remise en ordre. Remplacement des diverses macros de déplacement vers les feuilles et retour par une seule. Cette macro est affectée à tous les "boutons" concernés (elle définit le bouton l'ayant appelé pour agir en conséquence). Les "boutons" ont été renommés à cette fin de façon que le numéro d'ordre inclus dans le nom soit 1 à 4 pour chacune des 4 feuilles appelables et 5 pour tous les boutons "retour". Macro de suppression allégée + message pour faire confirmer avant exécution. Macro d'enregistrement de nouvelles références également allégée + tri de la base sur la colonne emplacement après chaque insertion. Activation de la feuille d'accueil à l'ouverture du classeur. L'allègement a consisté à expurger tout le code superflu issu principalement de l'enregistrement de macros (sélections et activations à répétition, éviter généralement le copier-coller au profit d'autres méthodes, etc.) La remise en ordre porte, elle, sur la mise en forme du code : déclaration des variables, et en tête de procédure, indentations systématiques pour faciliter la lecture, etc. A noter que toutes les macros (très peu nombreuses) pourraient être regroupées sur un même module... Bonne utilisation. http://cjoint.com/?EExqHzRBT3n
Modifié par ferrand le 23/05/2015 16:35 | ||||||||||||||||||||||||||||||||||||
Bonjour,
impressionné milles mercis pour ce cour EXCEL tes explications tip top tout fonctionne a merveille
A+ aiglon74
| |||||||||||||||||||||||||||||||||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | ||||||||||||||||||
|