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

vgendron

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

NONO14

XLDnaute Occasionnel
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
349
Réponses
5
Affichages
374
Réponses
3
Affichages
165

Statistiques des forums

Discussions
313 959
Messages
2 104 009
Membres
108 846
dernier inscrit
BENAFLA80