problème pour compter le nombre de cellules non vides

babalouche

XLDnaute Nouveau
Bonjour le forum,
j'ai deux fichiers excel l'un contenant la macro et l'autre un tableau variable où je souhaiterais faire des graphiques avec. Pour cette partie on m'a déjà aidé pour les problèmes que j'ai eu sauf que j'aimerais mettre des conditions sur les graphiques (type de graphe principalement). Le type de graphe se ferait selon le nombre de données dans une même colonne mais je n'arrive pas à avoir cette valeur là.
En gras c'est ma boucle pour savoir le nombre de données par colonne.
voici mon code :

Option Explicit
Sub Workbook_Open()
Dim Wbk As Workbook, Cht As Chart, RngTit As Range, RngDon As Range, _
ColDate As Long, Col As Long, Sér As Series, ligne As Double, cels As Double, c As Double
For Each Wbk In Application.Workbooks
If Wbk.Name <> ThisWorkbook.Name Then Exit For
Next Wbk
Set RngDon = Wbk.Worksheets(1).UsedRange
For ColDate = 1 To RngDon.Columns.Count
If IsDate(RngDon(2, ColDate).Value) Then Exit For
Next ColDate
If ColDate > RngDon.Columns.Count Then
ColDate = 1
End If
Set RngTit = RngDon.Rows(1)
Set RngDon = RngDon.Rows(2).Resize(RngDon.Rows.Count - 1)
Wbk.Worksheets(1).Activate
ligne = Application.WorksheetFunction.CountA(Columns(1))
For Col = 1 To RngTit.Columns.Count
If Col <> ColDate Then
Set Cht = Wbk.Charts.Add
Set Sér = Cht.SeriesCollection.NewSeries
Sér.Name = RngTit.Columns(Col)
Sér.XValues = RngDon.Columns(ColDate)
Sér.Values = RngDon.Columns(Col)
cels = O
For c = 2 To ligne
If Cells(c, Col) <> "" Then
cels = cels + 1
End If
Next c

If cels > 10 Then
Cht.ChartType = xlLine
End If
If cels > 6 Then
Cht.ChartType = xlPie
End If
End If
Next Col
End Sub
 

babalouche

XLDnaute Nouveau
Code:
Option Explicit
Sub Workbook_Open()
    Dim Wbk As Workbook, Cht As Chart, RngTit As Range, RngDon As Range, _
    ColDate As Long, Col As Long, Sér As Series
    For Each Wbk In Application.Workbooks
        If Wbk.Name <> ThisWorkbook.Name Then Exit For
    Next Wbk
    Set RngDon = Wbk.Worksheets(1).UsedRange
    For ColDate = 1 To RngDon.Columns.Count
        If IsDate(RngDon(2, ColDate).Value) Then Exit For
    Next ColDate
    If ColDate > RngDon.Columns.Count Then
        ColDate = 1
    End If
    Set RngTit = RngDon.Rows(1)
    Set RngDon = RngDon.Rows(2).Resize(RngDon.Rows.Count - 1)
    For Col = 1 To RngTit.Columns.Count
        If Col <> ColDate Then
            Set Cht = Wbk.Charts.Add
            Set Sér = Cht.SeriesCollection.NewSeries
            Sér.Name = RngTit.Columns(Col)
            Sér.XValues = RngDon.Columns(ColDate)
            Sér.Values = RngDon.Columns(Col)
        End If
    Next Col
End Sub
Avec l'aide de Dranreb j'avais obtenu ce code pour ma macro à faire les graphiques où une colonne apparaissait pour un graphique et maintenant la modification du type de graphique entraîne plus de légendes précises sauf pour le premier graphique plus de titre et j'ai des problèmes encore avec le compteur de données qui marche pas toujours bien pour faire le type de graphique. J'ai à chaque graphique les données précedentes et les données de la nouvelle colonne je comprends pas
 

Dranreb

XLDnaute Barbatruc
Oui,
ca ne change rien au problème
Enfin je ne sais pas mais en tout cas ça marche comme on voulait :
upload_2018-7-17_19-29-54.png
 

babalouche

XLDnaute Nouveau
Bonjour,
Ce que j'aimerais c'est qu'à partir du tableau avec un graphique avec en abscisse la date s'il y a sinon la première colonne et en ordonnée une autre colonne et ainsi avoir autant de graphique que de colonne en ne comptant pas la colonne pour les abscisses. Quand j'ai seulement ce code pour faire ceci ça marche. Mais je veux améliorer le code pour faire différents types de graphiques et le type va dépendre du nombre de données que la colonne comporte. Seulement quand je rajoute votre morceau de code plus haut, en fonction du nombre de données je n'arrive pas à avoir le bon type de graphique et sur ces graphiques il a plus 1 colonne en fonction du temps ou de la première colonne mais plusieurs car à chaque fois il prend les colonnes utilisées avant et ajoute une nouvelle qui elle devrait être la seule à apparaître sur le graphique et du coup les titres de graphique n'apparaissent plus du coup. Seul le premier graphique marche.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Je n'y comprends rien à ce que vous voulez.
Ce que je peux dire c'est que dans le bout de code au #20, le ChartType n'est pas défini si le nombre de valeurs <= 6. Alors c'est peut être là qu'il reprend le dernier appliqué.
Ce que l'entendais 'par mieux définir' c'était redéfinir quels types de graphique dans quelles tranches de nombres de valeurs.
 

Dranreb

XLDnaute Barbatruc
Non. Comment avez vous corrigé ? normalement il aurait juste fallu une clause Case Else: Cht.ChartType = ??? avant le End Select
Quel était le nombre de valeurs ? Quels type de graphique aurait il fallu et quel autre avez vous eu à la place ?
Déroulez en pas à pas pour voir ce qui se passe, avec des espions comme j'ai montré au #20.
 

Dranreb

XLDnaute Barbatruc
Si, je viens quand même de voir une chose…
On dirait qu'à la création du nouveau Chart il semble déjà muni de ce qui semble être le nombre de séries qu'avait le dernier graphique traité.
Il faudrait peut être une boucle au début: Do While Cht.SeriesCollection.Count > 1: Cht.SeriesCollection(1).Delete: Loop
Et ne plus en ajouter, s'il y en a déjà une, mais prendre celle là: Set Sér = Cht.SeriesCollection(1)
Mais c'est étonnant que vous n'aviez pas eu ce problème dès le début ?…
 

babalouche

XLDnaute Nouveau
Je n'avais pas utilisé de case else mais pour les valeurs inférieurs à 7 donc pour le reste des valeurs qui équivaut donc au else et en fait pour le type de graphique ca allait juste les valeurs dedans étaient pas celle attendues (message avant d'avoir lu le #28)
Je vais essayer cette boucle et vous dire après
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 944
Membres
101 849
dernier inscrit
florentMIG