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
Bonsoir vgendron,
Merci encore pour ton aide, merci également à TootFatBoy.
Le premier code "Annuler" fonctionne bien. Le deuxième, TextCode_Change, ne fonctionnait pas, alors j'ai supprimé ce bout "If Not EnableEvents Then Exit Sub" et ça fonctionne. Par contre, je viens de m'apercevoir d'une erreur, et là c'est de ma faute, c'est que lorsque l'on tape le code de l'employé(e) il ne prend pas en compte la date du jour. Par exemple, dans mon tableau, si l'on tape FAL221 (Paul AUCHON) il rapatrie les données enregistrées hier dimanche. Je vais donc modifier cette partie en espérant ne pas faire de bêtise.
Je vais me baser sur la recherche du nom, ça doit être le même principe.
 

TooFatBoy

XLDnaute Barbatruc
C'est quoi l'indentation ?? Je ne sais pas ce que c'est et comment ça fonctionne.
C'est la mise en page de ton code .

Par exemple, décaler vers la droite tout ce qui est à l'intérieur d'une boucle FOR ... NEXT de façon à ce que le NEXT se retrouve sous le FOR.
Ca permet de voir en un coup d'oeil si on n'a pas oublié une fin de boucle ou un END IF ou autre.
 

NONO14

XLDnaute Occasionnel
J'ai écrit ce bout de code dans TextCode_Change que j'interprète comme "Je recherche dans le tableau "t_Saisie" la colonne "Date", si elle correspond à la date du jour inscrite dans le formulaire alors".
Mais apparemment ça ne fonctionne pas. J'ai du me planter quelque part... Je n'ai pas mis le code en entier parce que je pense que c'est uniquement cette partie qui est foireuse.
Voyez-vous mon erreur ?
Merci pour votre éclairage.

VB:
Private Sub TextCode_Change()

Dim Ctrl As Control
Dim Trouve As Range
Dim Trouve2 As Range

    Set Trouve = Range("t_Noms[Code]").Find(Me.TextCode, lookat:=xlWhole)
    If Not Trouve Is Nothing Then Me.T_bx_Noms = Trouve.Offset(0, 1)
    
    Set Trouve2 = Range("t_Saisie[Date]").Find(Me.T_bx_DateJour, lookat:=xlWhole) 'recherche la date dans le tableau
    If Trouve2 = Me.T_bx_DateJour Then 'si la date est égale à la date du jour dans le formulaire alors
 

TooFatBoy

XLDnaute Barbatruc
Les dates dans ton tableau sont des nombres interprétés comme des dates par Excel.
Une TextBox contient... du texte.

Pas sûr que ça marche, mais essaye CDate(Me.T_bx_DateJour) pour chercher une date.
 
Dernière édition:

vgendron

XLDnaute Barbatruc
Hello
il faudrait que tu postes ta dernière version qui inclue toutes les modifs qui ont été apportées depuis le début..
parce que je viens de regarder ton fichier PointHeure6.xlsm
j'ai l'impression qu'il manque des choses
par exemple ta macro sur le combobox_change ==la partie qui sauvegarde n'a aucune chance de fonctionner correctement...
 

NONO14

XLDnaute Occasionnel
Bonjour à toutes et à tous
Cette version est la dernière, il ne faut pas tenir compte du code de sauvegarde car il n'est pas fonctionnel. Je l'ai gardé pour m'en inspirer pour la suite. Je ne suis pas sur mon écran actuellement, je vous réponds de mon téléphone.
Je vais tester vos propositions dès que possible.
 

NONO14

XLDnaute Occasionnel
Je dois de temps en temps m'absenter pour raison médicale.
Toutes mes excuses
 

Discussions similaires

Réponses
9
Affichages
342
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…