Problème création graphique plage variable

Résolu
Bonjour,

Je rédige un nouveau post qui fait suite à mon précédent.
Je n'avais obtenue aucune réponse et entre temps j'ai réussi à avancer mais je suis maintenant bloqué pour la création du graphe avec la sélection de la plage de données.

Ma macro va chercher à l'aide de la méthode find, la dernière colonne utile pour réaliser mon graphe et descend jusqu'à l'avant dernière cellule non vide ce qui me permet de définir la dernière case de ma plage de données.

Or je souhaite maintenant définir la plage de la cellule A1 à ma dernière définit juste avant mais le code Range("A1:Lastcell") ne fonctionne pas, il me renvoie une erreur

Si vous pouviez me sortir de cette situation, merci de votre aide.

Fichier excel : http://www.cjoint.com/c/GFoiTTT3Uky

Sub graph()
'
' graphe Macro
'

'

Dim grph1 As Worksheet
Dim grph2 As Worksheet
Dim grph3 As Worksheet

Dim i As Integer
Dim y As Integer
Dim z As Integer

Dim Cpt As Integer
Dim Cpy As Integer
Dim Cpu As Integer
Dim CptSh As Integer
Cpt = 0
CptSh = Sheets.Count
For i = 1 To CptSh
If Sheets(i).Name <> "graphique phase 1" Then Cpt = Cpt + 1 Else Exit For
Next i

If Cpt = CptSh Then
Sheets.Add After:=Sheets("synthese")
ActiveSheet.Name = "graphique phase 1"
End If

Cpy = 0
CptSh = Sheets.Count
For y = 1 To CptSh
If Sheets(y).Name <> "graphique phase 2" Then Cpy = Cpy + 1 Else Exit For
Next y

If Cpy = CptSh Then
Sheets.Add After:=Sheets("graphique phase 1")
ActiveSheet.Name = "graphique phase 2"
End If

Cpu = 0
CptSh = Sheets.Count
For u = 1 To CptSh
If Sheets(u).Name <> "graphique phase 3" Then Cpu = Cpu + 1 Else Exit For
Next u

If Cpu = CptSh Then
Sheets.Add After:=Sheets("graphique phase 2")
ActiveSheet.Name = "graphique phase 3"
End If

Dim R1 As Range 'déclare la variable R1 (Recherche 1)
Dim R2 As Range 'déclare la variable R2 (Recherche 2)
Dim R3 As Range 'déclare la variable R2 (Recherche 3)
Dim R4 As Range 'déclare la variable R2 (Recherche 4)
Dim R5 As Range 'déclare la variable R2 (Recherche 5)
Dim R6 As Range 'déclare la variable R2 (Recherche 6)
Dim COL As Integer 'déclare la variable COL (COLonne)
Dim COL2 As Integer 'déclare la variable COL2 (COLonne 2)
Dim COL3 As Integer 'déclare la variable COL3 (COLonne 3)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim Lastcell As Range

Dim courbe1 As Range

Sheets("resultat").Select

Set R1 = Sheets("resultat").Rows(1).Find("Mph1", , xlValues, xlWhole)
If Not R1 Is Nothing Then 'condition : si au moins une occurrence est trouvée
COL = R1.Column 'définit la colonne COL de la première occurrence trouvée
DL = Sheets("resultat").Cells(Application.Rows.Count, COL).End(xlUp).Offset(-1, 0).Row 'définit la dernière ligne éditée DL de la colonne COL de l'onget OND
End If 'fin de la condition

Set Lastcell = Cells(DL, COL)

Set courbe1 = Range("A1:Lastcell") ' la méthode range de l'objet global à échoué

'Lastcell me renvoie la valeur correspondante à ma dernière case voulue pour faire ma plage

Worksheets("graphique phase 1").Shapes.AddChart2(227, xlLineMarkers).Select
ActiveChart.SetSourceData Source:=Range("resultat!courbe1")

End Sub

