Microsoft 365 Ecrire une formule de calcul en Vba Excel

NONO14

XLDnaute Impliqué
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: 16
Dernière édition:
Solution
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 ...

NONO14

XLDnaute Impliqué
Bonsoir à toutes et à tous,

Voici mon problème pour lequel je sollicite votre aide.

Dans une Combo située dans la feuille "Saisie", je peux choisir plusieurs actions de travail.
4 d'entre-elles vont appel au même UserForm (UfGestTemps) mais à des pages différentes du Multipage1.
- Enregistrer un(e) employé(e) - page 0 - il s'agit de l'index
- Enregistrer le planning horaires - page 1
- Editer les plannings - page 2
- Enregistrer un contrat horaire - page 3

L'UserForm est activé par la même procédure dans un module et qui se nomme Lance. (Dans module1).
Comment faire pour que lorsque je fais un choix, l'UserForm soit activé sur la page concernée et que les autres pages soient invisibles ?

Je sais rendre les pages invisibles, mais c'est le début du code que je ne sais pas aborder. J'ai encodé pour le premier cas "Enregistrer un(e) employé(e)", mais cela ne peut convenir, car il y a les 3 autres cas à résoudre.
Pourriez-vous m'aiguiller s'il vous plait ?
Je vous en remercie par avance.

Le mot de passe dans les UF mot de passe est admin01
 

Pièces jointes

  • PointHeure10.xlsm
    701.6 KB · Affichages: 2

vgendron

XLDnaute Barbatruc
Hello

