Graphique croisé dynamique
Re,
Encore une petite modification de post ahah !
Le problème est que je ne peux pas modifier le fichier original car je n'ai pas les "droits" pour le faire. Je peux juste le copié coller et apporter des modifications dessus.
Re,
Ah...
Dans ce cas... Je pense qu'il faudra que tu copies manuellement les informations du fichier original pour mettre à jour l'autre fichier
Re,
Ah... mince bon tant pis merci tout de même Ausecour
Bonjour Ausecour,
J'ai une petite question...
J'ai rajouter les colonnes (équipement et AR) dans le tableau, mais du coup le "gantt" ne fonctionne plus. Je vous met le fichier en PJ.
Ou est-ce-que je dois modifier la valeur des colonnes dans le programme afin que le "gantt" se remette à fonctionner?
Merci
Bonjour
Etant donné que tu as modifié la zone de travail, il faut modifier plusieurs choses:
- initialisation du tableau de travail:
Maintenant il faut mettre av et non plus ao en colonne de fin, ce qui donne:
tableau = .Range("a14", "av" & der_lig) - le tableau des colonnes: comme on a déplacé la zone, les colonnes de travail ne sont plus les mêmes
devient alors:
Comme tu as rajouté 6 colonnes, il faut tout décaler de 6
En faisant ces modifications, tout semble fonctionner correctement
Je t'envoie le fichier avec modification, j'ai changé une autre chose car j'avais mis la constante 21, qui fait référence au deuxième élément du tableau colonne, j'ai donc remplacé 21 par colonne(1):
Re,
Merci pour tes explications et ton aide ! Si j'en ai d'autres à rajouter je serais faire maintenant !
Et, y'a t-il quelque chose à changer dans le programme aussi si je veux rajouter des chantiers (par exemple ligne 126 ou entre deux chantiers) colonne A et qu'ils se mettent directement dans le "gant" à la bonne place (celle correspondante aux chantiers rentrés dans la "Feuille1"?
Petite modification du poste précédent.
Re
Non, il n'y aura rien à changer, il faudra juste resélectionner le code de l'ouvrier pour mettre à jour le Gantt.
Re,
Ok merci pour les infos précieuses
Re,
Je me demandais, est-il possible d'ajouter une maccro permettant de mettre en surbrillance (rouge) les cases 'AR' (colonnes K,M) des "équipements tps réels" lorsque celles-ci sont supérieures à celles des "équipements temps théoriques" (colonnes G,I). Exemple mettre en surbrillance colonne K,M si colonnes G,I < colonnes K,N.
Exemple si dans colonne G on a "S25" & dans colonne I on a "S30" alors si colonne K > colonne G (S25) et N > colonne I (S30) alors mettre en surbrillance colonne K et N. Est-il possible de le faire même si on rentre un nouveau chantier ou faut-il rentré manuellement la subrillance à chaque nouveau chantier?
Re
C'est possible de faire ça via une mise en forme conditionnelle oui, tu peux facilement mettre en forme des cellules d'après des tests, il faut juste voir ce que tu veux vraiment, par contre, comme tes tableaux ne sont pas déclarés dans le gestionnaire de noms, la mis en forme ne suivra pas si tu ajoutes des lignes, sauf si tu mets la mise en forme sur toutes les colonnes, ou que tu ajoutes une ligne en l'insérant entre deux lignes déjà existantes du tableau.
Voilà
Bonjour Ausecour,
Juste pour te tenir au courant, le programme et le gantt fonctionne à merveille, je suis ravis ! Encore merci !
Petite question que j'avais déjà du te poser, en fait j'ai fichier tableau final que tu m'as envoyé (qui comprend : ""gantt", "feuille1", "liste" et "BDD retard") et j'en ai un autre sans le programme et avec quelques différences (qui comprends : réception matériel", "matériels livrés" et "planning PROD").
Comment faire pour remplacer dans le fichier de base la feuille "planning prod" par le fichier avec le tableau final sans qu'il y est un impact sur les autres feuilles (réception matériel, matériels livrés)?
Merci par avance
Bonjour,
Si je comprends bien, tu as juste des feuilles en plus, il faut juste changer les noms des feuilles auquel le programme fait référence, en clair, regarder si tu as "Feuil1", que ce soit toujours la bonne feuille, et que ça ne soit pas "Feuil2", sinon il faudra faire le changement dans le programme.
Bonjour,
En fait j'ai le même fichier avec des feuilles à peux prêt similaires, mais je n'ai pas la modification qu'on a apporté sur celui-ci (programme, gantt, etc..).
Lorsque j'essaye de copié les 4 feuilles du fichier modifié (celui avec le programme) et que je les colles dans le fichier de base (celui sans modifications) cela me met un message d'erreur (image ci-joint).
Je ne comprends pas pourquoi car je colle également le programme avec les 4 feuilles.
Bonjour,
Copier les feuilles ne suffit pas, il faut également copier le code du module qui est dans le fichier, comme tu ne l'as pas fait, la sub gantt n'existe pas dans ton second fichier, si tu copies colle le code dans un module, ça pourra ainsi appeler le programme
Re,
Ce n'est pas un code se trouvant dans une feuille, mais dans un module, tu peux le trouver dans "Module1" :
Sub gantt()
Application.ScreenUpdating = False
'Initialisations
ouvrier = Range("b1")
larg_defaut = 7
If ouvrier = "" Then Exit Sub
Dim TabChantier As Variant, TabSemaines As Variant, TabHeures As Variant, TabRetards As Variant
Dim CollecSem As New Collection, CollecSomme As New Collection, CollecRetard As New Collection, CollecRetardInduit As New Collection
Dim forme As Shape
Dim cel As Range
Columns("B:BA").ColumnWidth = larg_defaut
larg_cel_defaut = Range("b1").Width
colonnes = Array(16, 27, 32, 35, 40, 45, 48)
With Feuil1
der_lig = .Range("a" & Rows.Count).End(xlUp).Row
tableau = .Range("a14", "av" & der_lig)
End With
ReDim TabChantier(LBound(tableau, 1) To UBound(tableau, 1), 1 To 3) 'semaine, heures,nom chantier
'Enregistrement dans TabChantier des heures et des semaines
For i = LBound(tableau, 1) To UBound(tableau, 1)
If tableau(i, colonnes(1)) <> "" Then
TabChantier(i, 3) = tableau(i, 1) & " " & tableau(i, 2)
For j = LBound(colonnes, 1) To UBound(colonnes, 1) - 1
col_dep = colonnes(j)
col_fin = colonnes(j + 1) - 1
If tableau(i, col_dep) = ouvrier Then
For k = col_dep + 1 To col_fin Step 2
semaine = tableau(i, k)
heures = tableau(i, k + 1)
If semaine <> "" And heures <> "" Then
TabChantier(i, 1) = TabChantier(i, 1) & IIf(TabChantier(i, 1) = "", "", ",") & semaine
TabChantier(i, 2) = TabChantier(i, 2) & IIf(TabChantier(i, 2) = "", "", ",") & heures
End If
Next k
End If
Next j
End If
Next i
'Tri du tableau TabChantier par semaines
For i = LBound(TabChantier, 1) To UBound(TabChantier, 1)
TabSemaines = Split(TabChantier(i, 1), ",")
TabHeures = Split(TabChantier(i, 2), ",")
If UBound(TabSemaines, 1) > LBound(TabSemaines, 1) Then
lig = LBound(TabSemaines, 1)
Do
Min = CDbl(TabSemaines(lig))
For h = lig + 1 To UBound(TabSemaines, 1)
If CDbl(TabSemaines(h)) < Min Then
memoire = TabSemaines(lig)
TabSemaines(lig) = TabSemaines(h)
TabSemaines(h) = memoire
memoire = TabHeures(lig)
TabHeures(lig) = TabHeures(h)
TabHeures(h) = memoire
End If
Next h
lig = lig + 1
Loop While lig < UBound(TabSemaines, 1)
txtsem = ""
txth = ""
For h = LBound(TabSemaines, 1) To UBound(TabSemaines, 1)
txtsem = txtsem & IIf(txtsem = "", "", ",") & TabSemaines(h)
txth = txth & IIf(txth = "", "", ",") & TabHeures(h)
Next h
TabChantier(i, 1) = txtsem
TabChantier(i, 2) = txth
End If
Next i
'Enregistrement des retards dans la collection
TabRetards = Range("retards[#All]")
For i = LBound(TabRetards, 1) + 1 To UBound(TabRetards, 1)
CollecRetard.Add TabRetards(i, 4), TabRetards(i, 1) & TabRetards(i, 2) & TabRetards(i, 3)
Next i
'suppression des formes
For Each forme In Feuil2.Shapes
If Right(forme.Name, 5) = "gantt" Then
forme.Delete
End If
Next forme
der_lig = 4 + UBound(TabChantier, 1) - 1
Range("a4", "a" & der_lig) = ""
On Error Resume Next
'Parcours du tableau des chantiers
For i = LBound(TabChantier, 1) To UBound(TabChantier, 1)
lig = 4 + i - 1
Range("a" & lig) = TabChantier(i, 3)
If Not TabChantier(i, 1) = "" Then
TabSemaines = Split(TabChantier(i, 1), ",")
TabHeures = Split(TabChantier(i, 2), ",")
'ajout forme
For h = LBound(TabSemaines, 1) To UBound(TabSemaines, 1)
'initialisations
nsem = CStr(TabSemaines(h))
clé = TabChantier(i, 3) & ouvrier & nsem
valretard = 0
valretard = CollecRetard(clé)
retardinduit = 0
retardinduit = CollecRetardInduit(nsem)
retard = False
heures = CDbl(TabHeures(h))
Do
'calcul des valeurs de variables
somme = 0
somme = CollecSomme(nsem)
dec_gauche = 0
dec_gauche = CollecSem(nsem)
col = Range("b3", "ba3").Find(CDbl(nsem), lookat:=xlWhole).Column
Set cel = Cells(lig, col)
pos_gauche = cel.Left + dec_gauche
pos_haut = cel.Top
hauteur = cel.Height
If Not retard Then
If somme + heures - retardinduit <= 39 Then
couleur = RGB(125, 125, 255)
largeur = cel.Width * WorksheetFunction.Min(39 - somme, heures) / 39
valretard = valretard + (heures - WorksheetFunction.Min(39 - somme, heures))
Else
couleur = RGB(255, 50, 50)
cel.ColumnWidth = larg_defaut * ((somme + heures - retardinduit) / 39)
largeur = cel.Width - dec_gauche
valretard = valretard + retardinduit
End If
Else
couleur = RGB(0, 0, 0)
heures = WorksheetFunction.Min(IIf(somme >= 39, 0, 39 - somme), valretard)
valretard = valretard - heures
largeur = cel.Width * (heures / 39)
End If
'gestion de la forme
Set forme = Feuil2.Shapes.AddShape(msoShapeRectangle, pos_gauche, pos_haut, largeur, hauteur)
forme.Line.Visible = msoFalse
forme.Name = forme.Name & "gantt"
forme.Fill.ForeColor.RGB = couleur
forme.Placement = xlMove
Set forme = Nothing
If Not retard Then
'ajout de la barre si besoin
If somme + heures - retardinduit > 39 Then
Xdep = cel.Left + larg_cel_defaut
Ydep = cel.Top
Xfin = Xdep
Yfin = Ydep + cel.Height - 1
'prévoir l'ajout de la barre pour indiquer les 39h ici
Set forme = Feuil2.Shapes.AddConnector(msoConnectorStraight, Xdep, Ydep, Xfin, Yfin)
With forme.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
.DashStyle = msoLineSysDash
End With
With forme.Line
.Visible = msoTrue
.Weight = 1
End With
forme.Name = forme.Name & "gantt"
forme.Placement = xlMove
Set forme = Nothing
End If
End If
'gestion des collections
CollecSem.Remove (nsem)
CollecSem.Add dec_gauche + largeur, nsem
CollecSomme.Remove (nsem)
CollecSomme.Add somme + heures, nsem
If retard Then
If valretard > 0 Then
retardinduit = valretard
nsem = CStr(nsem + 1)
CollecRetardInduit.Remove nsem
CollecRetardInduit.Add retardinduit, nsem
clé = TabChantier(i, 3) & ouvrier & nsem
End If
End If
Set cel = Nothing
retard = True
Loop While valretard > 0
Next h
End If
Next i
'Mise en forme
Columns("A:A").EntireColumn.AutoFit
der_lig = Range("a" & Rows.Count).End(xlUp).Row
der_col = Cells(3, Columns.Count).End(xlToLeft).Column
Set plage = Range("B4", Cells(der_lig, der_col))
plage.Borders(xlDiagonalDown).LineStyle = xlNone
plage.Borders(xlDiagonalUp).LineStyle = xlNone
plage.Borders(xlInsideHorizontal).LineStyle = xlNone
With plage.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With plage.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With plage.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With plage.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With plage.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
Application.ScreenUpdating = True
End Sub
Re,
Oui, mais je n'arrive pas à le copier dans mon nouveau classeur, cela me met toujours un message d'erreur...
Je te détail ce que je fais :
1) Copie des feuilles "gantt", " Feuille1", "Liste" dans un nouveau classeur :
2) J'essaye de changer d'ouvrier pour voir si cela fonctionne, cela me met un message d'erreur :
3) Je remplace ce message par le code module1 dans le nouveau classeur :
4) Lorsque je change d'ouvrier avec le bouton, plus rien ne ce passe ...
J'ai vraiment du mal à comprendre la démarche à réaliser..
Re, c'est parce que tu copies le code du Module 1 dans la feuille gantt, ce qu'il ne faut pas faire, la feuille gantt garde son code qui appelle le programme "gantt", le code que je t'ai donné, il faut créer un module dans ton fichier pour le coller dedans, ce code n'est pas à mettre dans une feuille. Pour créer un module, tu fais un clic droit et ça te proposera d'ajouter un module, tu le fais, et tu colles le code dedans