9 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour

    Essaies ceci
    DL = Sheets("resultat").Cells(Rows.Count, col).End(xlUp).Row - 1
    Set Lastcell = Cells(DL, col)
    Set courbe1 = Range("A1:" & Lastcell.Address)

    Cdlmnt
    1. Bonjour ccm81,

      je viens d'essayer avec le code donné.
      Une erreur intervient lors de la dernière ligne,
      Je pense ne pas utiliser les bonnes formules pour créer mon graphique

      Si vous pouviez m'indiquez la démarche à suivre, merci

      Cordialement


      Dim R1 As Range 'déclare la variable R1 (Recherche 1)

      Dim COL As Integer 'déclare la variable COL (COLonne)

      Dim DL As Long 'déclare la variable DL (Dernière Ligne)
      Dim Lastcell As Range

      Dim courbe1 As Range

      Sheets("resultat").Select
      Set R1 = Sheets("resultat").Rows(1).Find("Mph1", , xlValues, xlWhole)
      If Not R1 Is Nothing Then 'condition : si au moins une occurrence est trouvée
      COL = R1.Column 'définit la colonne COL de la première occurrence trouvée
      DL = Sheets("resultat").Cells(Application.Rows.Count, COL).End(xlUp).Offset(-1, 0).Row 'définit la dernière ligne éditée DL de la colonne COL de l'onget OND

      End If 'fin de la condition

      Set Lastcell = Cells(DL, COL)
      Set courbe1 = Range("A1:" & Lastcell.Address)

      Worksheets("graphique phase 1").Shapes.AddChart2(227, xlLineMarkers).Select
      Sheets("resulat").SetSourceData Source:=Range("resultat!courbe1") ' Erreur dernière ligne méthode Range de l'objet global a échoué

      End Sub
  2. Contributeur
    Bonjour

    Lorsque tu copies un code dans ton message, merci de le coller entre balise


    j'ai omis de télécharger ton classeur
    Dim Col As Byte, Dl As Integer
    Dim Courbe1 As Range

    With Sheets("resultat")
    If Application.CountIf(.Rows(1), "Mph1") = 0 Then GoTo inconnu
    Col = .Rows(1).Find(what:="Mph1", After:=.range("A1").Column
    Dl = .Columns(Col).Find(what:="*", searchdirection:=xlPrevious).Row
    Set Courbe1 = .Range(.Cells(1, 1), .Cells(Dl, Col))
    End With
    'la suite du code......

    Exit Sub
    'gestionaire errereur
    inconnu:
    MsgBox "mth1 inconnu", vbCritical

    End Sub


    Edit: 14h37

    petites modif après consultation du classeur

    Bonjour CCm excuse moi je n'avais pas rafraichi


     Michel
    1. Bonjour michel_m ,

      Désolé ce sera fait dorénavant merci.

      A propos de votre message, pourquoi me recommandez vous de remplacer mon code par la votre ? Je débute sur VBA et j'imagine bien que mes macros crée à partir de code trouver sur le net sois horrible pour des habitués du codage VBA.

      Je cherche simplement à comprendre ce qui ne va pas.

      Merci de votre aide

      Cordialement
    2. Contributeur
      @Wazzidma proposition corrige tes erreurs: a toi de plancher un peu pour comprendre et progresser
    3. @michel_mJ'ai rajouté l'Offset qui manquait sur ton code afin de bien avoir la bonne dernière cellule pour ma plage de données de mon graphe.

      Mais j'obtiens la même erreur à la derniere ligne pour la création du graphe.

      Je vois bien que mon code pour créer un graphe ne va pas et les lignes de codes utilisés par l'enregistreur de macro de ne vont pas non plus.

      Est ce seulement le range qui ne va pas ou toute la structure du code concernant la création du graphe qui ne convient pas ?

      Merci de ton aide
      Cordialement

      Dim Col As Byte, Dl As Integer
      Dim Courbe1 As Range

      With Sheets("resultat")
      If Application.CountIf(.Rows(1), "Mph1") = 0 Then GoTo inconnu
      Col = .Rows(1).Find(What:="Mph1", After:=Range("A1")).Column
      Dl = .Columns(Col).Find(What:="*", searchdirection:=xlPrevious).Offset(-1, 0).Row
      Set Courbe1 = .Range(.Cells(1, 1), .Cells(Dl, Col))
      End With

      Set Lastcell = Cells(Dl, Col)
      Set Courbe1 = Range("A1:" & Lastcell.Address)
      Worksheets("graphique phase 1").Shapes.AddChart2(227, xlLineMarkers).Select
      Sheets("resultat").SetSourceData Source:=Range("courbe1") ' Erreur derniere ligne méthode Range de l'objet global a échoué

      Exit Sub
      'gestionaire errereur
      inconnu:
      MsgBox "mth1 inconnu", vbCritical

      End Sub
  3. Essaies ceci

    Set Lastcell = Sheets("resultat").Cells(DL, COL)
    Set courbe1 = Sheets("resultat").Range("A1:" & Lastcell.Address)
    Sheets("graphique phase 1").Select
    Charts.Add
    ActiveChart.ChartType = xlLineMarkers
    ActiveChart.SetSourceData Source:=courbe1
    ActiveChart.Location Where:=xlLocationAsObject, Name:="graphique phase 1"


    > michel. ça va ? et aucun pb pour l'incruste, bien au contraire ...

    Cdlmnt
    1. Bonjour, ccm81

      Merci beaucoup ! Ça marche !!

      c'est parfait, me reste plus qu'à voir comment arranger les axes du graphiques et créer les deux autres graphiques restants.

      Merci encore, je reviendrai sûrement vous sollicitez si je n'y arrive pas du tout.

      Bonne journée
      Cordialement,
  4. tes plages sont déjà des "Range"
    essaies ceci
    Set courbe2 =Union(plage_valeur2, plage_AD)
    1. c'est la même que celle que j'ai essayé juste au dessus non ?

      Set courbe2 = Sheets("resulat").Union(plage_valeur2, plage_AD) 


      Edit : à non ça marche en enlevant le sheets("resultat") ...
    2. Eh oui ...
      J'aurai certainement du écrire
      tes plages sont déjà des "Range" de la feuille "resultat"
  5. Contributeur
    Bonjour
    offset s'applique à une cellule (range) et non à un entier (integer)

    la ligne que je t'avais transmis donne la dernière ligne occupée mais si tu maintiens le retrait de cette dernière ligne
    Dl = .Columns(Col).Find(What:="*", searchdirection:=xlPrevious).Row-1 


    au besoin, fais une un essai avec les 2 manières dans une feuille d'un classeur avec des données dans une colonne

    Salut CCM, ca va ca va malgré cette canicule (38-40°) ressentis dehors)

    je te demande une astuce par MP. merci d'avance

    1. Bonjour, michel_m

      Merci de ton explication.

      Donc après essai, ça fonctionne bien en remplaçant les dernières lignes de code pour la création du graphe donné par ccm81.

      Merci beaucoup.
  6. De rien,

    Si c'est fini, peux tu mettre le sujet à résolu (en dessous du titre de ton premier message)

    Bonne journée à tous
    1. Malheuresement non, j'ai de nouveau un problème avec un Range ...
      Pour mes graphiques suivant j'ai besoin des 4 premieres colonnes + d'une plage à l'intérieure du tableau.

      Je pesnais donc utilisé un Union de mes deux Plage mais j'obtiens deja avant ça une erreur sur ma plage de données que j'ai voulu définir en prenant la première cellule et la dernière.

      Set Lastcell2 = Sheets("resultat").Cells(DL2, COL2)
      Set Firstcell = Sheets("resultat").Cells(1, COL).Offset(0, 1)
      Set LastD = Range("D" & Rows.Count).End(xlUp)
      Set plage_AD = Sheets("resultat").Range("A1:" & LastD.Address)
      Set plage_valeur2 = Sheets("resultat").Range("Firstcell.Adress: & Lastcell2.Adress")
      ' Erreur plage_valeur2 = nothing
      Set courbe2 = Sheets("resulat").Union(plage_valeur2, plage_AD)
      Sheets("graphique phase 2").Select


      Cordialement
  7. Essaies ceci (tu concaténes tes deux adresses en les séparant par ":" - il y a 2 "d" à Address)
    Set plage_valeur2 = Sheets("resultat").Range(Firstcell.Address & ":" & Lastcell2.Address) 


    Cdlmnt
    1. j'avais trouvé cette ligne de codes en cherchant un peu sur internet et finalement c'est la ligne du dessous qui ne va plus ...

      Set courbe2 = Sheets("resulat").Union(plage_valeur2, plage_AD)


      Même problème avec ce code là
      Set Lastcell2 = Sheets("resultat").Cells(DL2, COL2)
      Set Firstcell = Sheets("resultat").Cells(1, COL).Offset(0, 1)
      Set LastD = Range("D" & Rows.Count).End(xlUp)
      Set plage_AD = Sheets("resultat").Range("A1:" & LastD.Address)
      Set plage_valeur2 = Sheets("resultat").Range(Firstcell, Lastcell2)
      Set courbe2 = Sheets("resulat").Union(Range("plage_valeur2"), Range("plage_AD"))


      Ces Range ça me rend dingue ...
  8. Merci beaucoup de ton aide ccm81

    Pareil à michel_m

    Je posterais mon code en entier concernant ma macro si des personnes se retrouvent avec le même type de problème que moi.

    ' Il faut avouer que tous les autres post m'ont bien aidés pour réaliser une grande partie de ma macro aussi

    Je marquerai comme résolu le sujet juste après

    Encore merci,
    Bonne journée
    1. Voici la totalité du code qui me permet de créer des graphes à partir d'un tableau de données

      Avec pour chaque graphe des variables pour aller chercher sur la première ligne la colonne ou se trouve un certain texte et ainsi définir la plage de données correspondante au graphe voulu avec la première et dernière cellule.

      Sub graph()
      '
      ' graphe Macro
      '

      '

      Dim grph1 As Worksheet 'déclare grph1 comme feuille excel
      Dim grph2 As Worksheet 'déclare grph2 comme feuille excel
      Dim grph3 As Worksheet 'déclare grph3 comme feuille excel

      Dim i As Integer
      Dim y As Integer
      Dim z As Integer

      Dim Cpt As Integer
      Dim Cpy As Integer
      Dim Cpu As Integer
      Dim CptSh As Integer
      Cpt = 0
      CptSh = Sheets.Count
      For i = 1 To CptSh 'Créée la feuille graphique phase 1 après la feuille resultat
      If Sheets(i).Name <> "graphique phase 1" Then Cpt = Cpt + 1 Else Exit For 'si elle n'existe pas déjà
      Next i

      If Cpt = CptSh Then
      Sheets.Add After:=Sheets("synthese")
      ActiveSheet.Name = "graphique phase 1"
      End If

      Cpy = 0
      CptSh = Sheets.Count
      For y = 1 To CptSh
      If Sheets(y).Name <> "graphique phase 2" Then Cpy = Cpy + 1 Else Exit For
      Next y

      If Cpy = CptSh Then
      Sheets.Add After:=Sheets("graphique phase 1")
      ActiveSheet.Name = "graphique phase 2"
      End If

      Cpu = 0
      CptSh = Sheets.Count
      For u = 1 To CptSh
      If Sheets(u).Name <> "graphique phase 3" Then Cpu = Cpu + 1 Else Exit For
      Next u

      If Cpu = CptSh Then
      Sheets.Add After:=Sheets("graphique phase 2")
      ActiveSheet.Name = "graphique phase 3"
      End If

      Dim R1 As Range 'déclare la variable R1 (Recherche 1)

      Dim COL As Integer 'déclare la variable COL (COLonne)

      Dim DL As Long 'déclare la variable DL (Dernière Ligne)
      Dim Lastcell As Range

      Dim courbe1 As Range

      Sheets("resultat").Select
      Set R1 = Sheets("resultat").Rows(1).Find("Mph1", , xlValues, xlWhole)
      If Not R1 Is Nothing Then 'condition : si au moins une occurrence est trouvée
      COL = R1.Column 'définit la colonne COL de la première occurrence trouvée
      DL = Sheets("resultat").Cells(Application.Rows.Count, COL).End(xlUp).Offset(-1, 0).Row 'définit la dernière ligne éditée DL de la colonne COL de l'onget OND

      End If 'fin de la condition

      Set Lastcell = Sheets("resultat").Cells(DL, COL)
      Set courbe1 = Sheets("resultat").Range("A1:" & Lastcell.Address)
      Sheets("graphique phase 1").Select
      Charts.Add
      ActiveChart.ChartType = xlLineMarkers
      ActiveChart.SetSourceData Source:=courbe1
      ActiveChart.Location Where:=xlLocationAsObject, Name:="graphique phase 1"

      ActiveSheet.ChartObjects("Graphique 1").Activate
      ActiveChart.ChartArea.Select
      ActiveSheet.Shapes("Graphique 1").Height = 402.5196850394
      ActiveSheet.Shapes("Graphique 1").Width = 688.8188976378
      ActiveSheet.Shapes("Graphique 1").IncrementLeft -148.8
      ActiveSheet.Shapes("Graphique 1").IncrementTop -101.4
      ActiveChart.ClearToMatchStyle
      ActiveChart.ChartStyle = 231
      ActiveChart.Axes(xlCategory).Select
      ActiveChart.Axes(xlCategory).TickLabelSpacing = 1
      ActiveChart.Axes(xlCategory).TickLabelSpacing = 100
      ActiveChart.Axes(xlValue).Select
      ActiveChart.Axes(xlValue).MinimumScale = 0
      ActiveChart.Axes(xlValue).MajorGridlines.Select
      Selection.Delete

      ActiveSheet.ChartObjects("Graphique 1").Activate
      ActiveChart.SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)
      ActiveChart.Axes(xlValue, xlPrimary).HasTitle = True
      ActiveChart.Axes(xlValue).AxisTitle.Select
      ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Échauffement (k)"
      Selection.Format.TextFrame2.TextRange.Font.Size = 20

      Dim R2 As Range 'déclare la variable R1 (Recherche 2)

      Dim COL2 As Integer 'déclare la variable COL (COLonne 2)

      Dim DL2 As Long 'déclare la variable DL (Dernière Ligne2)
      Dim Lastcell2 As Range
      Dim Firstcell As Range ' déclare la variable Firstcell ( premiere cellule graphe 2)

      Dim plage_valeur2 As Range
      Dim courbe2 As Range
      Dim plage_AD As Range
      Dim LastD As Range

      Sheets("resultat").Select
      Set R2 = Sheets("resultat").Rows(1).Find("Mph2", , xlValues, xlWhole)
      If Not R2 Is Nothing Then 'condition : si au moins une occurrence est trouvée
      COL2 = R2.Column 'définit la colonne COL de la première occurrence trouvée
      DL2 = Sheets("resultat").Cells(Application.Rows.Count, COL2).End(xlUp).Offset(-1, 0).Row 'définit la dernière ligne éditée DL de la colonne COL

      End If 'fin de la condition

      Set Lastcell2 = Sheets("resultat").Cells(DL2, COL2) ' Définit ma dernière cellule de ma plage de données
      Set Firstcell = Sheets("resultat").Cells(1, COL).Offset(0, 1) 'Définit ma première cellle de ma plage de données
      Set LastD = Range("D" & Rows.Count).End(xlUp) ' Va chercher la derniere case non vide de la colonne D
      Set plage_AD = Sheets("resultat").Range("A1:" & LastD.Address) ' Définit ma plage constante des 4 premieres colonnes
      Set plage_valeur2 = Sheets("resultat").Range(Firstcell, Lastcell2) ' définit ma plage de données à l'intérieur de mon tableau
      Set courbe2 = Union(plage_valeur2, plage_AD) ' unifie les deux plages pour la plage de données à donner au graphe
      Sheets("graphique phase 2").Select

      Sheets("graphique phase 2").Select
      Charts.Add
      ActiveChart.ChartType = xlLineMarkers
      ActiveChart.SetSourceData Source:=courbe2
      ActiveChart.Location Where:=xlLocationAsObject, Name:="graphique phase 2"

      ActiveSheet.ChartObjects("Graphique 1").Activate
      ActiveChart.ChartArea.Select
      ActiveSheet.Shapes("Graphique 1").Height = 402.5196850394
      ActiveSheet.Shapes("Graphique 1").Width = 688.8188976378
      ActiveSheet.Shapes("Graphique 1").IncrementLeft -148.8
      ActiveSheet.Shapes("Graphique 1").IncrementTop -101.4
      ActiveChart.ClearToMatchStyle
      ActiveChart.ChartStyle = 231
      ActiveChart.Axes(xlCategory).Select
      ActiveChart.Axes(xlCategory).TickLabelSpacing = 1
      ActiveChart.Axes(xlCategory).TickLabelSpacing = 100
      ActiveChart.Axes(xlValue).Select
      ActiveChart.Axes(xlValue).MinimumScale = 0
      ActiveChart.Axes(xlValue).MajorGridlines.Select
      Selection.Delete

      ActiveSheet.ChartObjects("Graphique 1").Activate
      ActiveChart.SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)
      ActiveChart.Axes(xlValue, xlPrimary).HasTitle = True
      ActiveChart.Axes(xlValue).AxisTitle.Select
      ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Échauffement (k)"
      Selection.Format.TextFrame2.TextRange.Font.Size = 20

      ' 3eme graphe

      Dim R3 As Range 'déclare la variable R1 (Recherche 3)

      Dim COL3 As Integer 'déclare la variable COL (COLonne 3)

      Dim DL3 As Long 'déclare la variable DL (Dernière Ligne3)
      Dim Lastcell3 As Range
      Dim Firstcell2 As Range
      Dim COL_D As Range

      Dim plage_valeur3 As Range
      Dim courbe3 As Range

      Sheets("resultat").Select
      Set R3 = Sheets("resultat").Rows(1).Find("Mph3", , xlValues, xlWhole)
      If Not R3 Is Nothing Then 'condition : si au moins une occurrence est trouvée
      COL3 = R3.Column 'définit la colonne COL de la première occurrence trouvée
      DL3 = Sheets("resultat").Cells(Application.Rows.Count, COL3).End(xlUp).Offset(-1, 0).Row 'définit la dernière ligne éditée DL3 de la colonne COL3

      End If 'fin de la condition

      Set Lastcell3 = Sheets("resultat").Cells(DL3, COL3)
      Set Firstcell2 = Sheets("resultat").Cells(1, COL2).Offset(0, 1)
      Set LastD = Range("D" & Rows.Count).End(xlUp)
      Set plage_AD = Sheets("resultat").Range("A1:" & LastD.Address)
      Set plage_valeur3 = Sheets("resultat").Range(Firstcell2, Lastcell3)
      Set courbe3 = Union(plage_valeur3, plage_AD)
      Sheets("graphique phase 3").Select

      Sheets("graphique phase 3").Select ' créer graphe phase 3 avec source donnée range courbe3
      Charts.Add ' dans la feuille graphique phase 3
      ActiveChart.ChartType = xlLineMarkers
      ActiveChart.SetSourceData Source:=courbe3
      ActiveChart.Location Where:=xlLocationAsObject, Name:="graphique phase 3"

      ActiveSheet.ChartObjects("Graphique 1").Activate ' Selectionne graphe 3 et modifie taille et position
      ActiveChart.ChartArea.Select
      ActiveSheet.Shapes("Graphique 1").Height = 402.5196850394
      ActiveSheet.Shapes("Graphique 1").Width = 688.8188976378
      ActiveSheet.Shapes("Graphique 1").IncrementLeft -148.8
      ActiveSheet.Shapes("Graphique 1").IncrementTop -101.4
      ActiveChart.ClearToMatchStyle
      ActiveChart.ChartStyle = 231 ' Selectionne style graphe
      ActiveChart.Axes(xlCategory).Select
      ActiveChart.Axes(xlCategory).TickLabelSpacing = 1
      ActiveChart.Axes(xlCategory).TickLabelSpacing = 100
      ActiveChart.Axes(xlValue).Select
      ActiveChart.Axes(xlValue).MinimumScale = 0
      ActiveChart.Axes(xlValue).MajorGridlines.Select
      Selection.Delete

      ActiveSheet.ChartObjects("Graphique 1").Activate ' Ajoute titre axe Y
      ActiveChart.SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)
      ActiveChart.Axes(xlValue, xlPrimary).HasTitle = True
      ActiveChart.Axes(xlValue).AxisTitle.Select
      ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Échauffement (k)" ' Nom titre axe y = Echauffement (k)
      Selection.Format.TextFrame2.TextRange.Font.Size = 20 ' Change taille texte

      End Sub