VBA - Arbre des causes
Bonjour à tous.
Je suis en train de créer un "Arbre de causes", que je cherche à automatisé via VBA.
VBA n'étant pas mon fort, j'ai essayé d'utiliser les IA pour m'aider dans ma tache. Mais ça commence à bloquer, et je pense avoir besoin d'aider
Le fichier (en pièce jointe) est assez clair je pense, mais voici quelques explication en plus.
Lorsque je coche sur "une case à cocher", j'indique que ma "Cause Racine" est trouver, et j'efface tous ce qui suit. (bordure, texte, case à cocher suivante, etc.)
Exemple :
- je coche la "Cause 1", j'efface les Cause 1.1 à 1.4, ainsi que les Cause 1.1.1 à 1.4.3
- Je coche la cause 1.1, je n'efface que les causes 1.1.1 à 1.1.3.
- Et bien sûr (le problème est ici), lorsque je décoche ma case, je réaffiche ce qui a été effacé au préalable.
Le top en bonus, serait un bouton "reset", qui décoche automatiquement tous, et remettent l'ensemble des éléments en place. Bon ça, je devrait pouvoir trouver de moi même en fouillant un peu.
Si vous avez une idée, je suis preneur svp
Si mes explications ne sont pas assez claire, n'hésitez pas à me le dire également
Merci d'avance au expert VBA qui pourront m'aider
Bonne journée
Bonjour Anthony,
Personnellement je pense que vouloir faire ça en automatique est une hérésie... la méthode ne sera pas bonne
Un peu de lecture (au cas où)
https://www.manager-go.com/ressources-humaines/dossiers-methodes/arbre-des-causes
Nota : Pensez à supprime toutes les données personnelle de vos fichiers quand vous les déposez... En utilisant le centre de confidentialité d'Excel
Sinon, on connait votre nom et la société dans laquelle vous travaillez
Bonne chance
Bonsoir,
si le but n'est que visuel alors je vous propose de masquer les zones voulues avec des shapes que vous rendrez visibles ou non en fonction des coches.
Le fichier joint ne gère que la coche sur fond jaune le 1.1 avec le shape "ZoneCause11".
Le fichier :
Il suffit dans votre code de remplacer la définition de la plage par le nom du shape correspondant :
puis dans le module de classe :
C'est juste une idée...
@ bientôt
LouReeD
Edit : avec le fichier c'est mieux !
Je ne comprends pas bien la logique de cet arbre. Vous écrivez :
je coche la "Cause 1", j'efface les Cause 1.1 à 1.4, ainsi que les Cause 1.1.1 à 1.4.3Il me semble que ce sont les branches 2, 3 et 4 qu'il faudrait couper.
- Je coche la cause 1.1, je n'efface que les causes 1.1.1 à 1.1.3.
Là, ce serait les branches 2, 3, 4, 1.2, 1.3, 1.4 qu'il faudrait couper.
Bonjour a tous, et merci pour vos retour.
@LouReeD : En effet, l'idée est uniquement visuel.
Sur demande, on ma demander de construire un "arbre de cause type", et visuellement je masque ce qui ne m'intéresse pas, pour ne laisser qui les branches utile.
l'idée étant, à la fin, d'en faire un impression PDF, afin de l'intégrer ensuite dans un rapport
@Optimix : en fait la logique, c'est un peu de faire les 5 pourquoi, (mise à part que je suis partie sur 4 éléments au début). J'ai appeler mes éléments "cause", mais j'aurai peut être dût les appeler "raison 1", "raison" 2, etc....
sachant que plusieurs causes peuvent être à l'origine de mon problème initiale
Du coup, dans mes causes 1 à 4, je renseigne que 4 premières raisons qui ont conduit à mon problème.
Une fois que celle-ci sont renseigné, je regarde.
- Si l'une des 4 raisons est "valable" (ou du moins répond l'une des causes), je coche sa case, et le reste de la branche se masque ou disparait (donc oui, pour ma cause 1, j'efface toute les cause 1.1 à 1.4 (+ les sous cause 1.1.1 à 1.1.3; 1.2.1 à 1.2.3; ........ ; 1.4.1 à 1.4.3).
- Ensuite, je regarde les 3 autres causes. Si l'une d'elle n'est pas valable (ou ne répond pas précisément à à la raison de mon problème), alors je relance mes 4 causes (4 ou raison).
Exemple, Si la cause 2 n'est pas valable en état, alors je continu l'analyse avec les cause 2.1 à 2.4.
Ensuite dans la même logique, si par exemple ma cause 2.1 me convient, je coche sa case, et j'efface le reste de sa branche à savoir les causes 2.1.1 à 2.1.3
je sais pas si j'ai réussis à être suffisamment clair dans mes explications
J'ai essayer au début sans VBA (en utilisant juste de la mise en forme conditionnelle), mais je n'arrivai pas à effacer également les cases, du coup le visuel été pas top.
Bonjour,
C'est purement visuel, Ok, mais l'idée des shapes qui masquent, point d'avis ?
Pour ce qui est de votre fichier en MFC, l'idée serait de le reprendre avec un peu de VBA et surtout en évitant les objets Case à cocher.
En effet si vous jouez avec la police Windings des caractère "simulent" ce type de case et comme c'est du "texte" avec vos MFC il vous sera possible de les passer en couleur de police blanche donc invisibles... Le VBA sera là pour gérer les double clic gauche sur ces cellule contenant ces case à cocher textuelle afin de les rendre cochée ou pas.
Un fichier pour la gestion des cases à cocher simulées (seule la cellule E3 est gérée) :
Vous voyez que la gestion est simple car les cellules comportant les case à cocher fond partie d'une même "zone" appelée "Clic", ensuite un code VBA événementiel surveille le double clic, s'il est détecté et qu'il est en intersection avec la zone Clic alors on test la valeur de la cellule cliquée, si c'est égale à "Q" alors on décoche en mettant un "£" sinon on coche en mettant un "Q". Ensuite il suffit de mettre la cellule à droite à VRAI ou à FAUX en fonction de la valeur et les MFC se baseront sur cette valeur comme doit le faire votre fichier en MFC. Ce Vrai/Faux sera en police blanche afin de ne pas apparaitre.
Mais ne l'ayant pas je ne peux vous faire l'adaptation exemple...
@ bientôt
LouReeD
Une autre idée. Je n'ai développé que les Causes 1.1 à 1.4 et 1.11 à 1.14.
Je vous laisse continuer si cette solution nous convient. Ce n'est qu'une idée.
Bonjour,
idée de simplification du code d'Optimix que je salue :
Private Sub chKC1_Click()
Application.ScreenUpdating = False
If chKC1.Value = True Then
Vider 1, 1
chkC11.Value = True
chkC12.Value = True
chkC13.Value = True
chkC14.Value = True
Else
Remplir 1, 1
chkC11.Value = False
chkC12.Value = False
chkC13.Value = False
chkC14.Value = False
End If
End Sub
Sub Vider(x As Byte, y As Byte)
Select Case y
Case 1:
Sheets("OFF").Range("H1:L19").Offset(x - 1, 0).Copy Destination:=Sheets("Arbre Causes").Range("H1:L19").Offset(x - 1, 0)
Case 2:
Sheets("OFF").Range("M1:T4").Offset(x - 1, 0).Copy Destination:=Sheets("Arbre Causes").Range("M1:T4").Offset(x - 1, 0)
End Select
End Sub
Sub Remplir(x As Byte, y As Byte)
Select Case y
Case 1:
Sheets("ON").Range("H1:L19").Offset(x - 1, 0).Copy Destination:=Sheets("Arbre Causes").Range("H1:L19").Offset(x - 1, 0)
Case 2:
Sheets("ON").Range("M1:T4").Offset(x - 1, 0).Copy Destination:=Sheets("Arbre Causes").Range("M1:T4").Offset(x - 1, 0)
End Select
End SubNul besoin de sélectionner une feuille et une plage pour la copier, l'instruction .copy destination:= est simple, le Application.ScreenUpdating ne nécessite pas un True en fin de procédure.
Je n'ai mis ici qu'une partie du code... ceci ne remplace pas tout le code fourni par Optimix !
@ bientôt
LouReeD
Bonjour LouReed. Well done. Ca faisait un bail !
Bonjour,
On ne test pas un boulean pour affecté la même valeur a un autres boolean.
With chKC1
Vider 1, 1
chkC11.Value = .Value
chkC12.Value = .Value
chkC13.Value = .Value
chkC14.Value = .Value
End withMaintenant si l'idée est de faire un TreeView alors prends en un vrai
Bonsoir,
je reprend mon idée basé sur les MFC puisque vous avez un fichier dans ce style, mais que les checkbox restant apparent ne vous plaisent pas.
Dans cette reprise j'ai modifié le double clic par un simple clic, c'est plus simple, il suffit pour que cela fonctionne de déplacer le cellule active afin de pouvoir recliquer sur la même cellule et lancer le code VBA.
Le fichier :
@ bientôt
LouReeD