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
 

Discussions similaires

Réponses
9
Affichages
342
Réponses
5
Affichages
369
Réponses
3
Affichages
161

Statistiques des forums

Discussions
313 907
Messages
2 103 456
Membres
108 671
dernier inscrit
FABY