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
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
A voir également:
- Vba sélectionner plusieurs cellules
- Formule excel pour additionner plusieurs cellules - Guide
- Verrouiller cellules excel - Guide
- Excel compter cellule couleur sans vba - Guide
- Find vba - Astuces et Solutions
- Excel concatener plusieurs cellules - Guide
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
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...):
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)
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...
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...
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
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
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
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
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
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
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
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"
il te donne bien l'adresse de l'union des 2 plages...
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...
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...
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...
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
Modifié par Decapsuleur le 4/10/2010 à 16:47
Sans avoir testé, essaye un truc du genre :
EDIT : Va voir ce lien à partir de la page 39
Charts(nomgraph1).SeriesCollection(1).XValues = serie1_axeX .Address
EDIT : Va voir ce lien à partir de la page 39
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!
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!
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
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
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