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: 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 ...

vgendron

XLDnaute Barbatruc
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 bon j'ai trouvé une solution grâce au code de job75 pour bloquer des colonnes.
De cette façon, pas besoin de toucher aux formules. A moins d'aller déverrouiller les cellules volontairement, et contre ça, il n'y a pas de remède.
Mais bon, si quelqu'un s'est penché sur le sujet, je suis preneur au cas où...
Toutefois, pour le moment ma solution convient.
 

NONO14

XLDnaute Occasionnel
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
Bonjour vgendron,
Merci pour votre réponse. En effet c'est la solution actuelle. Je vais me pencher sur votre proposition, cependant compte-tenu de la longueur des formules, je risque d'y passer du temps.
Encore merci.
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Je vais me pencher sur votre proposition, cependant compte-tenu de la longueur des formules, je risque d'y passer du temps.
Tu peux écrire la formule dans une cellule, puis sélectionner ladite cellule, puis lancer une macro qui va t'afficher la formule en anglais (soit avec un espion, soit avec debug.print, soit dans une cellule).

Ça ne te donnera pas le texte exact à affecter à ta variable, puisqu'il faudra un peu la modifier (entre autre doubler les guillemets), mais ça devrait tout de même te faire gagner un peu de temps.
 

NONO14

XLDnaute Occasionnel
Bonjour,


Tu peux écrire la formule dans une cellule, puis sélectionner ladite cellule, puis lancer une macro qui va t'afficher la formule en anglais (soit avec un espion, soit avec debug.print, soit dans une cellule).

Ça ne te donnera pas le texte exact à affecter à ta variable, puisqu'il faudra un peu la modifier (entre autre doubler les guillemets), mais ça devrait tout de même te faire gagner un peu de temps.
Bonjour TootFatBoy,
Merci pour le tuyau, je vais essayer sur un fichier test avant de me lancer en réel.
 

TooFatBoy

XLDnaute Barbatruc
Enrichi (BBcode):
=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="";""))))))))))

Le cas où A2="" est déjà traité, donc pour la suite de la formule on sait que A2<>"".
Donc inutile de faire le test A2<>"".
 

NONO14

XLDnaute Occasionnel
Enrichi (BBcode):
=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="";""))))))))))

Le cas où A2="" est déjà traité, donc pour la suite de la formule on sait que A2<>"".
Donc inutile de faire le test A2<>"".
Oui bien sûr.
 

vgendron

XLDnaute Barbatruc
Hello @TooFatBoy

@NONO14 : Pour être honnete.. quand j'ai vu ta formule, je me suis dit, elle est surement simplifiable.. j'ai donc commencé par un copier.. coller sur ton fichier.. MAIS fichier protégé.... j'ai arrêté...

juste pour dire que c'est important de fournir un fichier représentatif dont on peut faire quelque chose...
sinon.. bah.. ca ne vaut pas mieux qu'une photo..
 

NONO14

XLDnaute Occasionnel
Hello @TooFatBoy

@NONO14 : Pour être honnete.. quand j'ai vu ta formule, je me suis dit, elle est surement simplifiable.. j'ai donc commencé par un copier.. coller sur ton fichier.. MAIS fichier protégé.... j'ai arrêté...

juste pour dire que c'est important de fournir un fichier représentatif dont on peut faire quelque chose...
sinon.. bah.. ca ne vaut pas mieux qu'une photo..
mot de passe "falaise"
 

Discussions similaires

Réponses
9
Affichages
371
Réponses
5
Affichages
384
Réponses
3
Affichages
199

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 121
Messages
2 106 129
Membres
109 495
dernier inscrit
jerome bonneau