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
Bonjour à toutes et à tous,
J'ai encore modifié mon fichier. J'ai ajouté un code après un double-clique dans une cellule vide de la colonne B de la feuille "Saisie". Ce code permet l'affichage d'un formulaire dans lequel l'employé(e) pourra saisir son code personnel. Si le code est bon, alors son Nom, la date du jour et l'heure d'arrivée seront inscrites dans le tableau.
Cependant, je rencontre une erreur d'exécution'13' - incompatibilité de type dans le code suivant et sur la ligne en gras.
Je n'arrive pas à trouver ce qui ne va pas. Pouvez-vous m'aider s'il vous plait ?
Je vous en remercie par avance

VB:
Sub Mise_a_jour(CodeBarre, Présent)
'Création de la macro pour enregistrer les heures d'arrivée et de départ
'Définition des variables
Dim Statut As String, Ligne As Integer, Lig As Integer, Code As Integer
 
Lig = Range("B1048576").End(xlUp).Row
Code = Sheets("Liste agents").Range("B1048576").End(xlUp).Row

'On recherche le code
[B][COLOR=rgb(184, 49, 47)]If Application.CountIf(Code, CodeBarre) = 0 Or CodeBarre = "" Then[/COLOR][/B]
    MsgBox "Ce code est absent de la liste - Veuillez recommencer ou annuler !"
    Exit Sub
Else
'On recherche le Nom de l'employé(e) à partir de son code barre
Ligne = Application.Match(CodeBarre, (Sheets("Liste agents[B:B]")), 0)

'On demande si l'employé(e) est présent
If Present = 1 Then Statut = 6
'Réponse 6 pour oui

'Enregistre la présence ainsi que les horraires d'arrivée/départ
Select Case Statut
    Case 6
    Cells(Lig, "C").Interior.ColorIndex = 4 'colore en vert la cellule où se trouve le Nom
    Cells(Lig, "D") = Date
    Cells(Lig, "E") = Time
Case Else: Exit Sub
End Select
End If
End Sub
 

Pièces jointes

  • PointHeure3.xlsm
    219.7 KB · Affichages: 2

TooFatBoy

XLDnaute Barbatruc
Lig = Range("B1048576").End(xlUp).Row Code = Sheets("Liste agents").Range("B1048576").End(xlUp).Row
Dans ton dernier classeur, la liste des agents est dans un TS !

À mon avis, il ne suffit pas de chercher si le code est dans la liste, mais il vaudrait mieux regarder si le code saisi correspond au code de l'agent.



Si tu veux obtenir un numéro de ligne en partant de 1048576, il ne faut pas récupérer le résultat dans un Integer, mais plutôt dans un Long, me semble-t-il.



Code est le numéro de la dernière ligne de la colonne B, et tu fais un CountIf pour savoir si le code existe ???
 
Dernière édition:

vgendron

XLDnaute Barbatruc
hello

essaie avec
application.worksheetfunction.countif

après.. je ne comprend pas la logique du classeur

qui a le droit de faire quoi.. saisir un mot de passe à chaque double clic..,??
protéger des feuilles des cellules, mais laisser libre accès la liste des noms et des mots de passe...??
y 'en a un peu dans tous les sens.. on s'y perd..
 

NONO14

XLDnaute Occasionnel
hello

essaie avec
application.worksheetfunction.countif

après.. je ne comprend pas la logique du classeur

qui a le droit de faire quoi.. saisir un mot de passe à chaque double clic..,??
protéger des feuilles des cellules, mais laisser libre accès la liste des noms et des mots de passe...??
y 'en a un peu dans tous les sens.. on s'y perd..
Bonjour,
Pour le moment, je suis encore sur des essais. En finalité, l'agent devra taper un code pour pointer et uniquement son code, l'heure de son arrivée et celle de son départ sera automatiquement inscrite dans le tableau sans qu'il ait besoin de la taper au clavier et ensuite il ne pourra plus modifier sa saisie, s'il fait une erreur, il devra passer par le responsable pour la modification. Bien sûr, cela suppose que l'employé(e) ne donne pas son code à quelqu'un pour pointer à sa place. D'ailleurs, le double-clique va être supprimé au profit d'un bouton d'appel du formulaire pour le pointage (préférence du donneur d'ordres).
Un(e) employé(e) pourra être amené à pointer au maximum 4 fois dans la journée (2 plages horaires, par exemple 6:30 - 12:00 et 14:00 - 18:00), je n'ai pas encore trouvé le code pour ça.
Le reste du classeur sera géré par le responsable et pour afficher les feuilles il devra taper son mot de passe.
Le planning horaire servira à contrôler si l'employé(e) a bien respecté ses horaires de la semaine, là aussi j'y travail.
Comme tu peux le constater, j'ai encore du boulot sur la planche et vos bons conseils à tous m'aident à progresser, lentement certes, mais j'avance. - Pas facile avec le donneur d'ordre sur le dos et ses petits caprices. mais il faut ménager la chèvre et le choux...
 

