OVH Cloud OVH Cloud

Plages de cellule dans code VBA

10 réponses
Avatar
aife1
Bonjour à tous et à toutes !!

J'ai une petite question à poser (sûrement très simple pour vous, mais pas
pour moi).
Dans le code d'une feuille qui exécute par le changement des cellules A2:A4,
début du code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Sh As Shape, R As Variant, S As Object
If Not Intersect(Target, Range("A2:A4") Is Nothing Then
bla bla bla

Si je veux que le code s'exécute par plusieurs plages de cellules, comme
A2:A4; A7:A9 ..., comment je peux faire ? Sachant que je ne veux pas que le
code s'exécute sur toute la colonne A, mais que sur plusieurs plages
déterminées.

Si vous avez une idée, s'il vous plait aidez-moi ...

Merci d'avance à vous !!!

Salutations

10 réponses

Avatar
Daniel.M
Salut,


If Not Intersect(Target, _
Union(Range("A2:A4"), Range("A7:A9"), Range("A103:A122")) _
Is Nothing Then


Meilleur que :

If Not Intersect(Target, Range("A2:A4, A7:A9, A103:A22") Is Nothing Then

qui plante de façon intermittente.

Salutations,

Daniel M.

"aife1" wrote in message
news:%
Bonjour à tous et à toutes !!

J'ai une petite question à poser (sûrement très simple pour vous, mais pas
pour moi).
Dans le code d'une feuille qui exécute par le changement des cellules A2:A4,
début du code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Sh As Shape, R As Variant, S As Object
If Not Intersect(Target, Range("A2:A4") Is Nothing Then
bla bla bla

Si je veux que le code s'exécute par plusieurs plages de cellules, comme
A2:A4; A7:A9 ..., comment je peux faire ? Sachant que je ne veux pas que le
code s'exécute sur toute la colonne A, mais que sur plusieurs plages
déterminées.

Si vous avez une idée, s'il vous plait aidez-moi ...

Merci d'avance à vous !!!

Salutations




Avatar
michdenis
Bonjour Aife1,

As-tu essayé quelque chose dans le genre : En supposant que j'ai compris ta demande !

'----------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'Attention, ne pas donner le même nom à variable
'déjà existante dans ton code !

Dim Arr(), Rg As Range
'Tu définis toutes les plages que tu désires
Arr = Array("A2:A4", "A7:A9", "A11:A15")

For Each elt In Arr
Set Rg = Intersect(Target, Range(elt))
If Not Rg Is Nothing Then
With Rg
'Ton code pour la plage de cellules

End With
End If
Next
Set Rg = Nothing

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


Salutations!



"aife1" a écrit dans le message de news:%
Bonjour à tous et à toutes !!

J'ai une petite question à poser (sûrement très simple pour vous, mais pas
pour moi).
Dans le code d'une feuille qui exécute par le changement des cellules A2:A4,
début du code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Sh As Shape, R As Variant, S As Object
If Not Intersect(Target, Range("A2:A4") Is Nothing Then
bla bla bla

Si je veux que le code s'exécute par plusieurs plages de cellules, comme
A2:A4; A7:A9 ..., comment je peux faire ? Sachant que je ne veux pas que le
code s'exécute sur toute la colonne A, mais que sur plusieurs plages
déterminées.

Si vous avez une idée, s'il vous plait aidez-moi ...

Merci d'avance à vous !!!

Salutations
Avatar
Michel Gaboly
Bonsoir,

Tu peux également sélectionner en même temps tes différentes plages
dans la feuille et leur associer un nom unique, "PlageMulti" par exemple.

Tu pourras ensuite te référer ainsi à l'ensemble :

Range("PlageMulti")

L'avantage est que le code est + concis, mais surtout qu'en cas d'insertion/
suppression de cellules dans la feuille, le nom continuera à être associé
aux "bonnes" plages, ce qui ne serait pas le cas avec des références
comme A2:A4, A7:A9...




Salut,

If Not Intersect(Target, _
Union(Range("A2:A4"), Range("A7:A9"), Range("A103:A122")) _
Is Nothing Then

Meilleur que :

If Not Intersect(Target, Range("A2:A4, A7:A9, A103:A22") Is Nothing Then

qui plante de façon intermittente.

Salutations,

Daniel M.

"aife1" wrote in message
news:%
Bonjour à tous et à toutes !!

J'ai une petite question à poser (sûrement très simple pour vous, mais pas
pour moi).
Dans le code d'une feuille qui exécute par le changement des cellules A2:A4,
début du code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Sh As Shape, R As Variant, S As Object
If Not Intersect(Target, Range("A2:A4") Is Nothing Then
bla bla bla

Si je veux que le code s'exécute par plusieurs plages de cellules, comme
A2:A4; A7:A9 ..., comment je peux faire ? Sachant que je ne veux pas que le
code s'exécute sur toute la colonne A, mais que sur plusieurs plages
déterminées.

Si vous avez une idée, s'il vous plait aidez-moi ...

Merci d'avance à vous !!!

Salutations





--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
aife1
Bonjour et merci à vous !!

Daniel, lorsque je mets ton code, ça me met "Erreur de compilation : erreur
de syntaxe", mais merci de ton aide.

MichDenis, je pense que tu as très bien compris ma demande (tu dois être
habitué à me déchiffrer à force !!!), mais comme tu l'a souligné, le nom de
variable est déjà existant, et là je suis perdue ...

Mais ça ne fait rien, car Michel Gaboly a trouvé une solution, et qui plus
est elle est très simple à mettre en place ! Merci Michel !!

Encore merci à vous tous de vous donner tant de mal (peut-être pas tant que
ça finalement ... je rigole) pour m'aider, et aussi toutes les autres
personnes qui sont sur ce forum. Vous êtes tous géniaux !!!

Amicalement


"aife1" a écrit dans le message de
news:%
Bonjour à tous et à toutes !!

J'ai une petite question à poser (sûrement très simple pour vous, mais pas
pour moi).
Dans le code d'une feuille qui exécute par le changement des cellules
A2:A4,

début du code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Sh As Shape, R As Variant, S As Object
If Not Intersect(Target, Range("A2:A4") Is Nothing Then
bla bla bla

Si je veux que le code s'exécute par plusieurs plages de cellules, comme
A2:A4; A7:A9 ..., comment je peux faire ? Sachant que je ne veux pas que
le

code s'exécute sur toute la colonne A, mais que sur plusieurs plages
déterminées.

Si vous avez une idée, s'il vous plait aidez-moi ...

Merci d'avance à vous !!!

Salutations




Avatar
Daniel.M
Salut Michel,

Bien d'accord. L'utilisation de NOMS est une façon (sous-utilisée?) qui
contribue à se pencher sur une bonne structuration des données (en plus d'éviter
les impacts au code VBA tel que tu l'as mentionné).

Salutations,

Daniel M.

"Michel Gaboly" wrote in message
news:
Bonsoir,

Tu peux également sélectionner en même temps tes différentes plages
dans la feuille et leur associer un nom unique, "PlageMulti" par exemple.

Tu pourras ensuite te référer ainsi à l'ensemble :

Range("PlageMulti")

L'avantage est que le code est + concis, mais surtout qu'en cas d'insertion/
suppression de cellules dans la feuille, le nom continuera à être associé
aux "bonnes" plages, ce qui ne serait pas le cas avec des références
comme A2:A4, A7:A9...



Avatar
Daniel.M

Daniel, lorsque je mets ton code, ça me met "Erreur de compilation : erreur
de syntaxe", mais merci de ton aide.


Il manquait une parenthèse :

If Not Intersect(Target, _
Union(Range("A2:A4"), Range("A7:A9"), Range("A103:A122"))) _
Is Nothing Then

Mais comme tu l'as constaté, il vaut mieux de définir un NOM dans ce cas (comme
Michel te l'a suggéré).

Salutations,

Daniel M.

Avatar
jps
salut daniel,
je dois figurer dans ton carnet d'adresses (comme dans celui de cet autre
grand absent de bdafonseca) car tu m'as fait le grand honneur de m'envoyer
cet adorable petite chose du nom de W32.Netsky.T
comment as-tu su que c'était mon anniversaire...de mariage?
jps

"Daniel.M" a écrit dans le message de
news:

Daniel, lorsque je mets ton code, ça me met "Erreur de compilation :
erreur


de syntaxe", mais merci de ton aide.


Il manquait une parenthèse :

If Not Intersect(Target, _
Union(Range("A2:A4"), Range("A7:A9"), Range("A103:A122"))) _
Is Nothing Then

Mais comme tu l'as constaté, il vaut mieux de définir un NOM dans ce cas
(comme

Michel te l'a suggéré).

Salutations,

Daniel M.





Avatar
Michel Gaboly
Bonsoir,

De rien, c'était avec plaisir ;-))

Comme le confirme Daniel, les noms sont sous-employés. On peut en
effet leur associer des formules, ce qui en augmente considérablement
la puissance.

Par exemple en matière de paye, certaines cotisations sont plafonnées :

Si le salaire brut dépasse le plafond, la base de cotisation est limitée
à ce plafond. Si le salaire brut est inférieur au plafond, la base de coti-
sation est égale au brut.

Cette base s'appelle la Tranche A et est utilisée sur plusieurs lignes
d'un bulletin de paye

Plus de détails ici :

http://www.gaboly.com/Excel/ChargesSociales.html

Pour faire un bulletin de paye sous Excel, on peut bien sûr utiliser
une formule dans une ou plusieurs cellules pour calculer cette tranche.

Mais on peut aussi utiliser des noms :

En nommant "Brut" la cellule contenant le salaire brut, et en associant
le nom "Plafond" à la valeur du plafond pour l'année, on peut définir le
nom "TrancheA" comme faisant référence à

=MIN(Brut;Plafond)

La formule est dans la définition du nom et non dans une cellule.

Dans toutes les cellules où on a besoin de faire apparaître la Tranche A, il
suffit d'employer la formule

=TrancheA

On gagne ainsi en lisibilité et en simplicité.


Et on peut faire des choses bien + complexes avec les noms ;-))))



Bonjour et merci à vous !!

Daniel, lorsque je mets ton code, ça me met "Erreur de compilation : erreur
de syntaxe", mais merci de ton aide.

MichDenis, je pense que tu as très bien compris ma demande (tu dois être
habitué à me déchiffrer à force !!!), mais comme tu l'a souligné, le nom de
variable est déjà existant, et là je suis perdue ...

Mais ça ne fait rien, car Michel Gaboly a trouvé une solution, et qui plus
est elle est très simple à mettre en place ! Merci Michel !!

Encore merci à vous tous de vous donner tant de mal (peut-être pas tant que
ça finalement ... je rigole) pour m'aider, et aussi toutes les autres
personnes qui sont sur ce forum. Vous êtes tous géniaux !!!

Amicalement

"aife1" a écrit dans le message de
news:%
Bonjour à tous et à toutes !!

J'ai une petite question à poser (sûrement très simple pour vous, mais pas
pour moi).
Dans le code d'une feuille qui exécute par le changement des cellules
A2:A4,

début du code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Sh As Shape, R As Variant, S As Object
If Not Intersect(Target, Range("A2:A4") Is Nothing Then
bla bla bla

Si je veux que le code s'exécute par plusieurs plages de cellules, comme
A2:A4; A7:A9 ..., comment je peux faire ? Sachant que je ne veux pas que
le

code s'exécute sur toute la colonne A, mais que sur plusieurs plages
déterminées.

Si vous avez une idée, s'il vous plait aidez-moi ...

Merci d'avance à vous !!!

Salutations





--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
Daniel.M
JPS,

?!!?

C'est pas W32.Netsky.T, c'est Whisky, et tu en as trop pris :-))

Suite en bal perso.

Daniel M. (et bon anniversaire quand même :-) )

"jps" wrote in message
news:u%23H$
salut daniel,
je dois figurer dans ton carnet d'adresses (comme dans celui de cet autre
grand absent de bdafonseca) car tu m'as fait le grand honneur de m'envoyer
cet adorable petite chose du nom de W32.Netsky.T
comment as-tu su que c'était mon anniversaire...de mariage?
jps


Avatar
sabatier
:-))))))
jps (qui pense que overdose de whisky vaut bien 10000 NAV)

"Daniel.M" a écrit dans le message de
news:%2347$
JPS,

?!!?

C'est pas W32.Netsky.T, c'est Whisky, et tu en as trop pris :-))

Suite en bal perso.

Daniel M. (et bon anniversaire quand même :-) )

"jps" wrote in message
news:u%23H$
salut daniel,
je dois figurer dans ton carnet d'adresses (comme dans celui de cet
autre


grand absent de bdafonseca) car tu m'as fait le grand honneur de
m'envoyer


cet adorable petite chose du nom de W32.Netsky.T
comment as-tu su que c'était mon anniversaire...de mariage?
jps