Modification macro

Résolu
Bonjour, j'ai un petit problème de macro, je m'explique, j'ai réussi à trouver un bout de macro que j'ai modifié :

Dim i As Integer
Dim istart, imax As Integer
Dim istep As Integer
Dim r1, tout As Range

Set tout = Nothing
i = 0
istart = 6
imax = 1331
istep = 4

Application.ScreenUpdating = False

For i = istart To imax Step istep
Set r1 = Range(i & ":" & i)
If tout Is Nothing Then
Set tout = r1
Else
Set tout = Union(tout, r1)
End If
Next

tout.Select

Application.ScreenUpdating = True
' option
'Range("a" & i - istep).Activate

End Sub

Cette maccro me permet de sélection toutes les 6 lignes, la même ligne dans mon fichier pour créer le graphique. Or mon problème désormais est de faire la même chose en sélection une cellule précise, toutes les 6 lignes. Je me doute que je dois gérer en Range, mais étant encore débutant en maccro je suis perdu...

7 réponses

  1. Contributeur
    bonjour, prenant la colonne K comme exemple, je suggère d'essayer ceci:
    Set r1 = Range( "K" & i) 

    0
    1. Merci pour la réponse, cela fonctionne !
      Maintenant je cherche à créer un graphique à partir de cette sélection, mais je n'arrive pas à coder mon graphique pour cette même sélection. j'ai essaie plusieurs choses mais sans grands résultats...Voici le programme actuel :

      Dim i As Integer
      Dim istart, imax As Integer
      Dim istep As Integer
      Dim r1, tout As Range
      Dim MonGraphe As Chart, MaPlage As Range
      Sub Selection()

      Set tout = Nothing
      i = 0
      istart = 6
      imax = 26
      istep = 4

      Application.ScreenUpdating = False

      For i = istart To imax Step istep
      Set r1 = Range("C" & i)
      If tout Is Nothing Then
      Set tout = r1
      Else
      Set tout = Union(tout, r1)
      End If
      Next

      tout.Select

      Set MaPlage = Worksheets("Détails DI").Range(tout).Select
      Set MonGraphe = ThisWorkbook.Charts.Add
      MonGraphe.ChartType = xlColumnStacked100
      MonGraphe.SetSourceData MaPlage, xlColumns
      With MonGraphe.SeriesCollection(5)
      .ChartType = xlXYScatterSmoothNoMarkers
      .AxisGroup = 2
      With .Border
      .Weight = xlMedium
      .LineStyle = xlAutomatic
      .ColorIndex = 4
      End With
      End With
      With MonGraphe
      .HasTitle = True
      With .ChartTitle
      .Characters.Text = "Tech1"
      .Shadow = True
      .Border.Weight = xlHairline
      End With
      With .Axes(xlValue, xlPrimary)
      .HasTitle = True
      .AxisTitle.Characters.Text = "Pourcentage"
      End With
      With .Axes(xlValue, xlSecondary)
      .HasTitle = True
      .AxisTitle.Characters.Text = "Total (hrs)"
      End With
      End With

      End Sub

      Le but n'est pas que vous fassiez mon programme à ma place, mais pouvez vous m'expliquer les différentes étapes à effectuer, que je puisse à l'avenir le faire de moi même ?
      0
      1. Contributeur
        au lieu de:
        tout.Select 
        Set MaPlage = Worksheets("Détails DI").Range(tout).Select

        je suggère:
        Set MaPlage = tout

        Ou bien, encore plus simple, utiliser "tout" au lieu de "MaPlage"
        je te recommande d'éviter les
        .Select
        autant que possible: ils sont presque toujours inutiles, et souvent sources de confusion et d'ennuis.
        connais-tu l'enregistreur de macros? il peut t'aider à comprendre comment automatiser des actions.
        0
    2. Oui j'avais essayé par cette méthode, la programmation qui en découle est plutôt "basique" et ne permets pas de faire ce que je souhaite ^^
      Je vais essayer comme ça
      0
      1. Contributeur
        L'enregistreur de macro est pratique pour découvrir les objets à manipuler. Les programmes générés ainsi sont horribles, bien d'accord.
        0
    3. J'ai suivi votre conseil, à première vue, il me créé bien la graphique avec les données que je souhaite, mais il me reste deux problèmes :
      - j'obtiens un graphique en histogramme, mais je souhaite en courbe
      - les noms d'axes et de titres ne s'affichent pas
      0
      1. de plus, en abscisse de mon graphique je dois mettre des dates à la colonnes A, faut t'ile que je modifie mon code en conséquence avec quelque chose du genre ? :

        Sub Selection()

        Set tout = Nothing
        i = 0
        istart = 6
        imax = 26
        istep = 4

        Application.ScreenUpdating = False

        For i = istart To imax Step istep
        Set r1 = Range("C" & i)
        Set r2 = Range("A" & i)
        If tout Is Nothing Then
        Set tout = r1 + r2
        Else
        Set tout = Union(tout, r1, r2)
        End If
        Next

        tout.Selec
        0
      2. Contributeur
        Je suggère de commencer par ton point #7, et de faire le #6 ensuite.
        Afin de découvrir comment programmer cela, je te suggère de faire les changements à la main, pendant que tu enregistres une macro. Cela te permettra de comprendre comment changer les attributs de ton graphe par VBA.
        0
    4. Ca a pas mal avancé..

      Dim Emplacement As Range
      Dim Grph As ChartObject
      Sub Test()

      Call Selection

      ActiveSheet.Shapes.AddChart2(332, xlLineMarkers).Select
      ActiveChart.SetSourceData Source:=Range( _
      "'Détails DI'!$C$6,'Détails DI'!$A$6,'Détails DI'!$C$10,'Détails DI'!$A$10,'Détails DI'!$C$14,'Détails DI'!$A$14,'Détails DI'!$C$18,'Détails DI'!$A$18,'Détails DI'!$C$22,'Détails DI'!$A$22,'Détails DI'!$C$26,'Détails DI'!$A$26" _
      )
      ActiveChart.Axes(xlValue).MajorGridlines.Select
      ActiveChart.Axes(xlCategory).Select
      ActiveChart.Axes(xlCategory).CategoryType = xlCategoryScale

      With ActiveChart
      .HasTitle = True
      .ChartTitle.Characters.Text = "Testgraph"

      End With
      With Grph
      With .Axes(xlValue, xlPrimary) 'L'erreur se trouve ici

      .HasTitle = True
      .AxisTitle.Characters.Text = "Densité d'occurence"
      End With

      With .Axes(xlCategory, xlPrimary)
      .HasTitle = True
      .AxisTitle.Characters.Text = "Taux de rentabilité"

      End With

      'Définit le premier graphique de la feuille
      Set Grph = Feuil1.ChartObjects(1)
      'Définit la plage de cellule pour positionner le grpahique
      Set Emplacement = Range("A29:I46")

      With Grph
      .Left = Emplacement.Left
      .Top = Emplacement.Top
      .Height = Emplacement.Height
      .Width = Emplacement.Width
      End With
      End With
      End Sub


      Je veux donc créer des noms d'axes, mais l'erreur persiste au niveau de la ligne où j'ai notifié l'erreur
      0
      1. Contributeur
        il suffit peut-être de déplacer la ligne "set grph" avant la première utilisation de grph (donc avant la première ligne "With Grph").
        je te recommande d'éviter les .Select autant que possible: ils sont presque toujours inutiles, et souvent sources de confusion et d'ennuis. également, éviter d'utiliser "active", ActiveSheet, ActiveChart.
        0
      2. @yg_beMalheureusement j'ai réussi à faire fonctionner ma macro sans me passer de "active"...
        un gros problème subsiste :

        ActiveSheet.Shapes.AddChart2(332, xlLineMarkers).Select
        ActiveChart.SetSourceData Source:=Range(tout.Select)
        ActiveChart.Axes(xlValue).MajorGridlines.Select
        ActiveChart.Axes(xlCategory).Select
        ActiveChart.Axes(xlCategory).CategoryType = xlCategoryScale


        cette liste :
        ActiveChart.SetSourceData Source:=Range(tout.Select)


        Je cherche à faire appel à ma plage que je sélectionne avec la macro suivante :

        Sub Selection()

        Set tout = Nothing
        i = 0
        istart = 6
        imax = 26
        istep = 4

        Application.ScreenUpdating = False

        For i = istart To imax Step istep
        Set r1 = Range("C" & i)
        If tout Is Nothing Then
        Set tout = r1
        Else
        Set tout = Union(tout, r1)
        End If

        Set r2 = Range("A" & i)
        If tout Is Nothing Then
        Set tout = r2
        Else
        Set tout = Union(tout, r2)
        End If

        Next

        tout.Select

        End Sub


        Mais actuellement, je n'arrive pas en faisant appel à cette macro, à reporter ma plage
        0
      3. Contributeur
        @Vivi76moi, je ferais ainsi (pas testé):
        au lieu de
        sub selection
        ,
        faire
        function obtenirrange () as range

        dans la fonction, au lieu de
        tout.select
        , faire
        obtenirrange=tout
        (peut-être avec
        set
        devant)
        ensuite, dans sub test,
        tu ajoutes
        dim donnees as range

        au lieu de
        call selection
        , tu fais
        set donnees = obtenirrange()

        et au lieu de
        ActiveChart.SetSourceData Source:=Range(tout.Select)

        tu fais
        ActiveChart.SetSourceData Source:=donnees

        en passant, tu auras supprimé deux "select"!
        0
    5. Merci beaucoup pour votre aide !
      Après quelques modifications et grâce à vos conseils, j'ai obtenu ce que je souhaitais. J'aurais quelques améliorations à apporter mais je verrais plus tard.
      0
      1. Bonjour,
        j'aurais une dernière requête, je cherche à sauvegarder une valeur d'une de mes cellules sur un autre feuille en la copiant sur la dernière cellule vide de ma colonne B.
        Cependant le code que j'ai actuellement ne fonctionne pas et m'affiche 0. Je pense comprendre le problème, je voulais donc détourner ce problème en utilisant ce modèle effectué par l'enregistreur de macro :

        Selection.PasteSpecial Paste:=xlPasteValues 


        Mais je ne sais pas comment l'intégrer dans ma macro actuelle

        Sub Save()

        Dim Source As String
        Dim Cible As String
        Dim LigneEncours As Long

        'Chargement du nom des feuilles origine et destination
        Cible = "feuille1"
        Source = "feuille2"
        'Calcul de la ligne courante
        LigneEncours = Worksheets(Cible).Range("B" & Rows.Count).End(xlUp).Row + 1
        'Copie des valeurs
        With Worksheets(Cible)

        Worksheets(Source).Range("O14").Copy .Range("B" & LigneEncours)

        End With
        End Sub
        0
        1. Contributeur
          il suffit peut-être de faire:
          Worksheets(Cible).Range("B" & LigneEncours) = Worksheets(Source).Range("O14").Value
          0
        2. ça paraît si simple et pourtant j'ai essayer tellement de choses différentes
          0