VBA selection de plusieurs cellules

StagiaireVBA -  
Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Decapsuleur Messages postés 50 Statut Membre 48
     
    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
  2. StagiaireVBA
     
    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
    1. Decapsuleur Messages postés 50 Statut Membre 48
       
      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
  3. StagiaireVBA
     
    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
  4. StagiaireVBA
     
    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
    1. StagiaireVBA
       
      pour vérifier j'ai unversé plage1 et plage2. Quand je fais cela, seule la plage2 est prise en compte!
      0
    2. Decapsuleur Messages postés 50 Statut Membre 48
       
      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
    3. StagiaireVBA
       
      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
    4. Decapsuleur Messages postés 50 Statut Membre 48
       
      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
    5. StagiaireVBA
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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