VBA selection de plusieurs cellules

Fermé
StagiaireVBA - 4 oct. 2010 à 12:59
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 4 oct. 2010 à 18:54
Bonjour,

Je travaille actuellement beaucoup avec des graphiques sous excel, crées grace à VBA.

Jusqu'a présent, pour selectionner mes plages de cellules j'utilisais la sub suivante :

Sub plages_donnees(feuille, Base_serie1, serie1, base_serie1_axeX, serie1_axeX, base_serie1_titre, serie1_titre, Base_serie2, serie2, base_serie2_axeX, serie2_axeX, base_serie2_titre, serie2_titre)
Dim i As Integer
Dim Cellule As Range

Sheets(feuille).Activate
Set Cellule = Sheets(feuille).Range(base_serie1_axeX)
Cellule.Activate
NbIndic = 0

For i = 1 To 17

If IsEmpty(ActiveCell) = False Then NbIndic = NbIndic + 1
ActiveCell.Offset(1, 0).Activate

Next i

Sheets(feuille).Range(Base_serie1).Activate
Set serie1 = Sheets(feuille).Range(ActiveCell, ActiveCell.Offset(NbIndic - 1, 0))

Sheets(feuille).Range(base_serie1_axeX).Activate
Set serie1_axeX = Sheets(feuille).Range(ActiveCell, ActiveCell.Offset(NbIndic - 1, 0))

Sheets(feuille).Range(Base_serie2).Activate
Set serie2 = Sheets(feuille).Range(ActiveCell, ActiveCell.Offset(NbIndic - 1, 0))

Sheets(feuille).Range(base_serie2_axeX).Activate
Set serie2_axeX = serie1_axeX

End Sub


cela convenait parfaitement car mes series 1 et deux correspondaient a des cellules qui se suivaient dans une meme colonne.

Mais maitenant j'ai besoin de mettre de plages de cellules dans une meme serie. Par exemple :

serie1 serie2 suite serie1 suiteserie2
a z d v
z s v f
e s s h

j'ai essayé ainsi :

Sub plages_donnees_composees(feuille, Base_serie1, serie1, base_serie1_axeX, serie1_axeX, base_serie1_titre, serie1_titre, Base_serie2, serie2, base_serie2_axeX, serie2_axeX, base_serie2_titre, serie2_titre)
Dim i As Integer
Dim Cellule As Range

Sheets(feuille).Activate
Set Cellule = Sheets(feuille).Range(base_serie1_axeX)
Cellule.Activate
NbIndic = 0

For i = 1 To 17

If IsEmpty(ActiveCell) = False Then NbIndic = NbIndic + 1
ActiveCell.Offset(1, 0).Activate

Next i

Sheets(feuille).Range(Base_serie1).Activate
plage1 = Range(ActiveCell, ActiveCell.Offset(NbIndic - 1, 0))
Sheets(feuille).Range(Base_serie1L).Activate
plage2 = Range(Base_serie1L, Cells(Base_serie1L).Offset(NbIndic - 1, 0))
Set serie1 = Sheets(feuille).Range(plage1:plage2) (...)

mais la ligne (Set serie1 = Sheets(feuille).Range(plage1:plage2) )

se met en rouge et j'ai le message suivant :

"Attendu : separateur de liste ou )"


Qulequ'un aurait il une idée??

merci d'avance!





5 réponses

Decapsuleur Messages postés 40 Date d'inscription mercredi 11 août 2010 Statut Membre Dernière intervention 9 novembre 2010 46
4 oct. 2010 à 13:06
Bonjour,
Je ne sais pas trop pourquoi cela ne fonctionne pas, mais je te propose une piste de solution (peut être...):
Dim Plage1 As Range, Plage2 as Range, Serie1 As Range
.........
Sheets(feuille).Range(Base_serie1).Activate 
Plage1 = Range(ActiveCell, ActiveCell.Offset(NbIndic - 1, 0)) 
Sheets(feuille).Range(Base_serie1L).Activate 
Plage2 = Range(Base_serie1L, Cells(Base_serie1L).Offset(NbIndic - 1, 0)) 
Set Serie1 = Union(Plage1, Plage2)
0
StagiaireVBA
4 oct. 2010 à 13:34
Bonjour Decapsuleur,

