Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Worksheet_SelectionChange(ByVal Target As Range)

8 réponses
Avatar
Lulu la Nantaise
Bonjour,
Avec Worksheet_SelectionChange(ByVal Target As Range), Target.adress me
donne l'adresse de la cellule qui vient d'être sélectionnée (celle d'en
dessous de la cellule modifiée après enter par ex).
Est-il possible d'avoir l'adresse de la cellule avant changement ?
Merci
Lulu

8 réponses

Avatar
Daniel.C
Bonjour.
1. dans "thisworkbook :

Private Sub Workbook_Open()
Sheets("Feuil1").Select
Adr = ActiveCell.Address
End Sub

2. dans un mmodule :

Public Adr As String

3. dans le code de Feuil1 :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Adr
'tu mets ici ton code
Adr = Target.Address
End Sub

Cordialement.
Daniel
"Lulu la Nantaise" a écrit dans le message de news:

Bonjour,
Avec Worksheet_SelectionChange(ByVal Target As Range), Target.adress me
donne l'adresse de la cellule qui vient d'être sélectionnée (celle d'en
dessous de la cellule modifiée après enter par ex).
Est-il possible d'avoir l'adresse de la cellule avant changement ?
Merci
Lulu


Avatar
LSteph
Bonjour,

> donne l'adresse de la cellule qui vient d'être sélectionnée

Pas tout à fait, selectionchange n'est pas destiné exclusivement à une
cellule mais à toute la sélection dont l'adresse est visée dans target.
Mais on peut aussi en vouloir uniquement celle de référence
(ton choix...?)

> Est-il possible d'avoir l'adresse

oui, en enregistrant celle qui vient d'être sélectionnée juste avant
pour que cela serve juste après
soit dans une variable soit dans une cellule soit dans un nom du
classeur.

Exemple dans thisworkbook:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
ByVal Target As Range)
On Error Resume Next
MsgBox [zaza]
If [zaza] Is Nothing Then Me.Names.Add "zaza", Sh.Name & "!" &
Target.Address
Me.Names("zaza").RefersTo = Sh.Name & "!" & Target.Address
On Error GoTo 0

End Sub

'lSteph

Lulu la Nantaise a écrit :
Bonjour,
Avec Worksheet_SelectionChange(ByVal Target As Range), Target.adress me
donne l'adresse de la cellule qui vient d'être sélectionnée (celle d'en
dessous de la cellule modifiée après enter par ex).
Est-il possible d'avoir l'adresse de la cellule avant changement ?
Merci
Lulu


Avatar
michdenis
ceci devrait être suffisant :

'Déclaration de la variable dans le haut de ton module feuille
Dim Rg As Range

'Code à copier dans ledit module feuille où l'action se déroule
'----------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Lorsque tu cliques dans la feuille
If Rg Is Nothing Then
If TypeName(Selection) = "Range" Then
Set Rg = Selection
Else
Set Rg = ActiveCell
End If
End If
MsgBox Rg.Address

'ton code

'Mise en mémoire de ta sélection
Set Rg = Target

End Sub
'----------------------------------------



"Lulu la Nantaise" a écrit dans le message de news:

Bonjour,
Avec Worksheet_SelectionChange(ByVal Target As Range), Target.adress me
donne l'adresse de la cellule qui vient d'être sélectionnée (celle d'en
dessous de la cellule modifiée après enter par ex).
Est-il possible d'avoir l'adresse de la cellule avant changement ?
Merci
Lulu
Avatar
LSteph
Suffisant!

dans quel sens... mon exemple était plus court
et tient compte des feuilles!?


michdenis a écrit :
ceci devrait être suffisant :

'Déclaration de la variable dans le haut de ton module feuille
Dim Rg As Range

'Code à copier dans ledit module feuille où l'action se déroule
'----------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Lorsque tu cliques dans la feuille
If Rg Is Nothing Then
If TypeName(Selection) = "Range" Then
Set Rg = Selection
Else
Set Rg = ActiveCell
End If
End If
MsgBox Rg.Address

'ton code

'Mise en mémoire de ta sélection
Set Rg = Target

End Sub
'----------------------------------------



"Lulu la Nantaise" a écrit dans le message de news:

Bonjour,
Avec Worksheet_SelectionChange(ByVal Target As Range), Target.adress me
donne l'adresse de la cellule qui vient d'être sélectionnée (celle d'en
dessous de la cellule modifiée après enter par ex).
Est-il possible d'avoir l'adresse de la cellule avant changement ?
Merci
Lulu



Avatar
michdenis
| dans quel sens... mon exemple était plus court
| et tient compte des feuilles!?

A ) D'abord, "plus court" n'a jamais été un critère obligatoire
pour évaluer une procédure

