Se connecter avec
S'enregistrer | Connectez-vous

[resolu] transformation tableau excel => graphique a l'aide de macros

Dernière réponse : dans Programmation

Lu voici mon autre probleme :
j 'ai un tableau avec des valeurs de type "07.25"
le tableau commence de la ligne 18 jusqu'a la ligne 48
et de la colonne E jusqu'a la colonne I.
A cote de ce tableau j'ai un graphique avec : sur 2 lignes
premiere ligne les chiffres de 6 a 8
deuxieme ligne les chiffre de 1 a 52
ex :
  1.  

(bon c pas jolie mais je peux pas faire autrement dsl)
donc je cherche a mettre les valeurs du 1er tableau sous forme de barre
dans le graphique
merci de vouloir m'aider
Lassé par la pub ? Créez un compte
Expert Programmation

On ne peut pas mettre de fichiers sur le forum.
Il existe des sites dédiés sur lesquels tu peux déposer tes fichiers.
Tu peux alors mettre un lien vers ces fichiers dans ton sujet.

/!\ Attention cependant. Un fichier Excel peut contenir des macros, ne pas télécharger puis exécuter un tel fichier sans précaution.

Hoegarden31» La prochaine fois que tu fais un up d'une demi-heure, je sévis, quelque soit l'urgence du problème. [:zeb]
Expert Programmation

Argggh, KangOl, un Flamin !
Moi, une de mes préférées, c'est la Queue de charrue brune. Elle a un nom français, mais elle est flamande quand même (Ploegsteert).

Ton lien ne marche pas chez moi :o 

Ok je vois le problème déjà c'est pas un graphique mais du coloriage de cellules...

Tu dois avoir une barre par ligne du tableau ?
Quel est le lien entre les valeurs "00.00" et le compteur de semaine ? C'est le code couleur des PH PR ?

oui en fait ce sont des projet et les valeurs indiquent la date de fin du projet
ex : 07.03 c le projet PRO dont la phase 0 fini la 3eme semaine de l'annee 2007 donc normallement, je dois colorier les casses du 6.26 jusqu'au 7.03 inclus
se que je voudrai faire est :
je prend la valeur dans la tableau a gauche et je recherche la meme valeur dans le tableau de droite puis je colorie cette casse.
apres je colorie toutes les casses avant jusqu'a ce qu'il y a une autre couleur

Alors voilà comment il faut que tu procèdes : (enfin mon avis)

Créer un module de paramétrage où tu vas renseigné les paramètres que tu peux pas retrouver automatiquement sous forme de constante.

- Première ligne utile : 9
- Ligne année : 7
- ligne semaine : 8
- Colonne début graph : M (alias 19)
- Colonne PR0 : E en numérique 5
- Colonne PR4 : I en numérique 9

Ensuite il te faut les fonctions suivantes :