D'abord, merci de t'interesser à mon cas!

jai essayé ce que tu m'a dit et modifiant deux trois trucs :

Sub plages_donnees_composees(feuille, Base_serie1, Serie1, base_serie1_axeX, serie1_axeX, base_serie1_titre, serie1_titre, Base_serie2, serie2, base_serie2_axeX, serie2_axeX, base_serie2_titre, serie2_titre, Base_serie1L, serie1L, base_serie1L_axeX, serie1L_axeX, base_serie1L_titre, serie1L_titre, Base_serie2L, serie2L, base_serie2L_axeX, serie2L_axeX, base_serie2L_titre, serie2L_titre)
Dim i As Integer
Dim Cellule As Range

Sheets(feuille).Activate
Set Cellule = Sheets(feuille).Range(base_serie1_axeX)
Cellule.Activate
NbIndic = 0

For i = 1 To 17

If IsEmpty(ActiveCell) = False Then NbIndic = NbIndic + 1
ActiveCell.Offset(1, 0).Activate

Next i

Sheets(feuille).Range(Base_serie1).Activate
Plage1 = Range(ActiveCell, ActiveCell.Offset(4, 0))
Sheets(feuille).Range(Base_serie1L).Activate
Plage2 = Range(ActiveCell, ActiveCell.Offset(3, 0))
Set Serie1 = Union(Plage1, Plage2)

Sheets(feuille).Range(base_serie1_axeX).Activate
Plage3 = Range(ActiveCell, ActiveCell.Offset(4, 0))
Sheets(feuille).Range(base_serie1L_axeX).Activate
Plage3 = Range(ActiveCell, ActiveCell.Offset(3, 0))
Set serie1_axeX = Union(Plage1, Plage2)

Sheets(feuille).Range(Base_serie2).Activate
Plage5 = Range(ActiveCell, ActiveCell.Offset(4, 0))
Sheets(feuille).Range(Base_serie2L).Activate
Plage6 = Range(ActiveCell, ActiveCell.Offset(3, 0))
Set serie2 = Union(Plage1, Plage2)

Sheets(feuille).Range(base_serie2_axeX).Activate
Plage7 = Range(ActiveCell, ActiveCell.Offset(4, 0))
Sheets(feuille).Range(base_serie2L_axeX).Activate
Plage8 = Range(ActiveCell, ActiveCell.Offset(3, 0))
Set serie2 = Union(Plage1, Plage2)



End Sub


comme je fait des test, jai fixé les offset et la boucle for ne sert donc a rien dans l'immédiat.

Dans la version ci-dessu j'ai l'erreur suivante :

"Objet requis" a la ligne Set Serie1 = Union(Plage1, Plage2) pourtant plage1 et plage deux correspondent respectivement à Variant/Variant(1 to 5, 1 to 1) et à Variant/Variant(1 to 4, 1 to 1)

Si je rajoute en haut

Dim Plage1 As Range, Plage2 as Range

l'erreur se fait a la ligne Plage1 = Range(ActiveCell, ActiveCell.Offset(4, 0)), ou j'ai le message "variable de bloc with non définie"

Au pire j'ai la solution de secour d'aller copier coller mes plages les unes en dessous des autres puis d'utiliser la meme sub qu'au tout début...
0
Decapsuleur Messages postés 40 Date d'inscription mercredi 11 août 2010 Statut Membre Dernière intervention 9 novembre 2010 46
4 oct. 2010 à 13:42
Oui en effet, j'ai lu une discussion à ce propos. Tu déclares ta variable Range, mais après il faut la "créer" . regarde un peu ce test :

Sub test()
Dim Plage1 As Range
'Plage1 = Range(ActiveCell, ActiveCell.Offset(4, 0)) 'ne fonctionne pas
Set Plage1 = Range(ActiveCell, ActiveCell.Offset(4, 0))
MsgBox Plage1.Address
End Sub
0
StagiaireVBA
4 oct. 2010 à 14:20
c'est donc le set qui change tout?

j'ai essayé avec le set et ca a l'air defonctionné. J'ai maintenant quelques bug dans la sub qui crée le graph mais ca doit etre du a des modifs que j'ai faites ailleurs.

