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

243cellule-non-vide.xlsm (19.83 Ko)

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 ! Parce que la sélection en macro ça ne sert que pour 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

63test.xlsm (13.50 Ko)

Un peu vide... ! (pas de code ?)

j'ai besoin que la cellule active aille directement sur [...]

Pas du tout ! La seule chose dont tu as besoin, c'est d'obtenir le résultat final que tu attends, [dont nous, ne savons rien jusqu'ici].

Après, que tu t'imagines que pour atteindre ce résultat, ta cellule active doit etc. ! C'est ton imagination qui travaille... il faut aborder les questions sans idée préconçue...

Cela peut passer par où tu penses [mais j'en doute s'agissant de sélectionner...] ou ailleurs, il peut n'y avoir qu'une seule réponse comme une multitude... Il convient de cerner le résultat ultime attendu (objectif atteint, tout s'arrête !) et ne pas bloquer l'émergence de réponses en mettant des barrières préalables, ni fermer des chemins qui pourraient y conduire...

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

84test.xlsm (12.74 Ko)

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 ! Ce sera donc toujours la première cellule occupée après L qui sera renvoyée... Si les cellules N, P, R, T et suivantes de la ligne 63 sont occupées, N63 sera systématiquement renvoyée.

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 ! Y a-t-il une commande plus absurde ? Je ne le crois pas ! Quand je travaille en manuel, je sélectionne naturellement car je n'ai que ce moyen pour communiquer avec Excel... quand je termine une action en VBA et qu'il s'agit d'en mettre le résultat sous les yeux de l'utilisateur, j'active ou sélectionne les éléments utiles pour ce faire, mais c'est alors une action en soi, pour présenter ce qui a été fait, et qui est alors fini. Derrière la macro s'arrête !

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 ! Témoin un fichier genre rébus dont on ne peut tirer aucune indication.

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 tant que je ne sais pas pourquoi !

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.

Rechercher des sujets similaires à "selectionner premiere vide ligne"