Excel VBA

Fermé
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014 - Modifié par mido_ing le 11/12/2014 à 22:29
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014 - 15 déc. 2014 à 17:11
Bonjour,

je suis en train de configurer une formulaire sur Excel vba pour générer une horaire de mécanos.


Tableau excel : ( https://www.cjoint.com/?DLlwHU8uCsf

ressources en X
journée en Y



Paramètres :
Nom de la ressource
Journée
nombre d'heure
description du travail


ma problématique est que pour chaque ressources (mécanos) que je possède et pour chaque journée de la semaine, il faudrait que je copie le code actuel et que je modifie mes coordonnées de Range définis dans mon code, Ce que je trouve un peu nul, car je suis persuadé qu'il y a une forme de boucle que je pourrai faire pour couvrir le tout.

Car le principe est simple , je sélectionne le mécano, ensuite la journée, ensuite le nombre d'heures à bosser, la catégorie et le détail du travail.
Par la suite je viens fusionner et colorier le nombre de cellule en fonction du nombre d'heures (chaque cellule vaut une heure dans tableau) et je viens finalement transposer l'information de la catégorie et du détail du travail.

Pouvez vous m'aider SVP

Private Sub UserForm_Initialize()


With ComboBox1
.AddItem "CONRAD"
.AddItem "MATHIEU"
.AddItem "MARTIN"
.AddItem "MICHAEL"
.AddItem "RICHARD"
.AddItem "WILLIAM"
.AddItem "WILLIAM"


End With

With ComboBox2
.AddItem "1"
.AddItem "2"
.AddItem "3"
.AddItem "4"
.AddItem "5"
.AddItem "6"
.AddItem "7"
.AddItem "8"
.AddItem "8"
End With


With ComboBox3
.AddItem "Lundi"
.AddItem "Mardi"
.AddItem "Mercredi"
.AddItem "Jeudi"
.AddItem "Vendredi"
.AddItem "Samedi"
.AddItem "Dimanche"
End With


With ComboBox4
.AddItem "Client"
.AddItem "Location"
.AddItem "Vente"
.AddItem "Service"
.AddItem "Abscent"

End With


End Sub


Sub CommandButton1_Click()


'CONRAD : LUNDI 8 heures

If Me.ComboBox1.Value = "CONRAD" And Me.ComboBox3.Value = "Lundi" And Me.ComboBox2.Value = 8 Then
Range("B4:B11").UnMerge
Range("B4:B11").Merge
Range("B4:B11").Value = ComboBox4.Value
'Range("B4:B11").Borders.LineStyle = xlContinuous
Range("C4:C11").UnMerge
Range("C4:C11").Merge
Range("C4:C11").Value = ComboBox2.Value
'Range("B4:B11").Borders.LineStyle = xlContinuous
Range("D4:D11").UnMerge
Range("D4:D11").Merge
Range("D4:D11").Value = TextBox1.Value
'Range("B4:B11").Borders.LineStyle = xlContinuous


'Color codes by catégorie of activity

If ComboBox4.Value = "Client" Then

Range("B4:B11").Interior.Color = RGB(153, 204, 255)

ElseIf ComboBox4.Value = "Location" Then

Range("B4:B11").Interior.Color = RGB(255, 255, 0)

ElseIf ComboBox4.Value = "Vente" Then

Range("B4:B11").Interior.Color = RGB(153, 204, 0)

ElseIf ComboBox4.Value = "Service" Then

Range("B4:B11").Interior.Color = RGB(255, 204, 0)

ElseIf ComboBox4.Value = "Abscent" Then

Range("B4:B11").Interior.Color = RGB(192, 192, 192)

End If



'CONRAD : LUNDI 7 heures

ElseIf Me.ComboBox1.Value = "CONRAD" And Me.ComboBox3.Value = "Lundi" And Me.ComboBox2.Value = "7" Then
Range("B4:B10").UnMerge
Range("B4:B10").Merge
Range("B4:B10").Value = ComboBox4.Value
Range("B4:B10").Borders.LineStyle = xlContinuous
Range("C4:C10").UnMerge
Range("C4:C10").Merge
Range("C4:C10").Value = ComboBox2.Value
Range("C4:C10").Borders.LineStyle = xlContinuous
Range("D4:D10").UnMerge
Range("D4:D10").Merge
Range("D4:D10").Value = TextBox1.Value
Range("D4:D10").Borders.LineStyle = xlContinuous


'Color codes by catégorie of activity

If ComboBox4.Value = "Client" Then

Range("B4:B10").Interior.Color = RGB(153, 204, 255)

ElseIf ComboBox4.Value = "Location" Then

Range("B4:B10").Interior.Color = RGB(255, 255, 0)

ElseIf ComboBox4.Value = "Vente" Then

Range("B4:B10").Interior.Color = RGB(153, 204, 0)

ElseIf ComboBox4.Value = "Service" Then

Range("B4:B10").Interior.Color = RGB(255, 204, 0)

ElseIf ComboBox4.Value = "Abscent" Then

Range("B4:B10").Interior.Color = RGB(192, 192, 192)

End If

'CONRAD : LUNDI 6 heures

ElseIf Me.ComboBox1.Value = "CONRAD" And Me.ComboBox3.Value = "Lundi" And Me.ComboBox2.Value = "6" Then
Range("B4:B9").UnMerge
Range("B4:B9").Merge
Range("B4:B9").Value = ComboBox4.Value
Range("B4:B9").Borders.LineStyle = xlContinuous
Range("C4:C9").UnMerge
Range("C4:C9").Merge
Range("C4:C9").Value = ComboBox2.Value
Range("C4:C9").Borders.LineStyle = xlContinuous
Range("D4:D9").UnMerge
Range("D4:D9").Merge
Range("D4:D9").Value = TextBox1.Value
Range("D4:D9").Borders.LineStyle = xlContinuous


'Color codes by catégorie of activity

If ComboBox4.Value = "Client" Then

Range("B4:B9").Interior.Color = RGB(153, 204, 255)

ElseIf ComboBox4.Value = "Location" Then

Range("B4:B9").Interior.Color = RGB(255, 255, 0)

ElseIf ComboBox4.Value = "Vente" Then

Range("B4:B9").Interior.Color = RGB(153, 204, 0)

ElseIf ComboBox4.Value = "Service" Then

Range("B4:B9").Interior.Color = RGB(255, 204, 0)

ElseIf ComboBox4.Value = "Abscent" Then

Range("B4:B9").Interior.Color = RGB(192, 192, 192)

End If


ElseIf Me.ComboBox1.Value = "CONRAD" And Me.ComboBox3.Value = "Lundi" And Me.ComboBox2.Value = "5" Then
Range("B4:B8").UnMerge
Range("B4:B8").Merge
Range("B4:B8").Value = ComboBox4.Value

ElseIf Me.ComboBox1.Value = "CONRAD" And Me.ComboBox3.Value = "Lundi" And Me.ComboBox2.Value = "4" Then
Range("B4:B7").UnMerge
Range("B4:B7").Merge
Range("B4:B7").Value = ComboBox4.Value

ElseIf Me.ComboBox1.Value = "CONRAD" And Me.ComboBox3.Value = "Lundi" And Me.ComboBox2.Value = "3" Then
Range("B4:B6").UnMerge
Range("B4:B6").Merge
Range("B4:B6").Value = ComboBox4.Value

ElseIf Me.ComboBox1.Value = "CONRAD" And Me.ComboBox3.Value = "Lundi" And Me.ComboBox2.Value = "2" Then
Range("B4:B5").UnMerge
Range("B4:B5").Merge
Range("B4:B5").Value = ComboBox4.Value

End If

End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

6 réponses

eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
11 déc. 2014 à 22:14
Bonjour,

tu peux mettre en forme le code dans ton post avec l'icone '<>' parce que là c'est indigeste.
Mieux encore, déposer un fichier xls sur cjoint.com et coller ici le lien fourni.

Et soit plus précis.
pour ne pas avoir à coder chaque possibilité de ressource...
C'est quoi ça ?

Plus la demande est agréable et bien expliquée en détail, plus tu as de chance d'intéresser qq'un.
eric
0
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014
11 déc. 2014 à 22:36
Bon désolé je me suis peut-être mal expliqué,

Mais bon tu peux voir mon code en pièce jointe

http://www.cjoint.com/confirm.php?cjoint=DLlwHU8uCsf,

sinon ma problématique est que pour chaque ressources (mécanos) que je possède et pour chaque journée de la semaine, il faudrait que je copie le code actuel et que je modifie mes coordonnées de Range définis dans mon code, Ce que je trouve un peu nul, car je suis persuadé qu'il y a une forme de boucle que je pourrai faire pour couvrir le tout.

Car le principe est simple , je sélectionne le mécano, ensuite la journée, ensuite le nombre d'heures à bosser, la catégorie et le détail du travail.
Par la suite je viens fusionner et colorier le nombre de cellule en fonction du nombre d'heures (chaque cellule vaut une heure dans tableau) et je viens finalement transposer l'information de la catégorie et du détail du travail.

J'espère que c'est plus clair.

Merci d'avance les amis
0
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 950
11 déc. 2014 à 22:14
Salut le Forum

Merci de joindre un fichier en utilisant https://www.cjoint.com/
et recopie le lien fourni dans ton prochain message.

Mytå
0
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014
11 déc. 2014 à 22:30
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
Modifié par eriiic le 12/12/2014 à 00:06
Déjà il faut supprimer tes fusions de cellules sur les jours qui gênent.
Souvent totalement inutiles, tu peux agrandir la ligne 1 et 'centrer sur plusieurs colonnes'
Ensuite :
Sub CommandButton1_Click()
'
Dim lig As Long, col As Long
lig = [A:A].Find(ComboBox1, LookIn:=xlValues, lookat:=xlWhole).Row
col = [1:1].Find(ComboBox3, LookIn:=xlValues, lookat:=xlWhole).Column
te donne la position qui t'intéresse.
Avec cells(lig,col).offset(offset_ligne, offset_colonne) tu peux atteindre les cellules qui t'intéressent.
Le début : https://www.cjoint.com/c/DLmamtkSTGt
Attention, j'ai supprimé la ligne 2, tiens en compte pour tes positions de cellules.

eric

PS: désolé, la mise en forme du code est en panne...
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
0
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014
12 déc. 2014 à 16:06
Merci beaucoup pour ta réponse, mais bon peut-être c'est parce que je suis débutant en VBA mais je ne vois pas comment avec les lignes de codes que tu m'a rajouté je vais réussir à avoir une boucle qui couvre toutes mes alternatives de choix de ressources et de journées tout en couvrant toutes les plages sans que ce soit un code roman, mais bon lorsque j'exécute ton code j'ai une erreur de compilation bizarre. C'est très floue pour moi je n'arrive pas à l'intégrer avec le reste du code pour avoir le résultat escompté et jai passé quelques heures à essayer de le décortiquer et jouer avec la portion de code que tu m'a rajouté tout en la complétant mais NADA :(

Merci l'ami !
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
12 déc. 2014 à 18:45
Exemple complété en mettant l'heure, en fusionnant une plage et la colorant.
Ca t'éclairera un peu plus pour commencer
Ca sert à quoi de défusionner pour refusionner juste après ? Ca m'intrigue.
Je ne vais pas tout te faire. Il faudrait décortiquer ton code (d'ailleurs tu pourrais nommer tes textbox qu'on sache directement à quoi on a affaire) alors que tu pourrais simplement expliquer.
https://www.cjoint.com/?DLmsUlUA7uS

eric
0
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014
12 déc. 2014 à 20:33
Regarde j'ai fait une petite modif dans ton code , car le but c'est de fusionner le nombre de cellule en fonction du nombre d'heure. Car dans une journée pour un employé il faudrait que je puisse effectuer plusieurs activités donc la fusion des cellules devient importante. Lorsque tu veux refaire une horaire pour une nouvelle semaine et que tu part d'une grille déja pleine de ce qui avait été cédulé la semaine d'avant et bien lorsque tu met exemple 4h le lundi matin et que précédément c'était fusionné pour 8h et bien ca ne marchait pas. voilà pourquoi je défusionner avant de refussioner ;) . Mais sinon j'ai mis un bouton effacer qui permet d'effacer toute la grille, je crois que ce sera plus efficace.

Mais j'ai un autre petit souci, tu vois il faudrait que je puisse fusionner la colonne heures et détails proportionnelement à celle de job. Comme le tout est déclencher en fonction de la valeur dans mon combobox2 (nbr d'heures)­ j' ai un peu de difficulté avec la syntaxe que tu ma mis pour l'attribuer sur les deux autre colonnes. C'est peut-être du fait que je ne pige que dal à ces deux lignes de codes lolll

