Macros appel procédure
Bonjour à toutes et tous,
je cherche à simplifier ma macro sur laquelle j'ai travaillé beaucoup de temps. Voici en pièce jointe mon fichier.
Pour vous expliquer : lorsqu'une date de maintenance préventive à effectuer sur une machine est égale à jour J - 7 à -4 jours, les boutons concernés passent en jaune
Si la date est arrivée à J- 3 à J- 1, les boutons passent en orange
Si la date est à Jour J et quelques soient le nombre de jours dépassés, les boutons passent en rouge
A chacune de ces périodes, lorsque le technicien de maintenance a terminé sa tâche de travail, il clique sur le bouton et celui-ci passe en vert pendant 16 heures pour montrer aux équipes suivantes que la maintenance a été effectuée.
Lorsque les boutons sont en gris, en cliquant dessus, il est considéré par le technicien de maintenance qu'il a fait une maintenance anticipative et le bouton passe en bleu jusqu'à la prochaine alarme d'état de maintenance préventive.
J'ai donc besoin de simplifier mon code car comme vous le verrez, il est très long et surtout répétitif.
J'ai besoin qu'avec chacun de ces boutons qu'une seule procédure soit appelée, en cliquant sur le bouton, que le couleur verte ou bleue soit sur le bouton d'appel
Activez les macros et pour sortir des userforms, en haut à gauche, il y a un bouton nommé sortir. Cliquez dessus et mettre le code "0000" et taper Entrée
Merci pour votre aide
Bonjour,
Il y a quand même un truc que je trouve bizarre c'est :
Pourquoi réécrire à chaque ouverture le libellé des cellules A1:A45 puisqu'il existe déjà ?
Si tu n'a pas de justification simple et plausible à mon avis ça fait déjà 45 lignes de moins...
Pour le reste il va falloir prendre patience parce qu'il y a du lourd !
A+
Eh bien cela est dans le cas où par inadvertance un individu ( moi y comprit) efface par mégarde une cellule et aussi avoir la main en Modal pour changer des dates de prochaine maintenance, à rallonger ou diminuer en fonction des besoins préventifs des équiepements
C'est normal qu'il y ait 2 rattrapeur 3 dans le GR7 ? (ligne 5 et ligne 9)
Tu te réfères toujours à la colonne C qui contient la Date du jour.
Ne serait ce pas plus simple de se référer à la date du jour ?
Y a t il une chance pour que dans cette colonne on puisse trouver autre chose que la date du jour ?
EDIT : Après avoir pas mal trituré le problème, je passe la main sur ce sujet trop mal ficelé :
Je ne pense pas possible d'optimiser de manière significative ce code ou les Userform se réfèrent à de multiple feuilles et à d'autres UserForm et ou il n'y a aucune stratégie de nommage des contrôles : Il faut quasiment coder contrôle par contrôle et ligne par ligne...
Désolé.
A+
Bonsoir,
J'ai regardé par curiosité... !
Bon ! Dès le départ, un Userform qui dépasse la taille de mon écran ! Je n'interviens pas, cela devient vite une acrobatie invraisemblable...
En vue rapide, j'aurais tendance à considérer qu'il y a trop de Userforms et trop de modules.
Simplifier serait une bonne chose... mais la simplification se prépare à la conception. Après réalisation, cela devient vite impraticable.
Si cela fonctionne comme prévu, tu peux attendre la prochaine nécessité de révision conséquente du programme pour remettre l'ensemble en chantier.
Cordialement.
Un salut à Galopin.
Bonsoir Ferrand,
Oui, de nombreux blocs de code sont redondants et pas optimisés pour être réutilisés.
Mais le pire problème ce sont des séries de codes qui commencent avec
Range("E2")/CommandButton2/TextBox20
Range("E3")/CommandButton3/TextBox19
Range("E4")/CommandButton3/TextBox18
'... et la suite
Range("E18")/CommandButon18/TextBox4
...(Trou dans la numérotation / Exception ?)
Range("E22")/CommandButon22/TextBox23
Range("E23")/CommandButon23/TextBox24
Moi un foutoir comme ça, je sais pas faire...
Je ne te cause même pas de la palette de couleur qui utilise alègrement simultanément vbRed, RGB(255,160,0) ou &HFFFF00 mais pas du tout les Long...
Ça serait un peu mieux pensé on pourrait passer de 455 lignes de code à 15 multiplié par une bonne douzaine de fois, sans même parler de module de classe... Mais là les bras m'en tombent !
Je ne veux pas chasser les TextBox dans les Userform pour les renommer. c'est un boulot de ouf...
Sur le nombre de UserForm, je n'ai pas trop creusé aussi j'ai un peu de mal à me faire une opinion : peut-être qu'un multipage résoudrait un peu le problème des Hide/Show et des redondance ?? Après ça dépend un peu s'il y a des arrière-pensées : S'il y a encore une demi douzaine d'autres UserForm en vue, ça va pas le faire, sinon ça serait jouable...
Dans tous les cas ça dépasse un peu le cadre de ce forum !
A+
Bonjour à tous,
Comme spécifié par galopin01, le code est loin d'être optimisé, pour ma part, je m'y perds...
MFerrand souligne l'importance de la conception initiale, la réflexion doit être orientée au plus simple :
- un tableau avec les données initiales (noms actions, dates butoirs, périodes, autres...)
- un tableau (ou colonnes supplémentaires) pour inscrire les résultats.
- une interface visuelle le plus simple possible pour les utilisateurs
- un code pour un calcul, éviter la redondance.
Cela est loin de votre projet, mais voici un exemple de ce qui est possible de faire avec moins de 70 lignes de code.
Suite à une notification d'Andre13, fichier modifié, merci Andre13.
- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour toutes et tous
juste à déclarer la variable Thihii
Dim w As Variant
aussi non de mon côté cela affiché une petite erreur
merci en tout cas
Sub details()
Dim a As Variant
Dim b As String
Dim d As Long
Dim x As Long
Dim y As Long
Dim z As Long
Dim n As Long
Dim w As Variant ' ici
d = Fix(Now)
a = Application.Caller
With Sheets(2)
n = Val(Right(a, Len(a) - 6))
b = .Cells(2 + n, 2) & vbCrLf & vbCrLf & .Cells(2 + n, 5)
w = Fix(Sheets(2).Cells(n + 2, 3))
y = w - Fix(Sheets(2).Cells(n + 2, 1))
If d < y Then 'z = 1
b = b & vbCrLf & vbCrLf & "L'intervention est prévue le " & Day(w) & "/" & Month(w) & "/" & Year(w)
MsgBox b, vbInformation
Exit Sub
End If
If y < d And d < w Then 'z = 2
b = b & vbCrLf & vbCrLf & "L'intervention est prévue le " & Day(w) & "/" & Month(w) & "/" & Year(w)
z = MsgBox(b & vbCrLf & vbCrLf & "Cliquer [Oui] si la maintenance est faite.", vbYesNo + vbInformation)
If z = 7 Then Exit Sub
End If
If d > w Then 'z = 3
b = b & vbCrLf & vbCrLf & "Date d'intervention dépassée." & vbCrLf & "La maintenance est-elle effectuée ?"
z = MsgBox(b, vbYesNo + vbExclamation)
If z = 7 Then Exit Sub
End If
.Cells(2 + n, 3) = .Cells(2 + n, 3) + .Cells(2 + n, 4)
End With
miseajour
End Subcrdlt,
André
Re,
Andre13 a écrit :Bonjour toutes et tous
juste à déclarer la variable Thihii
Dim w As Variant
aussi non de mon côté cela affiché une petite erreur
merci en tout cas
Sub details() Dim a As Variant Dim b As String Dim d As Long Dim x As Long Dim y As Long Dim z As Long Dim n As Long Dim w As Variant ' ici d = Fix(Now) a = Application.Caller With Sheets(2) n = Val(Right(a, Len(a) - 6)) b = .Cells(2 + n, 2) & vbCrLf & vbCrLf & .Cells(2 + n, 5) w = Fix(Sheets(2).Cells(n + 2, 3)) y = w - Fix(Sheets(2).Cells(n + 2, 1)) If d < y Then 'z = 1 b = b & vbCrLf & vbCrLf & "L'intervention est prévue le " & Day(w) & "/" & Month(w) & "/" & Year(w) MsgBox b, vbInformation Exit Sub End If If y < d And d < w Then 'z = 2 b = b & vbCrLf & vbCrLf & "L'intervention est prévue le " & Day(w) & "/" & Month(w) & "/" & Year(w) z = MsgBox(b & vbCrLf & vbCrLf & "Cliquer [Oui] si la maintenance est faite.", vbYesNo + vbInformation) If z = 7 Then Exit Sub End If If d > w Then 'z = 3 b = b & vbCrLf & vbCrLf & "Date d'intervention dépassée." & vbCrLf & "La maintenance est-elle effectuée ?" z = MsgBox(b, vbYesNo + vbExclamation) If z = 7 Then Exit Sub End If .Cells(2 + n, 3) = .Cells(2 + n, 3) + .Cells(2 + n, 4) End With miseajour End Subcrdlt,
André
merci pour cet oublie, mais dans ce cas, dim w as long. Je viens de modifier le fichier.
Up,
Est-il possible de considérer que ce sujet est clôt ?
C'est au demandeur d'en décider !
Cordialement.
bonsoir, juste pour le code que vous m'avez envoyé, dans quels modules, userforms ou boutons dois-je mettre le tout ?
Et en effet, votre code semble largement plus intéressant que mon usine à gaz lol !!! Même si mon usine fonctionne, je dois avouer qu'un perfectionnement de ma part s'impose LOL
Merci de vos réponses
J'ai longuement bricolé sur ce fichier dont l'aspect visuel m'intéressait.
Application.Caller n'étant pas applicable dans ce cas, avec un module de classe et en restructurant légèrement les UserForm on arriverait à un truc chouette...
Malheureusement il faudrait tout reprendre à zéro et en l'absence d'interlocuteur, j'ai arrêté : Il y avait trop de truc nébuleux dans le fichier original.
Quand au code fourni ici, il n'est pas adapté à ton fichier, juste au fichier exemple qui était joint...
A+
Bonsoir,
MFerrand a écrit :C'est au demandeur d'en décider !
Mais clôt ou non, si tu estimes avoir quelque chose à dire sur le sujet, libre à toi de le faire ! Cordialement.
Oui, j'ai une idée, mais suite à un MP reçu du demandeur, une participation de sa part me semble indispensable...
Mon message était simplement posté pour voir si celui-ci allait réagir.
galopin01 a écrit :J'ai longuement bricolé sur ce fichier dont l'aspect visuel m'intéressait.
Application.Caller n'étant pas applicable dans ce cas, avec un module de classe et en restructurant légèrement les UserForm on arriverait à un truc chouette...
Malheureusement il faudrait tout reprendre à zéro et en l'absence d'interlocuteur, j'ai arrêté : Il y avait trop de truc nébuleux dans le fichier original.
Quand au code fourni ici, il n'est pas adapté à ton fichier, juste au fichier exemple qui était joint...
A+
Oui, mon exemple ne peut convenir aux userform, je l'ai poster juste pour montrer qu'il est possible d'avoir une interface utilisateur dans un onglet, utiliser une multitude de formes avec peu de code...
Djhez a écrit :bonsoir, juste pour le code que vous m'avez envoyé, dans quels modules, userforms ou boutons dois-je mettre le tout ?
Et en effet, votre code semble largement plus intéressant que mon usine à gaz lol !!! Même si mon usine fonctionne, je dois avouer qu'un perfectionnement de ma part s'impose LOL
Merci de vos réponses
Ce code ne peut-être utilisé ailleurs que dans des modules, car il fait appel aux objets Worksheets...
Je suis partant pour une 'rénovation' de votre fichier, seulement un minimum de participation de votre part est requis.
Une idée j'ai, vous conviendra ou pas, mais le partager me semble intéressant. D'autres idées peuvent venir également (je suis aussi preneur
Dans un premier temps, sans travailler sur l'interface utilisateur (les boutons, les couleurs, autres...) nous devrions nous concentrer sur les données :
- les données de références
- les données modifiables (manuellement ou par routines vba)
- les dates d'échéances ou autres.
- éventuellement des groupes et sous groupes
- autres...
Dans un second temps, définir comment ces données doivent-être exploitées, quels résultats sont-ils souhaités ?
Dans un troisième temps, définir les 'exceptions, les résultats non souhaités, interdis, à verrouiller, à traiter différemment.
Arrivé à ce stade, il est pratiquement défini en majorité, comment l'interface utilisateur doit-être construite.
Dans le quatrième temps, travaille sur une interface utilisateur.
Une fois le tout terminé, essais et débogage, corrections aux besoins.
Vous est-il possible de nous fournir un fichier avec un tableau type où se trouveront vos données, comme l'onglet 2 de l'exemple qui semble vous intéresser ?
Bonjour,
J'ai continué de bricoler sur ce truc en essayant de rester au plus près de l'interface graphique...
Bon j'ai quand même arrangé à ma sauce : mis le temps d'intervention en info bulle transformé les TextBox en Label
J'ai aussi supprimé ce qui me paraissait inutile ou incompréhensible.
J'ai quand même laissé une feuille masquée pour rafraichir les 2 premières colonnes. Beuh... C'est un peu dangereux parce si on oublie de dupliquer une modif sur la feuille Prm ça fiche le binz... Mébon : Un homme averti en vaut 2...
Essentiellement j'ai remplacé la référence aux lignes des feuilles par des références iD. (Ce qui permet de rajouter un élément ou trier par type d'équipement sans avoir tout à chambouler...
Pour rajouter un équipement supplémentaire dans une feuille, il suffit de créer l'iD suivante et de créer un CommandButton et un Label avec le même N°. Ensuite on peux les balader n'importe ou dans le UserForm correspondant.
Ah oui... J'ai aussi remplacé les Frame : Dans ce contexte c'était plutôt un handicap pour y retrouver ses petits...
Avec une cure d'amaigrissement comme ça... Ça se passe de commentaire !
A+
Bonjour tout le monde,
beau travail galopin01, pour un meilleur résultat, poids du fichier divisé par 4 !
Je suis en train de voir une idée différente, je suis pour l'instant sans code vba, avec un fichier d'~25 Ko.
Si j'ai un peu de temps ce soir, j'essayerais d'avancer pour pouvoir le poster dimanche ou lundi.
Bonsoir,
Je vous avoue que je suis très surpris que vous travailliez sur mon fichier au vu de vos critiques...
J'ai testé ce fichier en cliquant sur quelques boutons, les boutons changent bien d'état mais en fermant le userform et en le réouvrant, le bouton reprend sa couleur d'état premier. Plus clairement, si le bouton est jaune, on clique et il passe au vert. Si on ferme le userform et on le ouvre à nouveau, le bouton est à nouveau jaune. Or le but est que la date de prochaine maintenance et la couleur soit modifiée et mémorisée.
Bonne soirée
Quand on fait une modif, le contrôle passe au vert, la date d'aujourd'hui est mémorisée colonne 4 et dans la colonne 6 la date est est mémorisée à J +120. (ou plus selon délai colonne 5)
Ce qui fait que le contrôle ne se rallume plus...
A ma grande honte je dois dire que je n'ai mis que quelques minutes à programmer et tester les derniers réglages et un bug de dernière minute s'est glissé... Modifier la Sub Action comme suit:
Sub Action(i%)
Dim iNext%, k%, Y As Boolean
If i < 93 Then 'On a cliqué sur un bouton
k = iRW(i)
Select Case usfO.Controls("CommandButton" & i).BackColor
Case Rouge, Jaune, Orange
If YConfirm(99) Then
usfO.Controls("CommandButton" & i).BackColor = Vert
Y = True
End If
Case GrisClair
If YConfirm(98) Then
usfO.Controls("CommandButton" & i).BackColor = BleuLagon
Y = True
End If
End Select
If Y Then
iNext = IIf(rng.Cells(i, 5) = "", 120, rng.Cells(i, 5))
rng.Cells(k, 4) = Date
rng.Cells(k, 6) = Date + iNext
usfO.Controls("Label" & i) = Format(Date + iNext, "dd/mm/yyyy")
Y = False
End If
Else 'Changement de Userform
'La suite sans changementA+