Microsoft 365 Ecrire une formule de calcul en Vba Excel

NONO14

XLDnaute Occasionnel
Bonjour à toutes et à tous,

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.
VB:
=SI(A2="";"";SI(A2<>"";SI(ET(D2<>"";E2<>"");E2-D2;SI(ET(D2<>"";E2="";F2<>"");MAX_MAT-D2;SI(ET(D2<>"";E2="";ET(F2<>"";G2=""));"";SI(ET(D2<>"";E2="";F2="";G2="";H2="";I2<>"");MAX_MAT-D2;SI(ET(D2<>"";E2="";F2="";G2<>"");MAX_MAT-D2;SI(ET(D2<>"";E2="";ET(F2="";G2="");ET(H2="";I2<>""));I2-D2;SI(ET(D2<>"";E2="";F2="";G2="");MAX_MAT-D2;SI(D2="";""))))))))))
 

Pièces jointes

  • Tablo_Heures.xlsm
    282.8 KB · Affichages: 13
Dernière édition:
Solution
Bonjour
tu dis ne pas vouloir protéger les colonnes..et pourtant tu postes un fichier protégé...

pour inscrire une formule dans une cellule J2 par VBA, voici ma méthode
1) créer une variable qui contient la formule en Anglais
FormuleJ="=if(A2="""",""""if(A2<>""""................)"
en anglais veut dire: les fonctions sont écrites dans la version Anglaise ==> Si==>IF, et==> And....
les ; sont remplacés par des ,
les " sont remplacés par ""

2) inscrire la formule
range("J2").formula=formuleJ

3) pour étirer la formule: autofill

NONO14

XLDnaute Occasionnel
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.
 

Pièces jointes

  • PointHeure4.xlsm
    514.7 KB · Affichages: 2

vgendron

XLDnaute Barbatruc
Hello

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
....;
 

NONO14

XLDnaute Occasionnel
Hello

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.
 

vgendron

XLDnaute Barbatruc
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é
 

vgendron

XLDnaute Barbatruc
en fait, les déclarations
VB:
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
 

NONO14

XLDnaute Occasionnel
en fait, les déclarations
VB:
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 du faire une mauvaise frappe car je sais qu'il faut ":" comme séparateur.
 

NONO14

XLDnaute Occasionnel
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
 

Pièces jointes

  • PointHeure4.xlsm
    518.6 KB · Affichages: 2
Dernière édition:

vgendron

XLDnaute Barbatruc
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)
 

NONO14

XLDnaute Occasionnel
et pour la gestion

héhé... le premier indice de colonne d'une Listbox.. c'est 0
Code:
Private Sub Lbx_Employés_Click()
    Me.Tbx_Employé = Me.Lbx_Employés.List(, 0)
    Me.Tbx_CHeures = Me.Lbx_Employés.List(, 1)
End Sub
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é.
 

vgendron

XLDnaute Barbatruc
autre remarque

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)
 

vgendron

XLDnaute Barbatruc
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

next ctrl
 

NONO14

XLDnaute Occasionnel
autre remarque

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)
Effectivement j'ai également remarqué ça. Je vais reprendre l'ordre des tabulations.
 

Discussions similaires

Réponses
9
Affichages
343
Réponses
5
Affichages
369
Réponses
3
Affichages
161

Statistiques des forums

Discussions
313 911
Messages
2 103 501
Membres
108 681
dernier inscrit
eaglesinfo