lig = [A:A].Find(ComboBox1, LookIn:=xlValues, lookat:=xlWhole).Row
col = [1:1].Find(ComboBox3, LookIn:=xlValues, lookat:=xlWhole).Column

Mais bon on est pas loin du résultat finale, ton aide est plus qu'apprécié l'ami !!

Voilà le lien avec un exemple du résultat final et avec mes modifs

http://www.cjoint.com/14dc/DLmuNHP0yIB.htm

Merci beaucoup Éric :)


Sub CommandButton1_Click()

Dim i As Integer

'CONRAD : LUNDI 8 heures
Dim lig As Long, col As Long
lig = [A:A].Find(ComboBox1, LookIn:=xlValues, lookat:=xlWhole).Row
col = [1:1].Find(ComboBox3, LookIn:=xlValues, lookat:=xlWhole).Column

' mettre valeur
Cells(lig, col).Offset(, 1) = ComboBox2



For i = 1 To ComboBox2.Value


With Cells(lig, col).Resize(i)
' fusionner
.Merge
' couleur
Select Case ComboBox4

Case "Client"
.Interior.Color = RGB(153, 204, 255)
Case "Location"
.Interior.Color = RGB(255, 255, 0)
Case "Vente"
Interior.Color = RGB(153, 204, 0)
Case "Service"
Interior.Color = RGB(255, 204, 0)
Case "Abscent"
Interior.Color = RGB(192, 192, 192)