B ) La demanderesse faisait appel à un événement précis...
toi, tu as conclu que ce serait meilleur si tu utilisais autre chose !
ça c'est ta perception... mais faut quand même répondre au demandeur.

C ) Zaza : Utilisation d'une variable non déclarée

D ) je suppute que ta compréhension de la ligne de code est déficiente !
On Error GoTo 0
Un petit exemple :
si je veux effacer "l'erreur" à la suite de "set sh = ..."
je pourrais choisir : err = 0 ou err.clear
mais si j'utilise On error goto 0, compte combien de boucle
la procédure va effectuer ....
Placer On error goto 0 comme dernière ligne de code ne sert
absolument à rien !
'-----------------------------------
Sub test()
Dim sh As Worksheet
On Error Resume Next
For a = 1 To 2
Set sh = Worksheets("Feuil5" & a)
Err.Clear
'On Error GoTo 0
Next

End Sub
'-----------------------------------

E ) afficher un message où le contenu est vide n'est pas
particulièrement pertinent : MsgBox [zaza] si zaza n'existe pas.

F ) Tu aurais pu créer un nom et le rendre "non accessible" à
l'interface de calcul pour éviter qu'un usager le supprime
en utilisant la propriété "Visible" de l'objet "Name"

Tu as une autre question ?
;-)
Avatar
LSteph
Re, bonjour,

...
> A ) D'abord, "plus court" n'a jamais été

alors ... le "suffisant"..n'est pas utile , "voici une autre façon"
irait bien, il me semble..

> B ) La demanderesse faisait appel à un événement

c'est le même mais outre que j'explique qu'il ne s'applique pas qu'à
une cellule puisqu'elle le connait, j'étends la possibilité à l'ensemble
des feuilles.

> C ) Zaza
Il ne s'agit pas d'une variable mais d'un nom défini!

> D ) je suppute que ta compréhension...
Arrête de supputer je n'ai pas utilisé de boucle et par principe
lorsque j'ai mis un
on error resume next
avant
je mets le
on error goto 0
après....
même si avant le end sub ce n'est pas forcément indispensable.

Salutations.

--
lSteph


michdenis a écrit :
| dans quel sens... mon exemple était plus court
| et tient compte des feuilles!?

A ) D'abord, "plus court" n'a jamais été un critère obligatoire
pour évaluer une procédure

B ) La demanderesse faisait appel à un événement précis...
toi, tu as conclu que ce serait meilleur si tu utilisais autre chose !
ça c'est ta perception... mais faut quand même répondre au demandeur.

C ) Zaza : Utilisation d'une variable non déclarée

D ) je suppute que ta compréhension de la ligne de code est déficiente !
On Error GoTo 0
Un petit exemple :
si je veux effacer "l'erreur" à la suite de "set sh = ..."
je pourrais choisir : err = 0 ou err.clear
mais si j'utilise On error goto 0, compte combien de boucle
la procédure va effectuer ....
Placer On error goto 0 comme dernière ligne de code ne sert
absolument à rien !
'-----------------------------------
Sub test()
Dim sh As Worksheet
On Error Resume Next
For a = 1 To 2
Set sh = Worksheets("Feuil5" & a)
Err.Clear
'On Error GoTo 0
Next

End Sub
'-----------------------------------

E ) afficher un message où le contenu est vide n'est pas
particulièrement pertinent : MsgBox [zaza] si zaza n'existe pas.

F ) Tu aurais pu créer un nom et le rendre "non accessible" à
l'interface de calcul pour éviter qu'un usager le supprime
en utilisant la propriété "Visible" de l'objet "Name"

Tu as une autre question ?
;-)



Avatar
michdenis
...../suite

| > B ) La demanderesse faisait appel à un événement

| c'est le même mais outre que j'explique qu'il ne s'applique pas qu'à
| une cellule puisqu'elle le connait, j'étends la possibilité à l'ensemble
| des feuilles.

***Je n'ai rien contre le fait d'étendre la possibilité... mais cela
n'était pas dans la requête de la demanderesse
ça va .... elle choisira.


| Arrête de supputer je n'ai pas utilisé de boucle et
| par principe lorsque j'ai mis un
| on error resume next
| avant je mets le on error goto 0 après....

Lorsque l'on utilise l'expression "On Error Resume Next" ce
n'est pas pour prendre une assurance contre toute éventualité
de plantage de la part de la procédure. Normalement, on doit
avoir identifié le pourqoui de la nécessité de son utilisation car
on devrait connaître déjà la ligne de code problématique
susceptible de générer une erreur si certaines condtions sont
réunies. Dans l'éventualité que ladite ligne de code provoque
une erreur, si on veux "effacer" cette erreur, on ajoute après
la ligne de code problématique : Err.Clear ou err = 0. Ainsi la
procédure continue...

