IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[E-03] Propriétés inaccessibles dans un chart


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Par défaut [E-03] Propriétés inaccessibles dans un chart
    Bonjour tout le monde,

    J'ai du récemment mettre au point un "Graphique à bulle avec étiquettes depuis un TCD".
    Pour ce qui est de créer le graphique à Bulle, pas de soucis. Sélection et copie des données du TCD dans un tableau statique adjacent, création du graphique à bulles à partir de cette source de données... Bref jusque là tout va bien.

    Puis attribution des valeurs d'étiquettes aux Datalabels des bulles... Premier essai avec 3 lignes de données, tout va bien. 2ème essai avec 19 lignes de données, ça pète à la première....

    L'erreur rencontrée est donc : "Impossible de lire la propriété Datalabel de la classe Point".

    Bon, sur ce un peu de code pour que vous puissiez vous faire votre avis (dans une première version je recréais le chart à chaque exécution) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    Sub Bubble_charter()
    'Activation de la worksheet "Chartdata"
     Worksheets("chartdata").Activate
     On Error GoTo 0
     
        'Mise à jour du TCD n°1 de la feuille chartdata
     'Worksheets("chartdata").PivotTables(1).RefreshTable
     
     'Copie des données de A5 en I4
        'Sélection de A5
     Range("A5").Select
        'Extension de la sélection sur toutes les cellules utilisées  vers le bas et la droite, et copie des données en I4
     Range(ActiveCell, ActiveCell.End(xlDown).End(xlToRight)).Copy Destination:=Range("I4")
     
     'Sélection de la source des données du chart
        'Sélection des données en J4 (les données copiées précédemment)
     Range("J4").Select
        'Extension de la sélection à toutes les cellules utilisées vers le bas et la droite
     Range(ActiveCell, ActiveCell.End(xlDown).End(xlToRight)).Select
        'Enregistrement dans une variable la plage séléectionnée
     Set maplage = Selection   ' Plage du graphique
     
    ''Création du chart
    '    'Ajout du chart
    ' Charts.Add
    '    'Détermination du type du chart
    ' ActiveChart.ChartType = xlBubble
        'Détermination de la source (maplage), et du sens : xlColumns = en ligne, xlrows = en colonne
    Charts("Bubble_chart").Activate
     ActiveChart.SetSourceData Source:=maplage, PlotBy:=xlColumns
        'Détermination de l'emplacement du nouveau chart : xlLocationasNewSheet = Nouvelle feuille
    ' ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Bubble_Chart"
     
        'Détermination de l'affichage (ou non) des étiquettes de données (entêtes)
     ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowBubbleSizes, HasLeaderLines:=True
     
    'Formatage graphique
     ActiveChart.PlotArea.Select
     With Selection.Interior
       .ColorIndex = 2
       .Pattern = xlSolid
     End With
     
    'Désactivation de la mise à jour de l'affichage, le temps d'effectuer les changements
     Application.ScreenUpdating = False
     Charts("bubble_chart").Activate
    'Mise en forme du texte (taille de police)
     ActiveChart.Axes(xlCategory).Select
     'ActiveChart.Axes(xlCategory).MinimumScale = 0
     ActiveChart.Axes(xlValue).TickLabels.Font.Size = 7
     ActiveChart.Axes(xlCategory).TickLabels.Font.Size = 7
     '--titres
     
     'Détermination du titre du chart
     With ActiveChart
            'détermination de la présence du titre
            .HasTitle = True
            'détermination du titre
            .ChartTitle.Characters.Text = "CB1 / Avg Runsize"
            'détermination des titres d'axes
                'Absisces
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = Sheets("chartdata").Cells(4, 10)
                'Ordonnées
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = Sheets("chartdata").Cells(4, 11)
     End With
     '
     'Mise en forme du chart
        'Grid (grillage)
     ActiveChart.Axes(xlValue).HasMajorGridlines = True
     ActiveChart.Axes(xlCategory).HasMajorGridlines = True
     'Mise en forme de la série de données
     ActiveChart.SeriesCollection(1).Select
        'Effet 3D
     Selection.Has3DEffect = True
     'Mise en forme des étiquettes de données de la série 1 (la seule)
        'Sélection de la série
     ActiveChart.SeriesCollection(1).DataLabels.Select
        'détermination de la taille de polie des étiquettes de données
     Selection.Font.Size = 7
        'Compte des éléments de la série pour boucle
     Nb_points = ActiveChart.SeriesCollection(1).Points.Count
     For i = 1 To Nb_points
            'Détermination du texte à appliquer (Ici, le nom du client + ": " + CB1 en valeur)
       Charts("Bubble_chart").SeriesCollection(1).Points(i).DataLabel.Select
       Selection.Text = Worksheets("chartdata").Cells(i + 4, 9) & " : " & CLng(Worksheets("chartdata").Cells(i + 4, 12)) & " €"
     Next i
     On Error Resume Next
     'Suppression des légendes
     ActiveChart.Legend.Delete
    End Sub
    Donc, avec 3 lignes, ça passe, avec 4 lignes, ça bloque à la première...
    De plus, après essai, ce n'est pas que la classe "Datalabel" qui ne veut plus de moi, la classe "point" est inaccessible aussi, mais par contre je peux voir les éléments de la classe "series", y compris "Points" et "DataLabels", les collections qui devraient me permettre d'atteindre par un moyen ou un autre mes chers "Datalabel". Mais bien entendu, les éléments de ces collections sont inaccessibles...

    Si Quelqu'un voit, dans cet imbruglio, un mauvais paramétrage, une fausse manip', une methode obsolète ou je ne sais quoi, je vous serai gré de me le signaler.

    D'avance Merci ^^

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Sans idée du contenu des données...

    Ton graphique est-il correctement construit au delà de trois lignes? (sans exécuter le code sur les datalabels).

    Procède en pas à pas dans ton code pour voir la construction du graphique à chaque exécution de ligne (pour cela, cliques dans le code de la proc puis tu presses F8 et tu avances dans l'exécution avec F8)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre éprouvé Avatar de DidierLoche
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 84
    Par défaut
    Bonsoir,

    Je ne sais pas si le problème vient de là mais quand je teste ton code, ça plante au niveau de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 To Nb_points
            'Détermination du texte à appliquer (Ici, le nom du client + ": " + CB1 en valeur)
       Charts("Bubble_chart").SeriesCollection(1).Points(i).DataLabel.Select
       Selection.Text = Worksheets("chartdata").Cells(i + 4, 9) & " : " & CLng(Worksheets("chartdata").Cells(i + 4, 12)) & " €"
     Next i
    car le premier point ne commence pas à 1 mais à 2
    En faisant for i=2 to ..., ça marche.

    Didier

  4. #4
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Par défaut
    Bonjour, et merci de vos réponses.

    Je me rends compte que je n'avais pas donné toutes les infos sur mon problème... ^^

    Alors :
    Mon graphique se construit correctement au delà de 3 lignes. Pour tester cette situation, j'ai inséré en fin de tableau (TCD), des lignes placebo identiques aux données du TCD (3eme ligne dupliquée).

    En mode pas à pas, c'est bien (comme l'a remarqué DidierLoche) au niveau de la boucle d'affectation des labels que le problème apparait. Plus précisement la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Charts("Bubble_chart").SeriesCollection(1).Points(i).DataLabel.Select
    Après étude des variables d'exécution, l'élement Points(1) n'est pas instancié... Donc Objet nul... Donc pas d'accès aux propriétés. Je n'ai pas encore testé la mise en œuvre de la solution proposée par DiddierLoche, mais j'y vais de ce pas.
    Si cela marche, il me restera à comprendre pourquoi cette fichue liste décide de commencer à 2 et pas à 1 lorsqu'elle contient plus de 3 éléments...

    Je vous tiens au courant de l'évolution de la résolution du problème. ^^

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Par défaut
    Bonjour à nouveau,


    Merci DidierLoche pour m'avoir fait remarqué ce petit point qu'était le départ du tableau.

    Après analyse, le tableau des points commence effectivement à l'index 2, mais uniquement si celui-ci possède plus de 3 éléments.
    Je m'explique : En regardant la propriété Count de la collection Points dans divers situation, J'obtient ce pallier :
    3 éléments : Count = 3 / index de départ : 1
    4 éléments : Count = 5 / index de départ : 2

    Je ne comprends pas pourquoi... Mais la solution que j'ai appliqué est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        'Compte des éléments de la série pour boucle
     Nb_Points = ActiveChart.SeriesCollection(1).Points.Count
     If Nb_Points > 3 Then
        Depart = 2
     Else
        Depart = 1
     End If
     For i = Depart To Nb_Points
            'Détermination du texte à appliquer (Ici, le nom du client + ": " + CB1 en valeur)
       Charts("Bubble_chart").SeriesCollection(1).Points(i).DataLabel.Select
       Selection.Text = Worksheets("chartdata").Cells(i + (5 - Depart), 9) & " : " & CLng(Worksheets("chartdata").Cells(i + (5 - Depart), 12)) & " €"
     Next i
     On Error Resume Next
    Je module donc ma boucle pour ne taper que dans les points existants.

    Pour ceux qui voudraient reprendre ce code : Ne pas oublier de faire varier la position du label à intégrer en fonction de départ (l'index du tableau à utiliser est différent, mais vos données n'ont pas bougé !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Worksheets("chartdata").Cells(i + 4, 9)
    'est devenu :
    Worksheets("chartdata").Cells(i + (5 - Depart), 9)
    Merci à tous deux pour votre aide ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interrrogation propriétés users dans sous OU
    Par fdthierry dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 19h03
  2. Réponses: 4
    Dernier message: 11/10/2005, 21h12
  3. Comment dessiner une ligne dans un Chart ?
    Par libititi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2005, 15h56
  4. [ActiveX] Propriété "Picture" dans un contrôle util
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/12/2002, 16h59
  5. Créer une série dans un chart
    Par cyrose dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/11/2002, 12h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo