Sélectionner la première cellule non vide d'une ligne
Bonjour à tous,
j'ai créé une macro pour sélectionner la première cellule non vide d'une ligne
Range("J63").End(xlToRight).Select
cela marche très bien (à partir de la colonne J pour la ligne 63,...) . je met un bouton sur la ligne 63 cela indique que c'est cette ligne qui est concernée
mon souhait :
j'ai plus de 200 lignes à faire, j'espère qu'il y a un moyen plus simple que de créer 200 modules + 200 boutons.
je pense plutôt avoir un bouton principale qui agit à partir de la cellule que l'on aura sélectionnée
pouvez vous modifier ce code ou m'en écrire un qui conviendrai
merci de votre aide
eric
Bonjour
J'ai bien cela, mais je ne sais pas pourquoi , cela ne fonctionne pas si la première colonne est chargée... J'ai tout de même dans ce cas comme résultat colonne 2 et non colonne 1???
A voir
Bonjour,
On procède généralement de droite vers gauche ou de bas vers haut si on veut éviter les problèmes que cela peut poser dans l'autre sens...
Mais la question principale n'est pas là : on comprend la nécessité d'aller sélectionner une cellule en travaillant manuellement, mais si on parle de macro, sélectionner devient une absurdité, c'est qu'on trouve que VBA va trop vite sinon et qu'on veut le ralentir !
Et puis autre question : si le remplissage des lignes est variable c'est qu'on n'a pas affaire à un tableau, c'est à dire un groupement de données en lignes réparties dans des champs (colonnes) selon leur nature pour caractériser chaque élément du tableau constitué par une ligne...
Il serait donc bon de dire de quoi il retourne avant toute demande.
Cordialement.
Effectivement je ne suis pas très clair dans le besoin, j'ai rajouté un extrait du fichier sur lequel je travail. c'est de la planif d'atelier.
j'ai besoin que la cellule active aille directement sur la première cellule non vide de la ligne pour que cela me facilite la recherche
si vous testez le fichier vous verrez que cela marche pour chaque puce
ce que je voudrai c'est sélectionner une cellule (par exemple M63 ou Q65) et quand cliquant sur une puce cela m'active la cellule U63 ou U65
je n'ai pris que 3 lignes mais j'en ai plus de 200 à faire (donc un code pour l'intégralité du fichier)
est ce que cela vous aide
eric
Un peu vide... ! (pas de code ?)
j'ai besoin que la cellule active aille directement sur [...]
Pas du tout !
Après, que tu t'imagines que pour atteindre ce résultat, ta cellule active doit etc. ! C'est ton imagination qui travaille...
Cela peut passer par où tu penses [mais j'en doute
Cordialement.
NB- cliquer sur tes puces m'envoie des messages d'erreur...
Bonjour,
J'ai modifié le fichier qui fonctionnait sur notre réseau mais pas en local
maintenant cela devrait aller
dans la macro actuelle, la recherche de la première cellule non vide se fait à partir de la cellule mentionnée en début de code (L63)
je voudrai que cela fonctionne de la même manière sans spécifier la cellule de départ dans le code
cela permettrai de fonctionner à partir de n'importe quelle cellule sélectionnée.
Éric
dans la macro actuelle,
Il n'y a pas de macro dans ton fichier, c'est pourtant facile à voir !
Bizarre, quand je télécharge le fichier elle est présente et fonctionne sur mon pc
pour que tu puisses la tester, voici le code de celle ci
Sub test()
Range("L63").End(xlToRight).Select
End Sub
Je reprends ton code !
Range("L63")
voilà une expression destinée à renvoyer un objet Range, sans référence à la feuille supposée contenir ladite plage, ce que l'on appelle expression non qualifiée ou dépourvue de qualificateur d'objet, code imprécis car il ne vise pas précisément l'objet recherché, il réfère à l'objet Application, à partir duquel VBA cherchera le classeur actif, puis la feuille active dans ce classeur actif, puis la plage ainsi référencée dans cette feuille s'il s'agit d'une feuille de calcul. Ce type de code est toujours susceptible de conduire à des erreurs si le contexte de son exécution se modifie, et quand il n'aboutit pas à une erreur, il est nécessairement plus lent que si l'on indiquait précisément la cible, que VBA n'aurait plus à chercher !
Range("L63").End(xlToRight)
là on va chercher la fin de la plage de la gauche vers la droite à partir de L63... Le problème est que L63 est vide, de même que N63, et jusqu'à T63 première cellule occupée dans le parcours
et c'est donc T63 que va renvoyer End... Il ne me semble pas que c'était ce que l'on cherchait... mais 2e problème toutes les cellules de la lignes sont fusionnées par deux ! On a donc affaire à une ligne à trous !
On cumule donc ici les problèmes de xlToRight et xlDown par rapport à xlToLeft et xlUp, bien connus, et ceux provoqués par les fusions de cellules... Bel embrouillamini
Range("L63").End(xlToRight).Select
: et on Select !
A mes débuts en VBA, l'enregistreur n'avait pas vraiment le vent en poupe et on me disait qu'une macro ça s'écrit... j'ai donc pris sur mon bureau les éléments du langage et j'ai patiemment construit des expressions destinées à être exécutées, on ne m'a jamais dit qu'il fallait sélectionner, je me suis donc contenté d'écrire les actions que j'avais l'intention de réaliser, sans aucun Select puisque ce n'était pas le but, et je ne m'étais jamais posé la question jusqu'à une période relativement récente où sous l'influence de l'enregistreur on voit fleurir un code que je qualifierais d'inepte, bourré de Select et consorts...
inepte
: qui n'a point d'aptitude... qui ne s'adapte pas...
C'est bien tout à fait ça, un code qui ne dispose pas de l'aptitude que devrait lui conférer le langage de programmation référent, n'en disposant pas, il piétine dans le cas particulier et manifeste une incapacité d'abstraction ne lui permettant pas de s'adapter...
Si quelqu'un voit un but au bout de code cité, je l'invite à me le montrer, à me montrer en quoi la situation avant exécution apparaîtra modifiée après exécution... Pour être plus précis, je fais une copie du classeur avant exécution, j'exécute la macro, j'enregistre et ferme... On rouvre les deux classeurs, que vais-je trouver de différent entre les deux ? Si une action a été conduite elle doit laisser des traces et produire une situation modifiée par rapport à ce qu'elle était. Là je ne vois vraiment pas !
Cordialement.
Bonsoir @ tous !
un petit coucou en passant au Maréchal !
Je vous reconnais bien là !
Mais depuis que je suis sur le site, j'essaie (je n'y arrive pas toujours) de ne plus sélectionner !
Pour ce qui est du code VBA, je ne sais comment faire, il n'est pas "facilement" visible chez moi non plus !
Il y a bien un chemin d'accès, qui pointe sur un fichier Excel.B. Je ne maitrise pas les format Excel "binaire" ?
Ensuite pour la feuille y a t il un besoin absolu d'avoir deux cellules pour chaque date ? Ne suffirait-il pas d'élargir ces dernières pour avoir la date en entier ?
Je sais je reprend un peu tout ce qui a été dit au dessus, mais en plus simple, non ?
@ bientôt
LouReeD
Salut LouReed !
Je suis toujours un peu surpris car je trouve tout de même facile de ne pas penser à sélectionner, il suffit de penser ce qu'on veut faire et comme en général on ne sélectionne jamais pour sélectionner (à moins d'être particulièrement tordu) la sélection disparaît au profit de l'action réelle à réaliser !
Ceci étant, lorsqu'on se réfugie derrière une sélection qui n'a aucun sens dans le cas d'espèce pour justement ne pas dire ce que l'on veut faire, c'est un autre cas !
Maintenant, on sait tous que si on cherche une dernière ligne ou une dernière colonne, il est plus rationnel d'utiliser End(xlUp) et End(xlToLeft) pour aboutir à un résultat. Et là la fusion ne pose plus guère de problème, on peut la gérer...
Mais je n'irai pas dans cette foutue cellule
Bonne fin de soirée
moi j'imagine un truc du genre :
trop de colonne, pas envie de scroller horizontal avec la barre pour trouver la cellule vide de la ligne pour y inscrire une donnée.
Du coup on clic sur une cellule de la ligne voulue "visible" et hop le scroll se fait directement sur la cellule vide de cette ligne. On inscrit ce que l'on veut, et clic sur une cellule de la ligne du dessous et hop scroll auto vers la droite ou la gauche pour tomber sur la cellule vide de cette nouvelle ligne, etc...
Du coup remplissage des cellules plus rapide car pas de scroll manuel... Non ?
@ bientôt
LouReeD
Bonjour,
Franchement je ne comprends pas tout ce qui est écrit dans vos réponses. Pour moi cela ne m'a pas fait avancer sur le problème et encore moins trouver la solution. Que j'ai trouvé par ailleurs (à la place de Range("L63") j'ai mis Selection) et mon objectif est atteint.
Je vous remercie tout de même pour avoir passé du temps sur le sujet.
pour répondre sur les 2 cellules pour une même date c'est tout simplement parce qu'il y a des cellules haut dessus qui compilent un certain nombre de données différentes dans chacune d'elle.
cordialement
Éric
Bonjour,
Je t'accorde qu'on a peut-être machinalement interprété la recherche comme celle de la dernière cellule occupée, alors qu'il s'agissait sans doute de la première occupée après L. Dont acte sur ce point !
Pour le reste, si tu ne comprends pas mes réponses, je te le retourne en disant que je ne comprends pas la question !
On va essayer de dire les choses le plus simplement possible :
1) Je n'écris aucun code dans lequel figure Select ou Selection, etc. (liste non exhaustive), sauf en fin de macro, après avoir réalisé l'action prévue, si cela est justifié pour pouvoir en mettre le résultat sous les yeux de l'utilisateur. Je ne vais donc pas commencer maintenant !
2) Pourquoi ? Parce que lorsqu'on sélectionne, on se déplace ! Si on se déplace, c'est pour accomplir une action à l'endroit où l'on veut aller (sinon pourquoi y aller). Or, se déplacer pour accomplir une action est totalement inutile et inefficace, ce n'est que du temps perdu (et au sens propre puisque ces manoeuvres ne font que ralentir VBA).
Un critère de bon code est de ne jamais se déplacer pour agir, et c'est encore mieux si on agit sur une feuille non visible !
Donc, me demandant d'écrire un code merdique, contraire à ma philosophie en la matière, je ne le fais naturellement pas, et je n'en suis nullement désolé.
La seule chose que je peux regretter c'est que tu soies incapable de le comprendre, mais n'ayant aucune influence sur tes connexions neuronales je ne puis qu'en prendre acte et souhaiter que cela puisse changer un jour...
3) Demander un déplacement assorti d'une action, on peut traiter l'action en éliminant le déplacement et ainsi répondre à la question de façon correcte.
Demander un déplacement sans aucune action au terme, c'est purement gratuit, je considère qu'il n'y a alors tout simplement pas de question !
Cas qui pourrait être litigieux : se déplacer pour agir manuellement ! Il convient alors de toute façon de cerner l'action manuelle envisagée afin de lui substituer des modalités de saisie (Userform par exemple) qui permettront d'opérer à l'emplacement voulu sans déplacement aucun...
Dans la mesure où cela se heurte à un refus de ta part, je n'ai rien à en dire mais aucune réponse qui me convienne non plus à apporter. Donc pas de réponse de ma part !
Cordialement.