merci beaucoup en tout cas
0
StagiaireVBA
4 oct. 2010 à 14:43
tout compte fait jai encore un soucis!

le union(lpage1,plage2) ne prend en compte que la première plage... Alors que plage1 et plage2 sont correctement remplies!


Sub plages_donnees_composees(feuille, Base_serie1, Serie1, base_serie1_axeX, serie1_axeX, base_serie1_titre, serie1_titre, Base_serie2, serie2, base_serie2_axeX, serie2_axeX, base_serie2_titre, serie2_titre, Base_serie1L, serie1L, base_serie1L_axeX, serie1L_axeX, base_serie1L_titre, serie1L_titre, Base_serie2L, serie2L, base_serie2L_axeX, serie2L_axeX, base_serie2L_titre, serie2L_titre)
Dim i As Integer
Dim Cellule As Range

Sheets(feuille).Activate
Set Cellule = Sheets(feuille).Range(base_serie1_axeX)
Cellule.Activate
NbIndic = 0

For i = 1 To 17

If IsEmpty(ActiveCell) = False Then NbIndic = NbIndic + 1
ActiveCell.Offset(1, 0).Activate

Next i

Sheets(feuille).Range(Base_serie1).Activate
Set Plage1 = Range(ActiveCell, ActiveCell.Offset(2, 0))
Sheets(feuille).Range(Base_serie1L).Activate
Set Plage2 = Range(ActiveCell, ActiveCell.Offset(12, 0))
Set Serie1 = Union(Plage1, Plage2)

Sheets(feuille).Range(base_serie1_axeX).Activate
Set Plage3 = Range(ActiveCell, ActiveCell.Offset(2, 0))
Sheets(feuille).Range(base_serie1L_axeX).Activate
Set Plage4 = Range(ActiveCell, ActiveCell.Offset(12, 0))
Set serie1_axeX = Union(Plage3, Plage4)

Sheets(feuille).Range(Base_serie2).Activate
Set Plage5 = Range(ActiveCell, ActiveCell.Offset(2, 0))
Sheets(feuille).Range(Base_serie2L).Activate
Set Plage6 = Range(ActiveCell, ActiveCell.Offset(12, 0))
Set serie2 = Union(Plage5, Plage6)

Sheets(feuille).Range(base_serie2_axeX).Activate
Set Plage7 = Range(ActiveCell, ActiveCell.Offset(2, 0))
Sheets(feuille).Range(base_serie2L_axeX).Activate
Set Plage8 = Range(ActiveCell, ActiveCell.Offset(12, 0))
Set serie = Union(Plage7, Plage8)



End Sub
0
StagiaireVBA
4 oct. 2010 à 14:49
pour vérifier j'ai unversé plage1 et plage2. Quand je fais cela, seule la plage2 est prise en compte!
0
Decapsuleur Messages postés 40 Date d'inscription mercredi 11 août 2010 Statut Membre Dernière intervention 9 novembre 2010 46
4 oct. 2010 à 15:24
Je pense que le problème ne vient pas du code que tu as mis ci-dessus, mais de la suite, lorsque tu créées le graph.
En effet, fais ce test : Ajouter dans ton code un MsgBox indiquant l'adresse du Range "serie"
Sheets(feuille).Range(base_serie2_axeX).Activate 
Set Plage7 = Range(ActiveCell, ActiveCell.Offset(2, 0)) 
Sheets(feuille).Range(base_serie2L_axeX).Activate 
Set Plage8 = Range(ActiveCell, ActiveCell.Offset(12, 0)) 
Set serie = Union(Plage7, Plage8) 
MsgBox serie.Address


il te donne bien l'adresse de l'union des 2 plages...
0
StagiaireVBA
4 oct. 2010 à 15:40
effectivement, l'adresse renvoyée à l'air bonne, c'est juste moi qui ne sais pas me servir des espions, je n'arrive pas a voir toutes les valeurs... et dant count, il y a le nombre d'élément de la première plage...

je ne peux pas encore vérifier sur le graph puisque la sub suivante ne fonctionne pas :