la procédure lance appelle le formulaire
et le premier évènement qui est executé (avant meme l'affichage du formulaire) est l'évènement "_initialize"

c'est donc la, qu'il faut traiter les cas
selon ce qui est selectionné dans le combobox de la feuille saisie, tu set la valeur du formulaire à la page qui te convient

ex
private sub userform_initialize()
...
...
select case activesheet.combobox1
case "xxxxx"
me.mulitpage.value=1
code pour masquer les autres pages
case "yyyy"
me.mulipage.value=2
end select
 

NONO14

XLDnaute Impliqué
Hello

la procédure lance appelle le formulaire
et le premier évènement qui est executé (avant meme l'affichage du formulaire) est l'évènement "_initialize"

c'est donc la, qu'il faut traiter les cas
selon ce qui est selectionné dans le combobox de la feuille saisie, tu set la valeur du formulaire à la page qui te convient

ex
private sub userform_initialize()
...
...
select case activesheet.combobox1
case "xxxxx"
me.mulitpage.value=1
code pour masquer les autres pages
case "yyyy"
me.mulipage.value=2
end select
Bonjour vgendron,
Merci pour ta réponse, je vais aller dans ce sens.
A plus tard... Et encore merci, je devrais pouvoir m'en sortir.
 

NONO14

XLDnaute Impliqué
Hello !
Voilà j'ai mis ce code en place mais ça ne fonctionne pas. En effet j'ai un message d'erreur "L'indice n'appartient pas à la sélection" dans le code suivant au niveau du premier .Width.
Je ne comprends pas ce qui se passe, je vois bien que c'est au niveau du redimensionnement de l'Uf mais pourquoi cette erreur ? Est-ce en lien avec le code de l'Initialize ?
Pouvez-vous m'éclairer s'il vous plaît ?
Je vous en remercie par avance.
Je joins également mon fichier. Dans la Combo de la feuille "Saisie", choisissez "Enregistrer le planning horaires" par exemple et vous verrez ce qui se passe.

Code:
Private Function resizeMulti()
    With MultiPage1
        .Width = Mpage(.Value).Width
        .Height = Mpage(.Value).Height
        Me.Height = .Height + Mpage(.Value).hCaption + Mpage(.Value).Weight_Cadre * 2 + 25
        Me.Width = .Width + Mpage(.Value).hCaption
    End With
End Function

VB:
Private Sub UserForm_Initialize()
Dim Ltbx As Byte
    
    cl.initiate Me 'instanciation des textbox taggés "Heure"
    EnableEvents = True
    
                For Ltbx = 0 To 3
                    Me.MultiPage1.Pages(Ltbx).Enabled = IIf(Me.MultiPage1.Value = Ltbx, True, False)
                
        Select Case Sheets("Saisie").ComboMenus
        
            Case "Enregistrer un(e) employé(e)"
                Me.MultiPage1.Value = 0
                Me.Label1.Visible = False
                Me.Cbx_Salarié.Visible = False
                Me.TextBox1.SetFocus
            
            Case "Enregistrer le planning horaires"
                Me.MultiPage1.Value = 1
                Me.Cbx_Salarié.SetFocus
            
            Case "Editer les plannings"
                Me.Cbx_Salarié.SetFocus
            
            Case "Enregistrer un contrat horaires"
                Me.MultiPage1.Value = 3
                Me.Cbx_Salarié.SetFocus
        
        End Select
                Next Ltbx
 

Pièces jointes

  • PointHeure10.xlsm
    715.3 KB · Affichages: 3

NONO14

XLDnaute Impliqué
J'ai mis ce bout de code à la fin et ça à l'air de fonctionner
VB:
For Each pag In MultiPage1.Pages: lC = lC & CStr(pag.Caption): Next: minlarge = Len(lC) * 7 '!!!!!!!!!!!!!!!!!!!!!
    
    For Each pag In MultiPage1.Pages
        ReDim Preserve Mpage(0 To pag.Index)
        WW = 0: HH = 0
        For Each Ctrl In pag.Controls
            If Ctrl.Left + Ctrl.Width + 20 > WW Then WW = Ctrl.Left + Ctrl.Width + 20: If WW < minlarge Then WW = minlarge
            If Ctrl.top + Ctrl.Height + 50 > HH Then HH = Ctrl.top + Ctrl.Height + 50
        Next Ctrl
        Mpage(pag.Index).Width = WW: Mpage(pag.Index).Height = HH
        Mpage(pag.Index).hCaption = Me.Height - Me.InsideHeight
        Mpage(pag.Index).Weight_Cadre = Me.Width - Me.InsideWidth
    Next pag
          
    resizeMulti
 

NONO14

XLDnaute Impliqué
je ne comprend pas bien la boucle for ltbx=0 to 4
elle me semble inutile..

à l'initialize.. tu mets tous les multipages disable
ET SEULEMENT après (après le next), en fonction du combo, tu actives et bascule sur le bon multipage
Il s'agit de 0 to 3 car il y a 4 pages de 0 à 3.
Peut-être que je me suis trompé dans la façon de coder. Voici comment je pensais faire : Après le choix dans la Combo, l'UF est initialisé et la page correspondant au choix est activée et les autres sont inactives, visibles mais non modifiables, d'où le .Enabled.
Si ce n'est pas la bonne façon de faire n'hésites pas à me le dire et je corrigerais mes erreurs.
Merci pour ton aide
 

NONO14

XLDnaute Impliqué
attention, ca devient une usine à gaz..
tu as deux formulaires de mot de passe...
gardes en un seul
le code associé au combo devrait se limier à l'appel du mot de passe puis lancement du formulaire de gestion si le mot de passe est ok
Très bien. Je vais suivre ton conseil.
J'ai utilisé ce 2ème formulaire car il ne va pas diriger l'administrateur vers la même chose, car lui il n'ouvre pas de formulaires de saisie, mais des feuilles de calcul, mais peut-être n'est-ce pas important.
 

Discussions similaires

Réponses
9
Affichages
436
Réponses
5
Affichages
406
Réponses
3
Affichages
224

Statistiques des forums

Discussions
314 628
Messages
2 111 333
Membres
111 103
dernier inscrit
Maxime@mar