Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
C'est parfait ça.
Merci beaucoup, je vais pouvoir passer à autre chose, notamment la sauvegarde du tableau de la feuille "Saisie" et récupérer les plannings pour les transformer en tableau afin que chaque employé(e) ait un exemplaire papier. Il y a encore du boulot sur la planche.
Et puis, quelques bricoles dont je devrais pouvoir m'en sortir.
Encore mille mercis ainsi qu'à TootFatBoy
 

vgendron

XLDnaute Barbatruc
me suis permis de corriger ta macro quand tu selectionnes une élément dans le combobx de la feuille saisie
et mis une partie du code (pour la sauvegarde) dans une sub séparée (que j'ai corrigé aussi)
 

Pièces jointes

  • PointHeure7.xlsm
    683 KB · Affichages: 1

TooFatBoy

XLDnaute Barbatruc
et pourquoi des noms de control avec t_bx_. au lieu de Tbx_ ??
Parce que, comme je te disais précédemment il a changé des Label en TextBox, donc pour simplifier le code, qui du coup ne fonctionnait plus, j'ai gardé le préfixe "Tbx_" uniquement pour les TextBox correspondant aux cases à cocher.


Trop de versions en très peu de temps !
Va falloir les nommer en aaaammjjhhmmss pour s'y retrouver si ça continue comme ça...
 
Dernière édition:

NONO14

XLDnaute Occasionnel
Bonjour à toutes et à tous,
Je reviens vers vous afin de vous demander de l'aide car je ne comprends pas le code ci-dessous.
Pourriez-vous me donner quelques explications s'il vous plaît ?
Je vous en remercie par avance et je me coucherai moins idiot ce soir...

VB:
For Each Ctrl In Me.Frame2.Controls
            If TypeName(Ctrl) = "TextBox" Then
                If Left(Ctrl.Name, 4) = "Tbx_" Then
                    Nom = Replace(Ctrl.Name, "Tbx_", "")
                    Ctrl.Enabled = (Ctrl.Value = "")
                    Me.Frame2.Controls("Chk_" & Nom).Enabled = (Ctrl.Value = "")
                    Me.Frame2.Controls("Chk_" & Nom).Visible = (Ctrl.Value = "")
                End If
            End If
        Next Ctrl
 

vgendron

XLDnaute Barbatruc
Héhé.. comme c'est moi qui l'a fait.. j'explique

VB:
For Each Ctrl In Me.Frame2.Controls 'pour chaque control de la frame2
    If TypeName(Ctrl) = "TextBox" Then 's'il s'agit d'un textbox
        If Left(Ctrl.Name, 4) = "Tbx_" Then 'si le nom du control commence par "Tbx_
            Nom = Replace(Ctrl.Name, "Tbx_", "") 'on récupère le nom SANS le préfixe Tbx_'
            Ctrl.Enabled = (Ctrl.Value = "") 'le control est enable si sa valeur est vide, sinon, il est disable'
            Me.Frame2.Controls("Chk_" & Nom).Enabled = (Ctrl.Value = "") 'le checkbox est rendu enable ou disable selon la valeur du ctrl'
            Me.Frame2.Controls("Chk_" & Nom).Visible = (Ctrl.Value = "") 'le checkbox est rendu visible ou pas selon la valeur du control'
        End If
    End If
Next Ctrl

Code:
Ctrl.Enabled = (Ctrl.Value = "")  est équivalent à un
if Ctrl.value="" then
    ctrl.enable=true
else 'il y a une valeur dans le ctrl
   ctrl.enable=false
end if
 

NONO14

XLDnaute Occasionnel
Bonjour à vous deux,
Merci beaucoup pour ces explications, c'est beaucoup plus clair dans ma tête à présent.
Je vais m'en inspirer pour une autre partie du code, parce que j'ai fait une usine à gaz !!!!
 

NONO14

XLDnaute Occasionnel
Voici mon fichier.
J'ai apporté les modifications suivantes :
- Terminé les tableaux de la feuille type
- Inséré la création d'un(e) employé(e) dans le formulaire UfGestTemps (cela fait un UF de moins)
- Modifié les codes dans le formulaire UfPointage au niveau de TextCode_Change. Pour le moment c'est l'usine à gaz. J'ai dû procéder de cette façon afin d'aborder le maximum de possibilités et de comprendre ce que je faisais.
- Supprimé le formulaire UfSauvTab qui ne servait à rien.

Je vous accorde le fait que ce que j'ai fait n'est pas très joli, mais je vais arranger ça, au moins je vais essayer.
 

Pièces jointes

  • PointHeure9.xlsm
    678.7 KB · Affichages: 2

Discussions similaires

Réponses
9
Affichages
343
Réponses
5
Affichages
369
Réponses
3
Affichages
161
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…