Sub Graph_comparaison(maquette, feuille, titre_graph, Serie1, serie1_axeX, serie1_titre, serie2, serie2_axeX, serie2_titre, Position_Graph, mini, max, nomgraph, nomgraph1)

Application.ScreenUpdating = False

ActiveWindow.Visible = False
Windows(maquette).Activate
Charts.Add
nomgraph1 = ActiveChart.Name
ActiveChart.Visible = False

Charts(nomgraph1).ApplyCustomType ChartType:=xlUserDefined, TypeName:="comparaison"
Charts(nomgraph1).SetSourceData source:=Sheets(feuille).Range("AG11:AG20"), PlotBy _
:=xlColumns

Charts(nomgraph1).SeriesCollection.NewSeries
Charts(nomgraph1).SeriesCollection.NewSeries
Charts(nomgraph1).SeriesCollection(1).XValues = serie1_axeX
Charts(nomgraph1).SeriesCollection(1).Values = Serie1
Charts(nomgraph1).SeriesCollection(1).Name = serie1_titre
Charts(nomgraph1).SeriesCollection(2).XValues = serie2_axeX
Charts(nomgraph1).SeriesCollection(2).Values = serie2
Charts(nomgraph1).SeriesCollection(2).Name = serie2_titre
Charts(nomgraph1).SeriesCollection(3).Delete

With Charts(nomgraph1)
.HasTitle = True
.ChartTitle.Characters.Text = titre_graph
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
.Axes(xlValue).TickLabels.NumberFormat = "General"
End With

Application.ScreenUpdating = False

Charts(nomgraph1).Location Where:=xlLocationAsNewSheet
'nomgraph = Right(Charts(nomgraph1).Name, Len(Charts(nomgraph1).Name) - Len(Charts(nomgraph1).Name) - 1)

'NbGraph = Feuil1.ChartObjects.Count 'compte le nombre de graphiques dans la feuille
'le nouveau graphique correspond à l'index le plus élevé

Sheets(nomgraph1).Visible = True
Sheets(nomgraph1).Activate
Call Creer_bouton


Sheets(nomgraph1).Select

ActiveChart.ChartTitle.Select


Selection.AutoScaleFont = False
With Selection.Font
.Name = "Verdana"
.FontStyle = "Gras"
.Size = 8
End With

Sheets(nomgraph1).Legend.Select
Selection.AutoScaleFont = False


With Selection.Font
.Name = "Verdana"
.FontStyle = "Normal"
.Size = 8
End With

End Sub


j'ai l'erreure "impossible de definir la propriété XValues de la classe series"

pourtant, c'est exactement la meme sub que j'utilise pour mes autres graph (ceux pour les quels je n'ai pas besoin d'aditionner deux plages) et elle fonctionne très bien...
0
Decapsuleur Messages postés 40 Date d'inscription mercredi 11 août 2010 Statut Membre Dernière intervention 9 novembre 2010 46
Modifié par Decapsuleur le 4/10/2010 à 16:47
Sans avoir testé, essaye un truc du genre :

Charts(nomgraph1).SeriesCollection(1).XValues = serie1_axeX .Address


EDIT : Va voir ce lien à partir de la page 39
0
StagiaireVBA
4 oct. 2010 à 17:14
merci, ca fonctionne pour cette ligne, enfin je n'ai plus l'erreur en tout cas, mais ca ne fonctionne pas pour la ligne suivante!! jai de nouveau la meme erreur...

j'ai un peu de mal avec la logique du VBA!

ma sub fonctionnait sans le .Address quand javais des plages de données simples...
et maintenant ca fonctionne un coup sur deux!

en tout cas merci de ta patience!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
4 oct. 2010 à 18:54
Bonjour,

Si comme ton pseudo l'indique, tu est en stage VBA, voici deux conseils qui éviteront de nombreuses questions :
- prend la bonne habitude d'utiliser systématiquement Option Explicit en début de module, cela limite les problèmes liés à la portée des variables.
- évite d'effectuer des actions inutiles qui alourdissent le code, rendent sa compréhension difficile, occupent inutilement de la place mémoire et ralentissent l'exécution de la macro (en l'occurrence évite les .Activate et l'utilisation d'ActiveCell lorsque que ce n'est pas nécessaire).

Patrice
0