End Select
End With
Next
0
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014 > mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014
12 déc. 2014 à 22:14
Salut bon je me suis beaucoup avancé, grâce à ton coup de pouce, j'ai réussi a décortiquer tes fonctions au final elles sont super simple, mais sincèrement je n' y aurai jamais pensé.

Mais J'ai quelques petits soucis avec une boucle que j'ai instauré pour pouvoir mettre à l'horaire, plusieurs activités pour la même ressource, dans la même journée et le tout pour un maximum de 8hrs bien sûre.

Du moindrement que j'essaye de booker plus de 3 activités il y a des bug au niveau du formatage. Ou même booker 3 activité de la même catégorie mais avec un détail différent

Exemple: 2h client, 2h location, 4h vente

Exemple : 2h client (Détails 1234), 2h client (Détail 4321), client 2h (Détail 54342)

Si quelqu'un peut jeter un coup d'oeil sur les boucles de vérification de cellule et m'aider à l'optimiser car je bloque.

Merci l'ami


Dernier update https://www.cjoint.com/?DLmwuWaXfXF https://www.cjoint.com/?DLmwuWaXfXF


'
Fonction de vérification si la cellule es fusionné (Fonction test)

Function IsMerged(rCell As Range) As Boolean
' Returns true if referenced cell is Merged
IsMerged = rCell.MergeCells
End Function



