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: 14
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
je ne comprend pas bien..
le combo ne plait pas..... ton chef veut quoi à la place?: est ce qu'il le sait au moins?
à part dire.. ca me plait pas, sait il au moins pourquoi?

garder l'activation ou pas des feuilles selon le choix alors que TOUS les choix sont réservés à l'admin..
je vois pas du tout l'intérêt..
et à mon avis. il va vite en avoir marre..
ex:
choix de modifier un employé
mdp
le USF s'ouvre avec UNE page active
il fait ses modifs

s'il veut faire autre chose, il est OBLIGE de quitter le USF
refaire un choix
retaper son mot de passe....

(moi ca me gonfle rien que de l'écrire. alors.. le faire.. il va vite peter un plomb)
Nous sommes tout à fait d'accord, c'est juste pour mettre sa patte personnelle. Je crois que je ne vais rien changer et on verra bien. Pour la Combo, il m'a dit de me débrouiller pour trouver autre chose.
Par contre, il me faut impérativement changer la façon de procéder pour le code employé(e), mais là je ne sais pas comment faire...
J'ai regardé le fichier, et on a toujours l'erreur de calcul pour les heures sup, mais bon je verrais ça plus tard.
 

NONO14

XLDnaute Occasionnel
Bonjour à toutes et à tous,
Comment à partir de cette fonction peut-on placer les chiffres en premiers et les lettres à la suite, pour former par exemple 123abc. Ce code viendra s'ajouter au 3 premières lettres du Nom de la TextBox1 comme indiqué dans le 2ème code.
Il faut donc au final que le code ressemble à ça : (si le NOM est DUPONT) DUP123abc
La fonction CodeEmp fonctionne bien, mais mélange les lettres et les chiffres.
J'espère avoir été assez clair dans mes explications.
VB:
Function CodeEmp(Optional NbChar& = 0, Optional NbNum& = 0)
Dim Y&, C&, L

    If NbChar = 0 Then NbChar = 2 + (Round(Rnd * 6))
    If NbNum = 0 Then NbNum = 2 + (Round(Rnd * 3))
    
    Set Dico = CreateObject("Scripting.Dictionary")
    StrLettres = Split(StrConv("abcdefghijklmnopqrstuvwxyz", vbUnicode), Chr(0))
    StrChiffres = Split(StrConv("0123456789", vbUnicode), Chr(0))
    
    Do While Dico.Count < NbChar
        Y = Round(Rnd * UBound(StrLettres))
        Dico(StrLettres(Y)) = ""
    Loop
    
    Do While Dico.Count < NbChar + NbNum
        Y = Round(Rnd * UBound(StrChiffres))
        Dico(StrChiffres(Y)) = ""
    Loop
    
    L = Dico.Keys
    For C = 1 To 7
        y1 = Round(Rnd * UBound(L))
        y2 = Round(Rnd * UBound(L))
        yy = L(y1)
        L(y1) = L(y2): L(y2) = yy
    Next C
    
    CodeEmp = Join(L, "")
End Function

Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With Me.TextBox3
        .Value = Left(Me.TextBox1, 3) & CodeEmp(3, 3)
        .SelStart = 100
    End With
        
    With Me.TextBox4
        .Value = CreatePassWord(5, 2)
        .SelStart = 100
    End With
End Sub
 

vgendron

XLDnaute Barbatruc
Hello

Pourquoi créer un password aléatoire?? l'employé ne peut il pas choisir lui meme son mot de passe?
si c'est pour créer un mot de passe "initial" que l'employé doit immédiatemet modifier.. en général.. les services info génèrent toujours le même mot de passe initial.. genre "Welcome1"
Comme ca..ils ont juste UN mot de passe à retenir et communiquer à l'employé

Comme je n'ai pas fait la macro asscociée.. je ne vais pas pouvoir t'aider sur ce coup la..
tu devrais peut etre crééer un nouveau post spécifique pour ce besoin, et citant la personne qui t'a fait le code
 

NONO14

XLDnaute Occasionnel
Hello !
Pour revenir à la ComboMenus de la feuille "Saisie" puisque seul l'administrateur doit avoir accès aux différentes tâches, il n'est peut-être plus nécessaire de la conserver et de ce fait la remplacer par un bouton "Administration".
 

vgendron

XLDnaute Barbatruc
le combo: est ce que une des actions déjà listées est accessible au salarié? si oui, la(les)quelle(s) ?
==> à identifier dans le tableau feuille "Actions"

si TOUTES les actions ne sont que pour l'admin, alors oui, un simple bouton suffit MAIS
ca veut dire que à l'ouverture, toutes les pages sont accessibles

si une ou des actions est accessible au salarié, tu peux réduire la liste du combo a ces actions, et mettre le bouton pour l'admin, mais, Bouton et combo font la meme chose: ouvrir le formulaire de mot de passe..
le bouton est juste un "raccourci".. ca évite juste d'aller selectionner "Administration" dans le combo..
c'est du gagne petit...

après.. si il n'y a pas trop d'action pour le salarié (genre 1 ou 2) tu peux aussi faire un bouton par action (tous les boutons faisant la meme chose.. ouvrir le formulaire mot de passe, et remplir une case sur la feuille pour mettre le nom de l'action, pour que le formulaire sache quelle page activer..
quand je dis "pas trop d'actions", c'est pour éviter d'avoir 50 boutons sur la feuille.. ce qui ne serait visuellement pas très beau.. je pense
 

NONO14

XLDnaute Occasionnel
Hello

Pourquoi créer un password aléatoire?? l'employé ne peut il pas choisir lui meme son mot de passe?
si c'est pour créer un mot de passe "initial" que l'employé doit immédiatemet modifier.. en général.. les services info génèrent toujours le même mot de passe initial.. genre "Welcome1"
Comme ca..ils ont juste UN mot de passe à retenir et communiquer à l'employé

Comme je n'ai pas fait la macro asscociée.. je ne vais pas pouvoir t'aider sur ce coup la..
tu devrais peut etre crééer un nouveau post spécifique pour ce besoin, et citant la personne qui t'a fait le code
Bonjour vgendron,

C'est pour créer le code employé(e). Le mot de passe en fait ne va pas servir car l'employé(e) ne pourra que pointer. Je dois revoir cette partie. Je vais créer une nouvelle discussion pour le code employé(e).
De plus, suite à une réunion mouvementée, il faut que je créé en même temps, l'employé(e) et son planning, ça ne devrait pas être trop compliqué à mettre le tout sur la même page ou bien avoir une interaction entre les deux, c'est-à-dire qu'une fois la page 0 du formulaire UfGestTemps est remplie, la page 1 s'affiche immédiatement après avec le Nom qui vient d'être créé.
Je vais réfléchir à tout ça.
Je te remercie chaleureusement pour tout le travail que tu as fourni pour m'aider.
 

NONO14

XLDnaute Occasionnel
le combo: est ce que une des actions déjà listées est accessible au salarié? si oui, la(les)quelle(s) ?
==> à identifier dans le tableau feuille "Actions"

si TOUTES les actions ne sont que pour l'admin, alors oui, un simple bouton suffit MAIS
ca veut dire que à l'ouverture, toutes les pages sont accessibles

si une ou des actions est accessible au salarié, tu peux réduire la liste du combo a ces actions, et mettre le bouton pour l'admin, mais, Bouton et combo font la meme chose: ouvrir le formulaire de mot de passe..
le bouton est juste un "raccourci".. ca évite juste d'aller selectionner "Administration" dans le combo..
c'est du gagne petit...

après.. si il n'y a pas trop d'action pour le salarié (genre 1 ou 2) tu peux aussi faire un bouton par action (tous les boutons faisant la meme chose.. ouvrir le formulaire mot de passe, et remplir une case sur la feuille pour mettre le nom de l'action, pour que le formulaire sache quelle page activer..
quand je dis "pas trop d'actions", c'est pour éviter d'avoir 50 boutons sur la feuille.. ce qui ne serait visuellement pas très beau.. je pense
Merci pour tes bons conseils. L'employé(e) ne devra que pointer, alors le choix est vite fait. Il y aura bien un remplaçant en cas d'absence de l'administrateur, mais c'est tout, et il ou elle utilisera le même mot de passe.
 

vgendron

XLDnaute Barbatruc
donc le salarié n'a pas du tout accès au USF GestionTemps...
==> virer tout ce qui est gestion du mot de passe attendu en fonction de l'action selectionnée
==> supprimer le combo, à remplacer par un bouton admin== >UN SEUL mot de passe attendu:"admin01"
et full accès aux pages de l'USF
==> tous les cases n'ont plus lieu d'être
 

NONO14

XLDnaute Occasionnel
donc le salarié n'a pas du tout accès au USF GestionTemps...
==> virer tout ce qui est gestion du mot de passe attendu en fonction de l'action selectionnée
==> supprimer le combo, à remplacer par un bouton admin== >UN SEUL mot de passe attendu:"admin01"
et full accès aux pages de l'USF
==> tous les cases n'ont plus lieu d'être
Je suis désolé car je sais le temps que tu as dû passer pour m'aider. J'ai essayé de conserver l'application dans l'état mais sans succès. Je lui ai rappelé que faire et défaire n'est pas du travail sérieux et une perte de temps pour tout le monde. J'espère maintenant qu'il va se calmer sur les modifications.
Je te réitère ici toutes mes excuses.
 

ChTi160

XLDnaute Barbatruc
Bonjour le Fil
avec cette modification peut être!
VB:
Sub testNumberCode()
MsgBox Left("DUPOND", 3) & CodeEmp(3, 3)
End Sub
' Fonction CodeEmp qui génère un code avec des chiffres suivis de lettres
Function CodeEmp(Optional NbChar& = 0, Optional NbNum& = 0) As String
    Dim Y&, DicoLettres As Object, DicoChiffres As Object
    Dim StrLettres() As String, StrChiffres() As String, CodeFinale As String

    ' Initialisation des valeurs par défaut si elles ne sont pas spécifiées
    If NbChar = 0 Then NbChar = 2 + (Round(Rnd * 6)) ' Nombre de lettres
    If NbNum = 0 Then NbNum = 2 + (Round(Rnd * 3))  ' Nombre de chiffres
    
    ' Création de deux dictionnaires distincts
    Set DicoLettres = CreateObject("Scripting.Dictionary")
    Set DicoChiffres = CreateObject("Scripting.Dictionary")

    ' Tableaux contenant les lettres et chiffres
    StrLettres = Split(StrConv("abcdefghijklmnopqrstuvwxyz", vbUnicode), Chr(0))
    StrChiffres = Split(StrConv("0123456789", vbUnicode), Chr(0))

    ' Remplir le dictionnaire avec les lettres
    Do While DicoLettres.Count < NbChar
        Y = Round(Rnd * UBound(StrLettres))
        DicoLettres(StrLettres(Y)) = ""
    Loop
    
    ' Remplir le dictionnaire avec les chiffres
    Do While DicoChiffres.Count < NbNum
        Y = Round(Rnd * UBound(StrChiffres))
        DicoChiffres(StrChiffres(Y)) = ""
    Loop
    
    ' Créer la chaîne finale : d'abord les chiffres, ensuite les lettres
    CodeFinale = Join(DicoChiffres.Keys, "") & Join(DicoLettres.Keys, "")
    
    ' Retourner le code généré
    CodeEmp = CodeFinale
End Function
Bonne journée
Jean marie
 

ChTi160

XLDnaute Barbatruc
Re
je m'amuse sur un Fichier ou je gère tout sur des Fichiers ".Txt" Utf8

ou a partir d'un Seul Userform on accède ou pas a des Fonctions selon que l'on est "Administrateur" ou "Intervenant" , c'est une façon de voir Lol
jean marie
 

Pièces jointes

  • Usf_01.gif
    Usf_01.gif
    302.6 KB · Affichages: 5
  • Usf_02.gif
    Usf_02.gif
    287 KB · Affichages: 5
  • Usf_03.gif
    Usf_03.gif
    300.9 KB · Affichages: 5
  • Usf_05.gif
    Usf_05.gif
    430.8 KB · Affichages: 4

NONO14

XLDnaute Occasionnel
Bonjour le Fil
avec cette modification peut être!
VB:
Sub testNumberCode()
MsgBox Left("DUPOND", 3) & CodeEmp(3, 3)
End Sub
' Fonction CodeEmp qui génère un code avec des chiffres suivis de lettres
Function CodeEmp(Optional NbChar& = 0, Optional NbNum& = 0) As String
    Dim Y&, DicoLettres As Object, DicoChiffres As Object
    Dim StrLettres() As String, StrChiffres() As String, CodeFinale As String

    ' Initialisation des valeurs par défaut si elles ne sont pas spécifiées
    If NbChar = 0 Then NbChar = 2 + (Round(Rnd * 6)) ' Nombre de lettres
    If NbNum = 0 Then NbNum = 2 + (Round(Rnd * 3))  ' Nombre de chiffres
   
    ' Création de deux dictionnaires distincts
    Set DicoLettres = CreateObject("Scripting.Dictionary")
    Set DicoChiffres = CreateObject("Scripting.Dictionary")

    ' Tableaux contenant les lettres et chiffres
    StrLettres = Split(StrConv("abcdefghijklmnopqrstuvwxyz", vbUnicode), Chr(0))
    StrChiffres = Split(StrConv("0123456789", vbUnicode), Chr(0))

    ' Remplir le dictionnaire avec les lettres
    Do While DicoLettres.Count < NbChar
        Y = Round(Rnd * UBound(StrLettres))
        DicoLettres(StrLettres(Y)) = ""
    Loop
   
    ' Remplir le dictionnaire avec les chiffres
    Do While DicoChiffres.Count < NbNum
        Y = Round(Rnd * UBound(StrChiffres))
        DicoChiffres(StrChiffres(Y)) = ""
    Loop
   
    ' Créer la chaîne finale : d'abord les chiffres, ensuite les lettres
    CodeFinale = Join(DicoChiffres.Keys, "") & Join(DicoLettres.Keys, "")
   
    ' Retourner le code généré
    CodeEmp = CodeFinale
End Function
Bonne journée
Jean marie
Bonjour Jean-Marie
Merci beaucoup, ça fonctionne comme je le souhaite.
 

vgendron

XLDnaute Barbatruc
Je suis désolé car je sais le temps que tu as dû passer pour m'aider. J'ai essayé de conserver l'application dans l'état mais sans succès. Je lui ai rappelé que faire et défaire n'est pas du travail sérieux et une perte de temps pour tout le monde. J'espère maintenant qu'il va se calmer sur les modifications.
Je te réitère ici toutes mes excuses.
tu peux lui dire que d'une c'est pas ton boulot de développer une appli (si? non?) ;)
et qu'il veut quelque chose de précis
1) il faut passer par une société de dev==> Pas gratuit
2) qu'il doit définir EXACTEMENT ce qu'il veut.. le "J'aime pas" sans rien de plus, n'est pas entendable==> il va devoir définir un cahier des charges....et ca.. ca va lui prendre du temps..
3) que toute modification est aussi facturable..

perso.. ici. ca m'amuse encore.. donc ne sois pas désolé.
 

NONO14

XLDnaute Occasionnel
Hello !
J'ai dû modifier le fichier dont voici le nouveau modèle. Dans la feuille "Saisie" j'ai inséré un bouton "Administration". Lorsque l'on clique dessus, il ouvre le formulaire mot de passe. Lorsque le mot de passe est saisi, un autre formulaire s'affiche avec le menus des tâches. Pour le moment, je n'ai encodé que le premier item "Enregistrer un(e) employé(e)". J'ai fait ça à l'arrache afin de montrer à l'emmerd.... de service ce que cela pourrait donner et oh ! miracle, il est satisfait. Je vous accorde le fait que cela ne change pas grand chose de la version précédente, mais ça lui plaît comme ça et il n'y aura plus de modification, les débats sont clos sur le sujet, sinon il mettra les mains dans le cambouis.
 

Pièces jointes

  • PointHeure15.xlsm
    785.7 KB · Affichages: 3

Discussions similaires

Réponses
9
Affichages
352
Réponses
5
Affichages
377
Réponses
3
Affichages
178

Statistiques des forums

Discussions
314 011
Messages
2 104 528
Membres
109 063
dernier inscrit
rahimmcsaw