Modification macro

Résolu
Vivi76 -  
 Vivi76 -
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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, prenant la colonne K comme exemple, je suggère d'essayer ceci:
    Set r1 = Range( "K" & i) 

    0
  2. Vivi76
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  3. Vivi76
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  4. Vivi76
     
    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. Vivi76
       
      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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Vivi76
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
      1. Vivi76 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Malheureusement 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
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Vivi76
         
        moi, 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
  7. Vivi76
     
    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
  8. Vivi76
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      il suffit peut-être de faire:
      Worksheets(Cible).Range("B" & LigneEncours) = Worksheets(Source).Range("O14").Value
      0
    2. Vivi76
       
      ça paraît si simple et pourtant j'ai essayer tellement de choses différentes
      0