GetPosition : fonction qui calcule pour une date donnée "aa.ss" le numéro de la colonne correspondante dans ton graphique
GetCharacter : fonction qui renvoie pour un numéro de 1 à 256 la colonne excel correspondante (par exemple 1 => A, M=> 19 etc.
SetColor : procedure qui pour une cellule donnée (ex:"A1") colorie la cellule selon le code couleur donnée

Ensuite le programme principal :

Tu détermine la taille de ton tableau de projet : tu te base sur la colonne B et tu trouve la dernière ligne remplie.
Tu détermine ta colonne max dans le graphique : tu te base sur la ligne 7 et tu trouve la colonne max (valeur numérique)

Tu parcours ton tableau projet pour chaque ligne
Tu parcours les colonnes de date
Si la date est remplie : tu calcules la position de la colonne à remplir et tu garde en mémoire la position (il te faut une date actuelle et une précedente.)
Si date prec et date act sont renseignées
Tu colorie du début à la fin -1 (d'où le fait de stocker du numérique)
date precedente devient date act


Voilà en gros par contre il faut que tu empeche que 2 phase de projet commence en meme temps comme sur ta ligne 2 de ton tableau "07.16" Car soit il s'agit d'une date de début soit de fin de phase mais pas un mix des deux.

Essaie d'avancer en commencent par les fonctions utiles que j'ai mis testes les biens pour être certaine qu'elle fonctionne puis une fois que tu as toutes les pièces tu assembles ;) 
bon courage

ok merci pour cet aide.
pour ce qui est de la ligne 2, je suis en train de faire un prog qui teste le tableau comme sa pas de probleme
Sinon il va falloir expliquer certains trucs comme :
  • Créer un module de paramétrage
  • déterminer la taille du tableau de projet

    Créer un module de paramétrage : Facon de parler

    Tu créé un module appelé general par exemple.
    Tu déclare tes constantes à l'interieur
    1. Public const K_PREM_LIGNE = 9


    déterminer la taille du tableau de projet :

    Sujet débattu avec Zeb il y a quelques temps
    Pour une ligne (B étant la colonne de test) :
    1. range("B" & 65536).end(xlUp).row


    Pour une colonne : (i étant la ligne de test)
    1. range("IV" & i).end(xltoLeft).column

    le XltoLeft à vérifier...

    ok merci comme je suis tres nul en VBA,
    dite moi si c juste c debut :
    1. Public Const K_FIRST_LINE = 9
    2. Public Const LINE_YEAR = 7
    3. Public Const LINE_WEEK = 8
    4.  
    5.  
    6. Function GetPosition()
    7. Dim a, i
    8. For i = K_FIRST_LINE To 48
    9. a = Range("E" & i).End(xlUp)
    10.  
    11. Next i
    12. End Function

    j'enlever le
    1. .Row

    pour recuperer la valeur qui est ecrit dans le tableau
    merci
    petite precision : sa fait 1 semaine que j'ai commencer avec le langage VBA donc aidez moi pls :( 

    Je pense que tu n'as pas saisie l'utiliité du End

    En fait il s'agit de déterminer la position de ta dernière ligne ou de ta dernière colonne contenant des données, donc ta limite à 48 n'a pas lieu d'être.

    1. Public const K_DEB_GRAPH = 19 'Colonne M
    2.  
    3. Function GetPosition(dtdate as string) as long
    4. Dim a as variant
    5. Dim i as long
    6. Dim max as long
    7. Dim sem as long
    8. Dim an as long
    9.  
    10. getposition = -1
    11. max = .range("IV" & LINE_YEAR).End(xlUp).column 'renvoie la dernière colonne contenant des données de date du graphique
    12. ' On sépare la date
    13. an = left(dtdate,instr(dtdate,".")-1) '7
    14. sem = mid(dtdate,instr(dtdate,".")+1) ' 12
    15. For i = K_DEB_GRAPH To max
    16. if cells(LINE_YEAR,i) = an then
    17. if cells(LINE_WEEK,i) = sem then
    18. ' on a trouvé la colonne voulue
    19. Getposition = i
    20. end if
    21. end if
    22. Next i
    23. End Function

    Expert Programmation

    En VB (Tu es au bon endroit pour poser la question) ou en Excel (devine quoi, c'est pas ici qu'on traite des logiciels bureautique :sarcastic:  ) ?

    Donc en VBA, on utilise les fonctions Asc et Chr.
    Asc("A"), c'est la valeur ASCII de A, soit 65.
    Ord(Lettre) - Asc("A") + 1
    Ord(Lettre) - 64
    est donc le numéro de la lettre dans l'alphabet.

    Dans l'autre sens:
    Chr(numerodelalettre + Asc("A") - 1)
    Chr(numerodelalettre + 64)



    Public Function Lettre2NumCol(ByVal Chaine As String) As Long
    Dim i As Long, ValeurCh As Long, v As Long
    Const ChaineAlpha As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    For i = 1 To Len(Chaine)
    ValeurCh = InStr(1, ChaineAlpha, Mid(UCase(Chaine), i, 1))
    v = v * 26 + ValeurCh
    Next
    Lettre2NumCol = v
    End Function

    Public Function NumCol2Lettre(ByVal NumCol As Long) As String
    Dim i As Long, x As Long, s As String
    For i = 6 To 0 Step -1
    x = (26 ^ (i + 1) - 1) / 25 - 1
    If NumCol > x Then
    s = s & Chr(((NumCol - x - 1) \ 26 ^ i) Mod 26 + 65)
    End If
    Next i
    NumCol2Lettre = s
    End Function

    Je t'ai déjà montré la solution pour ces deux questions si tu prenais le temps de lire l'aide pour toutes les fonctions et propriétés. Quand tu as une cellule selectionnée avec Selection :p , Range ou Cells il suffit d'utiliser row ou column.

    1. Selection.row
    2. Range("B1").column
    3. Cells(10,3).row
    Expert Programmation

    De la casse ? De la case ? Sous Excel, on parle de cellule :o 

    ActiveCell.Column
    devrait faire l'affaire.

    Sinon, réflechir et se servir de l'aide d'Excel.

    EDIT: Je viens de me faire griller d'une bonne demi-heure :sarcastic: 
    Expert Programmation

    Ah mais ça dépend, cher Hougardène,

    Select/Selection est dans 99% des cas une infamie.
    Surtout le Select. Quel besoin de déplacer la sélection ?

    Si en revanche tu cherches à savoir quelle feuille, quelle cellule l'utilisateur a sélectionnées, ce qui peut être très utile, il est légitime d'utiliser Selection.

    Pour le M je me suis trompé mais bon c'était juste pour expliquer le principe :whistle: 

    Bon je l'ai expliqué mais à la va-vite, apparament tu as fini les fonctions simples qui permettent de faire le programme principal. Voilà à quoi ca doit ressembler, je suis pas sur que tu ai mis les memes noms de variables mais si tu comprends la logique alors ca ira.

    1. Private sub MajGraphique
    2. Dim i as long ' Position de la lecture des lignes du tableau des projet
    3. Dim j as long ' Position de lecture des colonnes
    4. Dim max as long ' Dernier enregistrement du nombre de projet
    5.  
    6. Dim anc_pos as variant ' élément précedent du tableau
    7. Dim pos as variant ' élément actuel du tableau
    8.  
    9. ' on détermine la fin du tableau
    10. max = Range("B65536").end(xlup).row
    11. for i = K_PREM_LIGNE to max
    12. ' réinitialisation
    13. anc_pos = null
    14. pos = null
    15. for j = K_COL_PRO to K_COL_PR4
    16. if cells(i,j) <> "" then ' pas de null en excel mais ""
    17. pos = GetPosition(cells(i,j))
    18. if not isnull(anc_pos) and not isnull(pos) then
    19. setcolor(i,anc_pos, pos -1) ' paramètre i ligne, anc_pos colonne de début , pos colonne de fin
    20. end if
    21. anc_pos = pos
    22. pos = null
    23. end if
    24. next
    25. next
    26. End sub


    Par contre il faut le cas ou tu as un project qui commence mais pas de date sur la phase suivante, est ce que tu veux colorier ou pas.
    donc setcolor doit pour les paramètres que j'ai mis remplir les cases determiner par les coordonnées, il faut surement mettre aussi en paramètre la couleur.
    Il serait bien de modifier GetPosition pour qu'elle renvoie null si elle trouve pas sinon rajouter un test après son appel
    1. if pos = -1 then pos = null


    C'est surement pas complet mais il y a la trame principale, n'oublie pas aussi de faire en sorte qu'il n'y est pas 2 fois la meme date dans 2 colonnes voisines sinon tu auras un problème

    ok merci pour cette solution
    mais j'en ai trouver une qui marche aussi
    elle est moins jolie et j'ai fais surement des erreurs :

    1. Public Const K_DEB_GRAPH = 13 'Column M
    2. Public Const K_FIRST_LINE = 9
    3. Public Const LINE_YEAR = 7
    4. Public Const LINE_WEEK = 8
    5. Public aa
    6. Public i As Long
    7.  
    8. Function GetPosition(dtdate As String) As Long
    9. Dim max As Long
    10. Dim sem As Long
    11. Dim an As Long
    12. Dim s As Long
    13.  
    14. GetPosition = -1
    15. max = Range("IV" & LINE_YEAR).End(xlUp).Column 'return the number of the last column
    16. If dtdate = "NA" Then
    17. GoTo Ends
    18. Else
    19. If dtdate = "" Then
    20. aa = 789
    21. GoTo Ends
    22. Else
    23. If dtdate = "TBC" Then
    24. GoTo Ends
    25. Else
    26. If dtdate = "TBD" Then
    27. GoTo Ends
    28. End If
    29. End If
    30. End If
    31. End If
    32. ' Jaar en Week uit datum halen
    33. an = Left(dtdate, InStr(dtdate, ".") - 1) 'ex : 7
    34. sem = Mid(dtdate, InStr(dtdate, ".") + 1) 'ex : 12
    35. For i = K_DEB_GRAPH To max
    36. s = Cells(LINE_YEAR, i)
    37. If s = an Then
    38. If Cells(LINE_WEEK, i) = sem Then
    39. ' juiste kolom gevonden
    40. GetPosition = i
    41. aa = i
    42. End If
    43. End If
    44. Next i
    45. Ends:
    46. End Function
    47.  
    48.  
    49. Sub test()
    50. Dim q, w, c, l, v, n
    51. i = 0
    52. c = Application.ActiveCell.Column
    53. l = Application.ActiveCell.Row
    54. For x = l To l + 49 'Alle lijnen afgaan
    55. For p = 117 To 13 Step -1
    56. Range(NumCol2Letter(p) & x).Interior.ColorIndex = 2
    57. Next p
    58. For z = c + 4 To c Step -1 'Alle koloms afgaan
    59. aa = 0
    60. GetPosition (Range(NumCol2Letter(z) & x))
    61. If aa = 0 Then
    62. GoTo Ends
    63. Else
    64. If aa > 700 Then
    65. GoTo Blanco
    66. End If
    67. End If
    68. If NumCol2Letter(z) = "E" Then
    69. w = 40
    70. Else
    71. If NumCol2Letter(z) = "F" Then
    72. w = 6
    73. Else
    74. If NumCol2Letter(z) = "G" Then
    75. w = 4
    76. Else
    77. If NumCol2Letter(z) = "H" Then
    78. w = 43
    79. Else
    80. If NumCol2Letter(z) = "I" Then
    81. w = 50
    82. End If
    83. End If
    84. End If
    85. End If
    86. End If
    87. For j = aa To 13 Step -1
    88. Range(NumCol2Letter(j) & x).Interior.ColorIndex = w
    89. Next j
    90. GoTo Ends
    91. Blanco:
    92. For k = 117 To 13 Step -1
    93. Range(NumCol2Letter(k) & x).Interior.ColorIndex = 2
    94. Next k
    95. Ends:
    96. Next z
    97. Next x
    98. End Sub
    99.  
    100.  
    101. Private Function Letter2NumCol(ByVal Chaine As String) As Long
    102. Dim i As Long, ValeurCh As Long
    103. Const ChaineAlpha As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    104. For i = 1 To Len(Chaine)
    105. ValeurCh = InStr(1, ChaineAlpha, Mid(UCase(Chaine), i, 1))
    106. Letter2NumCol = Letter2NumCol * 26 + ValeurCh
    107. Next
    108. End Function
    109.  
    110.  
    111. Private Function NumCol2Letter(ByVal NumCol As Long) As String
    112. Dim i As Long, x As Long, n As String
    113. For i = 6 To 0 Step -1
    114. x = (26 ^ (i + 1) - 1) / 25 - 1
    115. If NumCol > x Then
    116. n = n & Chr(((NumCol - x - 1) \ 26 ^ i) Mod 26 + 65)
    117. End If
    118. Next i
    119. NumCol2Letter = n
    120. End Function

    C'est surtout l'utilisation de lettre en dur qui risque de poser problème, si un jour il rajoute une colonne plus rien ne fonctionne et tu devras tout reprendre ton code d'ou l'utilisation de constante pour limiter la casse en cas de changement
    Lassé par la pub ? Créez un compte