Sub CommandButton1_Click()

Dim i As Integer
Dim y As Integer
Dim iMax As Integer


'CONRAD : LUNDI 8 heures
Dim lig As Long, col As Long
lig = [A:A].Find(ComboBox1, LookIn:=xlValues, lookat:=xlWhole).Row
col = [1:1].Find(ComboBox3, LookIn:=xlValues, lookat:=xlWhole).Column

' mettre valeur
Cells(lig, col).Offset(, 1) = ComboBox2
Cells(lig, col).Offset(, 2) = TextBox1

'Vérification de cellules vide pour remplir le reste de la plage libre de la journée avec un Maximum de 8h à céduler

iMax = lig + 7
For y = lig To (lig + ComboBox2.Value) And (y <= iMax)

If IsMerged(Cells(lig, col)) Then

lig = lig + 1

Else:

Exit For

End If

Next

'Boucle pour remplir la colonne Job et détail en fonction du nombre d'heures sélectionnés

For i = 1 To ComboBox2.Value And (lig + ComboBox2.Value - 1) <= iMax


With Cells(lig, col).Resize(i)
' fusionner
.Merge
.Value = ComboBox4.Value
' couleur
Select Case ComboBox4

Case "Client"
.Interior.Color = RGB(153, 204, 255)
Case "Location"
.Interior.Color = RGB(255, 255, 0)
Case "Vente"
.Interior.Color = RGB(153, 204, 0)
Case "Service"
.Interior.Color = RGB(255, 204, 0)
Case "Abscent"
.Interior.Color = RGB(192, 192, 192)

End Select
End With

With Cells(lig, col + 1).Resize(i)
' fusionner
.Merge
.Value = ComboBox4.Value
' couleur
End With

With Cells(lig, col + 2).Resize(i)
' fusionner
.Merge
.Value = TextBox1.Value
' couleur

End With
Next
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
12 déc. 2014 à 22:55
Ok mais j'avais commencé à travailler avec ton ancienne version.
https://www.cjoint.com/?DLmxaZNIUED
Tu as trouvé comment fonctionnait lig et col ?

eric
0
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014
15 déc. 2014 à 15:41
Oui merci beaucoup grâce à ton aide je me suis beaucoup avancé, mais maintenant c'est plutôt avec la boucle de reconnaissance de prochaine cellule disponible avec laquelle j'ai un problème.

J'ai fait une fonction qui détecte si tes cellules sont fusionnées et le but est que je valide si la prochaine plage est disponible.

Lorsque je veux booker plusieurs activités (pour un max de 8h) dans la même journée j'ai quelques bugs au niveau des fusions des cellules, au bout de la troisième au lieu de fusionner les cellules disponible, mon code écrase et refusionne des cellules déjà fusionnés.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
15 déc. 2014 à 16:03
Pas bonjour non plus,

Pas de soucis comme ça sur la dernière version que j'ai mise.
eric
0
mido_ing Messages postés 8 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 15 décembre 2014
15 déc. 2014 à 17:11
Désolé j'ai pas compris ??
0