NONO14

XLDnaute Occasionnel
Dans ton dernier classeur, la liste des agents est dans un TS !

À mon avis, il ne suffit pas de chercher si le code est dans la liste, mais il vaudrait mieux regarder si le code saisi correspond au code de l'agent.



Si tu veux obtenir un numéro de ligne en partant de 1048576, il ne faut pas récupérer le résultat dans un Integer, mais plutôt dans un Long, me semble-t-il.



Code est le numéro de la dernière ligne de la colonne B, et tu fais un CountIf pour savoir si le code existe ???
Oui tout à fait. Je tâtonne encore
 

vgendron

XLDnaute Barbatruc
une question: Combien d'agents as tu à gérer??

tu pourrais envisager un formulaire plein écran sur lequel l'agent clique sur son nom
puis demande de code d'accès
si code OK ==> pointage automatique: selon l'heure qu'il est: c'est mis en entrée ou en sortie.. avec message d'alerte si un pb est détecté pour qu'il se rapproche du responsable
 

vgendron

XLDnaute Barbatruc
faire du code, c'est bien.. mais il faut commencer par définir ton besoin.. le code, c'est juste de la traduction.
si le besoin n'est pas suffisamment défini, ton code ne sera jamais "bon"
définir le besoin, c'est aussi définir ce que tu ne veux pas, ou ce que l'utilisateur n'a pas le droit de faire
 

NONO14

XLDnaute Occasionnel
une question: Combien d'agents as tu à gérer??

tu pourrais envisager un formulaire plein écran sur lequel l'agent clique sur son nom
puis demande de code d'accès
si code OK ==> pointage automatique: selon l'heure qu'il est: c'est mis en entrée ou en sortie.. avec message d'alerte si un pb est détecté pour qu'il se rapproche du responsable
Il y a une vingtaine d'employés, tous des saisonniers. Certains travaillent tous les jours, d'autres 4 ou 5 jours, tous dans la limite des 35 heures. Certains travaillent en continu (6:30 - 12:30 par exemple) et d'autres en plage de 4 heures. Ce n'est pas simple, de plus toutes les semaines sont différentes.
 

NONO14

XLDnaute Occasionnel
faire du code, c'est bien.. mais il faut commencer par définir ton besoin.. le code, c'est juste de la traduction.
si le besoin n'est pas suffisamment défini, ton code ne sera jamais "bon"
définir le besoin, c'est aussi définir ce que tu ne veux pas, ou ce que l'utilisateur n'a pas le droit de faire
Oui c'est pour cela que je vais provoquer une réunion afin de mettre le projet à plat une bonne fois pour toute, car pour le moment chacun y va de ses petites idées et moi je me casse la tête à trouver des solutions qui plaisent à tous. Faire et défaire ça à l'air de leur plaire...
 

NONO14

XLDnaute Occasionnel
Voici en pièce jointe le tableau de bord pour l'exécution de l'application. Sur le papier, il n'y rien de trop compliqué, mais à réaliser cela l'est davantage. Ce travail est pour une association dont je suis membre bénévole. Nous avons des employé(e)s en réinsertion qu'il faut aider à remettre en selle après des accros dans leur vie. Nous devons donc gérer leur emploi du temps pour une juste rémunération, sans qu'aucune des parties ne soit lésée. Je n'ai pas de calendrier de travail, le plus rapidement étant le mieux.
Je vais faire ce que je peux avec mon humble connaissance. Sur ce forum on trouve pas mal de tutos et d'aide et je vous en remercie.
Allez, assez de bavardage, j'ai du boulot sur la planche.
 

Pièces jointes

  • DescriptifApplication.docx
    16.5 KB · Affichages: 2

Discussions similaires

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

Statistiques des forums

Discussions
313 911
Messages
2 103 502
Membres
108 681
dernier inscrit
eaglesinfo