L'expression "On error goto 0" non seulement efface l'erreur mais
elle inhibe pour tout le reste de la procédure le "On error resume next"
Que ce soit à l'intérieur d'une boucle ou 2 lignes de code distnctes
susceptible de provoquer une erreur, il faudrait alors répéter à chaque
occurrence l'expression "On error resume next" suivi à chaque fois de
On error resume next. Dans certaines circonstances, la chose peut
rendre de fier service !

Cependant, si on place comme dernière ligne de code d'une procédure
"on error goto 0" ... cette dernière est sans effet réel car elle efface
"quelque chose" qui s'efface de lui-même à la fin de la procédure.

Ceci étant dit, tout le monde est libre d'écrire une procédure de la
manière qu'il lui plaît... mais si quelqu'un revendique sa procédure
comme étant la plus courte, le moins qu'il puisse faire pour être
congruent avec sa déclaration est d'enlever le bois mort dans sa
propre procédure.

..../fin.
Avatar
LSteph
> Lorsque l'on utilise l'expression "On Error Resume Next" ce


> n'est pas pour prendre une assurance contre toute éventualité

Justement si je le fais c'est à dessein reprenons:

msgbox [zaza]
If [zaza] Is Nothing Then Me.Names.Add ....

tant que je n'ai pas défini le nom il n'existe pas
en mettant le on error resume next avant
je peux lancer mon message et créer le nom le cas échéant
s'il existe déjà l'erreur saute à la suite

...ensuite
>L'expression "On error goto 0" non seulement efface l'erreur mais
>elle inhibe pour tout le reste de la procédure le "On error resume next"


C'est bien pour cela que j'en ai adopté le principe comme une convention
car effectivement cela habitue à rétablir ensuite la gestion normale des
erreurs et un rien de bois ne me gène pas .. avant un end sub au
regard du contraire, laisser courrir un on error resume next alors
que la gestion des erreurs devrait reprendre sa place.*

> n'était pas dans la requête de la demanderesse
> ça va .... elle choisira.

A sa place je n'aurais plus guère envie de devoir me prononcer. La
qualité de ce débat devient d'un intérêt limité.
Je suis finalement confus de t'avoir fait remarquer que le mot suffisant
ne me semblait pas approprié mais je te suis néanmoins reconnaissant par
certains éléments de nous avoir conduit à apporter des précisions sur
les diverses possibilités, elle aura au moins eu la proposition et des
explications sur ces On error

Malgré tout on peut bien parfois ne pas être d'accord..alors


Salutations amicales quoi qu'il en soit.

--
lSteph


michdenis a écrit :
...../suite

| > B ) La demanderesse faisait appel à un événement

| c'est le même mais outre que j'explique qu'il ne s'applique pas qu'à
| une cellule puisqu'elle le connait, j'étends la possibilité à l'ensemble
| des feuilles.

***Je n'ai rien contre le fait d'étendre la possibilité... mais cela
n'était pas dans la requête de la demanderesse
ça va .... elle choisira.


| Arrête de supputer je n'ai pas utilisé de boucle et
| par principe lorsque j'ai mis un
| on error resume next
| avant je mets le on error goto 0 après....

Lorsque l'on utilise l'expression "On Error Resume Next" ce
n'est pas pour prendre une assurance contre toute éventualité
de plantage de la part de la procédure. Normalement, on doit
avoir identifié le pourqoui de la nécessité de son utilisation car
on devrait connaître déjà la ligne de code problématique
susceptible de générer une erreur si certaines condtions sont
réunies. Dans l'éventualité que ladite ligne de code provoque
une erreur, si on veux "effacer" cette erreur, on ajoute après
la ligne de code problématique : Err.Clear ou err = 0. Ainsi la
procédure continue...

L'expression "On error goto 0" non seulement efface l'erreur mais
elle inhibe pour tout le reste de la procédure le "On error resume next"
Que ce soit à l'intérieur d'une boucle ou 2 lignes de code distnctes
susceptible de provoquer une erreur, il faudrait alors répéter à chaque
occurrence l'expression "On error resume next" suivi à chaque fois de
On error resume next. Dans certaines circonstances, la chose peut
rendre de fier service !

Cependant, si on place comme dernière ligne de code d'une procédure
"on error goto 0" ... cette dernière est sans effet réel car elle efface
"quelque chose" qui s'efface de lui-même à la fin de la procédure.

Ceci étant dit, tout le monde est libre d'écrire une procédure de la
manière qu'il lui plaît... mais si quelqu'un revendique sa procédure
comme étant la plus courte, le moins qu'il puisse faire pour être
congruent avec sa déclaration est d'enlever le bois mort dans sa
propre procédure.

..../fin.