XL 2019 Modifier la source de données d'un graphique par VB

Ricou969

XLDnaute Nouveau
Bonjour,

J'ai une plage de cellules contenant une liste. Le numéro de la ligne de la cellule suivante vide est dans Cells(3,1). La plage de cellules dédiées au graphique est B5:C5, le "5" étant donné par la cellule cells(3,1).
Je voudrais que la source de données de mon graphique s'étende au fur et à mesure que j'ajoute des valeur dans la plage $B$5:$C$x.
J'ai tenté le code ci-dessous mais j'obtiens un erreur 91. Je ne sais comment faire.
VB:
Sheets("Accueil").Select
    ActiveSheet.ChartObjects("Graphique 3").Activate
    ActiveChart.ChartArea.Select
    Dim monRange As Range
    monRange = "$B$5:C" & (Cells(3, 1)) & """"
    ActiveChart.SetSourceData Source:=Sheets("Catégories").Range(monRange), PlotBy:=xlRows

Le code s'arrête à la ligne "monRange = "$B$5:C" ... etc.
 
Dernière édition:
Solution
Re

Testes cette macro
(qui est quasiment la même que la précédente ;)
Et redis-moi
VB:
Sub Test_OK()
Dim Graph As Chart, monRange As Range
Application.ScreenUpdating = False
Set Graph = Sheets("Accueil").ChartObjects("Graphique 3").Chart
    nCat = InputBox("Entrez le nom de la catégorie souhaitée..", "Nouvelle catégorie")
    If nCat = "" Then
        MsgBox ("Annulation par l'utilisateur.")
        Exit Sub
    End If
With Worksheets("Catégories")
.Range("B" & .[A3]).Value = nCat
Set monRange = .Range("$B$5:C" & .[A3] - 1)
End With
Graph.SetSourceData Source:=monRange
End Sub

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Ricou969

Ricou969
A vue de nez, il vaudrait mieux écrire
Set monRange = Sheets("Catégories").Range("$B$5:C" & Sheets("Catégories").[C1])
Je te laisse tester sur ton classeur.

EDITION: Avec des endives ;)
VB:
With Sheets("Catégories")
Set monRange = .Range("$B$5:C" & .[C1])
End With
Ça allège un peu le code ;)
 

Ricou969

XLDnaute Nouveau
Bonjour et merci de la réponse.
Je suis vraiment béotien en ce qui concerne vba , je ne comprends pas le dernier terme de l'instruction suivante : Set monRange = Sheets("Catégories").Range("$B$5:C" & Sheets("Catégories").[C1]).
Que représente [C1], la cellule $C$1 ?
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Ricou969

Mea Culpa
En espérant que le petit code éclairera ta lanterne ;)
VB:
Sub Fiat_Lux()
MsgBox [C1].Address
MsgBox Cells(3, 1).Address
MsgBox [C1].Address
'aie caramba !!
MsgBox Cells(3, 1).Address = [A3].Address
End Sub
Je te laisse donc corriger mon erreur dans le code proposé dans le message#2
 

Ricou969

XLDnaute Nouveau
Merci pour votre réponse Staple1600, mais j'ai tourné dans tous les sens :

En mettant
VB:
Set monRange = .Range("$B$5:C" & .[C1])
, j'ai une erreur de compilation : "référence incorrecte ou non qualifiée".

En mettant
Code:
Set rangeCat = Sheets("Catégories").Range("$B$5:C" & Sheets("Catégories").[C1])
, jobtiens une erreur 1004 "erreur définie par l'application ou par l'objet".

Ces phrases de code sont insérées dans le code obtenu par enregistrement macro à savoir :
Code:
Sheets("Accueil").Select
    ActiveSheet.ChartObjects("Graphique 3").Activate
    ActiveChart.ChartArea.Select
    Dim rangeCat As Range
    rangeCat = "$B$5:C" & (Cells(3, 1)) & """"
    ActiveChart.SetSourceData Source:=Sheets("Catégories").Range(rangeCat), PlotBy:=xlRows
