Comment pourrait-on écrire cette formule de calcul en Vba, s'il vous plaît ? Pour le moment elle est écrite en dur dans des cellules Excel de mon tableau.
Cependant, il m'est demandé de l'écrire dans du code afin que personne ne puisse y accéder. Cette formule se trouve dans la colonne J du tableau de la feuille "Recap", il y en d'autres du même genre dans les colonnes K et L et un peu plus simples dans les colonnes M, N, O.
Bien sûr je pourrais protéger ces colonnes mais ce n'est pas ce qui m'est demandé, j'ai proposé cette solution, mais elle ne garantie pas une sécurité suffisante en cas d'effacement malencontreux par la personne qui va gérer ce fichier.
MAX_MAT et autres sont des Noms donnés à des cellules de la feuille "Données", soit les cellules L3 à O5.
Mot de passe de la feuille "falaise"
Merci par avance pour vos idées.
Bonjour le Fil
juste pour signaler qu'a ce Niveau il y a un problème !
VB:
Private Sub TextCode_Change()
Dim Ctrl As Control
Dim Ctrl2 As Control
Dim Trouvé As Boolean
Dim Trouve As Range
Me.TextCode.Text = UCase(Me.TextCode) 'On met en Majuscule tout le Contenu du TextBox
If Not EnableEvents Then Exit Sub
Sheets("Liste_agents").Unprotect "falaise"
'on cherche le nom associé au code dans la TS "t_Noms"
With Sheets("Liste_agents").ListObjects("t_Noms")
'ci-dessous on recherche dans une colonne ou se trouvent des Minuscules
Set Trouve = .ListColumns(1).Range.Find(Me.TextCode, lookat:=xlWhol
Tu peux si la case n'a pas d'importance mettre Option Compare Text en tête de Module.
et supprimer ...
bah.. toofat.. un gros coup de fatigue??
la réponse est claire: "pour faire joli"....
la page 2 contient moins de controls à afficher que la page1 ==> quand la page 2 est affichée, sa taille (et celle du USF) est diminuée..
Bonjour à toutes et à tous,
J'ai terminé mon formulaire pour enregistrer les plannings.
Cependant, lorsque je clique sur le bouton "Lancer l'UF" qui se trouve sur la feuille "Saisie", j'ai un message d'erreur et je n'arrive pas en déterminer la cause. - "Erreur 424 - Objet requis"
Pouvez-vous éclairer ma lanterne s'il vous plaît ?
Je vous en remercie par avance.
pour déterminer la ligne qui pose problème, execute le code VBA en mode pas à pas (touche F8)
le premier message d'erreur indique qu'il manque la déclaration suivante
Dim cl As New cTextBox
tout en haut du formulaire, au meme endroit que la déclaration du type P
Ensuite, d'autres messages apparaissent..
le code écrit utilise des noms de controles spécifiques..
tu as du changer quelques nom
Tbx_NumSemaine est devenu TbxNumSemaine
les checkbox ChkBx_ sont revenus avec leur nom initial par défaut "CheckBox"
=> Soit tu renommes les controles avec le nom utilisé dans le code ==> tu n'as pas besoin d'aller voir dans tout le code pour modifier à chaque appel du control
==> soit tu vas modifier toutes les lignes de code pour utiliser le nouveau nom que tu as mis. (surement plus long)
en règle général, quand je mets des controles sur le formulaire je les renomme quasi systématiquement avec cette règle de nommage: trigramme pour donner le type de control, suivi d'un espace "_" puis un nom explicite
Cbx_NomExplicit ==> Cbx pour Combobox
Tbx_NomExplicit==> Tbx pour Textbox
ChkBx_NomExplicit==> ChkBx pour checkbox (bon la.. c'est pas un trigramme)
Cbn pour commandbutton
Lbx pour Listbox
....;
pour déterminer la ligne qui pose problème, execute le code VBA en mode pas à pas (touche F8)
le premier message d'erreur indique qu'il manque la déclaration suivante
Dim cl As New cTextBox
tout en haut du formulaire, au meme endroit que la déclaration du type P
Ensuite, d'autres messages apparaissent..
le code écrit utilise des noms de controles spécifiques..
tu as du changer quelques nom
Tbx_NumSemaine est devenu TbxNumSemaine
les checkbox ChkBx_ sont revenus avec leur nom initial par défaut "CheckBox"
=> Soit tu renommes les controles avec le nom utilisé dans le code ==> tu n'as pas besoin d'aller voir dans tout le code pour modifier à chaque appel du control
==> soit tu vas modifier toutes les lignes de code pour utiliser le nouveau nom que tu as mis. (surement plus long)
en règle général, quand je mets des controles sur le formulaire je les renomme quasi systématiquement avec cette règle de nommage: trigramme pour donner le type de control, suivi d'un espace "_" puis un nom explicite
Cbx_NomExplicit ==> Cbx pour Combobox
Tbx_NomExplicit==> Tbx pour Textbox
ChkBx_NomExplicit==> ChkBx pour checkbox (bon la.. c'est pas un trigramme)
Cbn pour commandbutton
Lbx pour Listbox
....;
Bonjour vgendron,
J'ai pourtant fait attention de respecter les noms, mais quelques-uns ont du passé à côté. Je remédie à tout ça.
Merci beaucoup pour ta précieuse aide.
C'est aussi pour ca que quand je code, j'utilise le préfixe Me (qui renvoit au formulaire sur lequel je travaille)
la saisie semi auto ne me suggère QUE les controls qu'il connait..==> pas de risque d'écrire un control avec le mauvais nom
Note: j'ai regardé: les Tbx_11 ... qui servent pour la saisie des heures: tu ne leur as pas mis le tag "Heure"
le control de saisie ne va donc pas être appliqué
Public EnableEvents As Boolean
Dim cl As New cTextBox
sont bien la.. mais pas à la bonne place.. ca doit être tout en haut du module
une question:
la fonction ConvertirHtoDec
est ce toi qui a changé le séparateur ":" en "." ?
si oui.. bah faut pas. sinon ca bug
si non.. étrange.. ca ne buggait pas dans le fichier précédent.. faudra que je vérifie
Public EnableEvents As Boolean
Dim cl As New cTextBox
sont bien la.. mais pas à la bonne place.. ca doit être tout en haut du module
une question:
la fonction ConvertirHtoDec
est ce toi qui a changé le séparateur ":" en "." ?
si oui.. bah faut pas. sinon ca bug
si non.. étrange.. ca ne buggait pas dans le fichier précédent.. faudra que je vérifie
J'ai corrigé quelques erreurs d'écriture et mon formulaire s'affiche normalement. Cependant, il y a (pour le moment) 2 erreurs que je n'arrive pas à corriger :
Dans la 1ère page - Saisie - Je sélectionne un nom, mais le temps contractuel n'est pas indiqué.
Dans la dernière page - Gestion des employé(e)s - Lorsque je clique sur un nom de la liste, les données ne se placent pas aux bons endroits, le temps contractuel s'affiche là où devrait s'afficher le nom et la case contrat reste vide. J'ai cherché en modifiant le code, mais rien n'y fait.
Peux-tu me dire ce qui ne va pas s'il te plaît ?
Je t'en remercie par avance
pour le contrat heure
quelques explications sur le code
VB:
Private Sub Cbx_Salarié_Change() 'mise à jour du Contrat Heure à la sélection du Salarié
With Sheets("Liste agents").ListObjects("t_Noms") 'dans la TS "t_Noms" de la feuille "Liste agents"
Set trouve = .ListColumns("Nom Prénom").Range.Find(Me.Cbx_Salarié, lookat:=xlWhole) 'on cherche le salarié sélectionné dans la colonne "Nom Prénom" de la table
If Not trouve Is Nothing Then
Me.Tbx_ContratHeures = Application.Text(trouve.Offset(0, 1), "[h]:mm") 'on récupère la valeur dans la colonne d'a coté
End If
End With
LoadGrille
End Sub
Avant que je change le code ci dessus, la recherche se faisait dans la 1ere colonne de la table (ListColumns(1))
on récupérait la valeur 3 colonnes a droite..=> maintenant offset(0,1)
Merci mille fois, ça fonctionne beaucoup mieux. A chaque fois je me fais avoir avoir les indices des ListBoxs, il va falloir que je note ça quelque part pour ne plus oublier.
Je vais faire une série de tests pour voir comment ça se passe.
Encore tous mes remerciements pour ton aide et ton partage de cette application.
Bien entendu, tu peux disposer de notre travail... c'est aussi ton bébé.
J'aimerai ajouté un petit bout de code qui effacerait les données affichées lorsque l'on change de page sur le multipage. Je pense pouvoir trouver ça sur le forum
le format des heures déjà saisies pour l'agent 8 semble ne pas correspondre à ce qu'attend le formulaire
je m'explique:
tu sélectionnes l'agent 8
tu passes sur la semaine 36 et les heures qui sont chargées sont mises en décimales..
j'ai pas trop cherché, j'ai juste resaisi les heures à partir du formulaire et validé. pour que ca corresponde bien
quand tu es sur la page de saisie, tu saisis l'heure de début matin du lundi
quand tu valides, ca passe direct à l'heure fin matin du lundi
puis quand tu valides à nouveau.. ca passe au mardi matin.. au lieu de lundi après midi début
pour gérer l'ordre de tabulation, il faut changer la propriété "TabIndex" des Textbox
selon les versions d'excel, c'est plus ou moins ch.. à faire (chez moi, si je met un index déjà pris, il le prend pas ou remodifie les index déjà inscrits... je suis obligé de passer par des index hauts qui n'existent pas)
J'aimerai ajouté un petit bout de code qui effacerait les données affichées lorsque l'on change de page sur le multipage. Je pense pouvoir trouver ça sur le forum
pour la page 1 de saisie.. tu as déjà le code associé au bouton "Vider grille"
sinon, pour faire plus "bourrin", un truc du genre
for each ctrl in me.multipage.activepage '??
if typeof ctrl =msform.textbox then ctrl=""
if typeof ctrl = msform.combobox then ctrl.listindex=-1
le format des heures déjà saisies pour l'agent 8 semble ne pas correspondre à ce qu'attend le formulaire
je m'explique:
tu sélectionnes l'agent 8
tu passes sur la semaine 36 et les heures qui sont chargées sont mises en décimales..
j'ai pas trop cherché, j'ai juste resaisi les heures à partir du formulaire et validé. pour que ca corresponde bien
quand tu es sur la page de saisie, tu saisis l'heure de début matin du lundi
quand tu valides, ca passe direct à l'heure fin matin du lundi
puis quand tu valides à nouveau.. ca passe au mardi matin.. au lieu de lundi après midi début
pour gérer l'ordre de tabulation, il faut changer la propriété "TabIndex" des Textbox
selon les versions d'excel, c'est plus ou moins ch.. à faire (chez moi, si je met un index déjà pris, il le prend pas ou remodifie les index déjà inscrits... je suis obligé de passer par des index hauts qui n'existent pas)