VBA selection de plusieurs cellules

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

  • Votes
  • Date
  • Date décroissante
  1. 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)
    1. 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...
      1. 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
    2. 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
      1. 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
        1. pour vérifier j'ai unversé plage1 et plage2. Quand je fais cela, seule la plage2 est prise en compte!
        2. 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...
        3. 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...
        4. 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
        5. 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!
      2. 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