, à la place de "rangeCat = "$B$5:C" & (Cells(3, 1)) & """"


Enfin, j'ai essayé sans succès de mettre dans la plage du graphique (mode création) une fonction DECALER() comme celle qui gère la liste des catégories.

En vous remerciant pour votre sollicitude.
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil,

Dans ton code tu utilises Cells(3,1) donc A3
C'est moi qui ait fait une erreur
D'où le message#4 (en guise de mea culpa)
Donc si en A3 tu as un nombre (pour définir la fin de ta plage)
Alors il fallait utiliser
VB:
With Sheets("Catégories")
Set monRange = .Range("$B$5:C" & .[A3])
End With
 

Ricou969

XLDnaute Nouveau
Bonsoir et merci à Staple1600,

Arghh ! J'obtiens un erreur à la compilation : Référence incorrecte ou non qualifiée.
Capture d’écran 2020-02-25 à 19.36.17.png
Voici le code de la fonction qui coince :
VB:
Sub CreerUneCategorie()
Application.ScreenUpdating = False
    nCat = InputBox("Entrez le nom de la catégorie souhaitée..", "Nouvelle catégorie")
    If nCat = "" Then
        MsgBox ("Annulation par l'utilisateur.")
        Exit Sub
    End If
    '
    Worksheets("Catégories").Select
    
    Range("B" & Cells(3, 1).Value).Value = nCat
    ' maj données graphique
    
    Dim monRange As Range
 ' c'est ici que cela coince
    Set monRange = .Range("$B$5:C" & .[A3])
    
    ' partie de code obtenu par macro...
    Sheets("Accueil").Select
    ActiveSheet.ChartObjects("Graphique 3").Activate
    ActiveChart.ChartArea.Select
    ActiveChart.SetSourceData Source:=Sheets("Catégories").Range(monRange), PlotBy:=xlRows
    
    Worksheets("Accueil").Select
    Range("E11").Value = nCat
    Application.ScreenUpdating = True
    MsgBox ("La catégorie : " & nCat & " a été créé.")
    '
End Sub

ce code est sûrement très "sale" mais, bon ... on fait c'qu'on peut...
 

Staple1600

XLDnaute Barbatruc
Re

Je teste à l'aveugle
(Ce serait plus simple, si tu joignais un fichier exemple anonymisé)
Ci-dessous syntaxe fonctionnelle (mais test sur mon fichier)
VB:
Sub Test_OK()
Dim Graph As Chart, monRange As Range
Application.ScreenUpdating = False
Set Graph = Sheets("Accueil").ChartObjects("Graphique 3").Chart
    nCat = InputBox("Entrez le nom de la catégorie souhaitée..", "Nouvelle catégorie")
    If nCat = "" Then
        MsgBox ("Annulation par l'utilisateur.")
        Exit Sub
    End If
With Worksheets("Catégories")
'.Range("B" & .[A3]).Value = nCat ' ligne commentée pour fair mon test
Set monRange = .Range("$B$5:C" & .[A3])
End With
Graph.SetSourceData Source:=monRange
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Testes cette macro
(qui est quasiment la même que la précédente ;)
Et redis-moi
VB:
Sub Test_OK()
Dim Graph As Chart, monRange As Range
Application.ScreenUpdating = False
Set Graph = Sheets("Accueil").ChartObjects("Graphique 3").Chart
    nCat = InputBox("Entrez le nom de la catégorie souhaitée..", "Nouvelle catégorie")
    If nCat = "" Then
        MsgBox ("Annulation par l'utilisateur.")
        Exit Sub
    End If
With Worksheets("Catégories")
.Range("B" & .[A3]).Value = nCat
Set monRange = .Range("$B$5:C" & .[A3] - 1)
End With
Graph.SetSourceData Source:=monRange
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 105
dernier inscrit
Joffrette