IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Transporter une formule Excel dans Access


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut Transporter une formule Excel dans Access
    bonjour au forum,

    Débutant en Access, j'aimerais tranporter une formule d'un fichier Excel pour calculer un temps de carence pour un nouvelle mission d'intérimaire. J'arrive a faire une requete avec une partie du calcul mais la formule doit prendre uniquement les jours de travail (workday) et une function IF.
    Je pense qu'il faut passer par du VBA ou SQL mais là cela dépasse mes competences.
    Je joint le fichier Excel, la formule finale est en AC.

    Merci pour toute l'aide que vous pourriez m'apporter.

    Cordialement.Exemple carence.xlsx

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour,

    Pour autant que la règle est

    - si la durée du dernier contrat est supérieure à 14 jrs, alors durée divisé par 2 et forcer à l'unité supérieure
    - sinon, retourner vide,

    voici une fonction équivalente en Access

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Compare Database
    Option Explicit
     
     
    Public Function carence(DureeDernContrat As Long) As String
      If DureeDernContrat > 14 Then
          carence = CInt((DureeDernContrat / 2) + 0.5)
        Else
          carence = ""
      End If
     
    End Function



  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Bonsoir au Forum et à Claude

    Je vais tenter cela demain,

    Merci pour ce tuyau.
    J'ai toujours un problème car la règle doit impliquer une durée du contrat sans compter les W.E (les jours fériés comptes) et je n'arrive pas à faire ce calcul en access.
    J'ai l'expérience qu'avec Access 2007 je ne suis pas arrivé à faire deux champs calculé dans une même requête, d'où mon idée de passer par le VBA ou SQL.

    Cordialement

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Pour les jours ouvrés, regarde ici : http://claudeleloup.developpez.com/t...plic-ploc/#LIV

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Bonjour Claude et au forum,

    Concernant la formule, elle dit
    Si la durée du dernier contrat est <14, divisé la durée par 2, sinon divisé par 3.

    J'ai réussi à faire la table des jours ouvrés, j'ai mis la function dans un module, comment faire maintenant pour mettre tout cela en pratique.

    Dans mon formulaire, j'ai les chants "début de contrat" et "fin de contrat", "durée du "contrat", "carence" et "date de reprise possible".

    est-ce que je dois creer un bouton charger de faire les calcules en VBA.

    Cdt.

  6. #6
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour,

    Si tu veux, je te proposerai un exemple. Poste une version Access2000 de ta db (avec des données anonymes, mais représentatives) pour que je puisse tester.


    Si la durée du dernier contrat est <14, divisé la durée par 2, sinon divisé par 3.
    Dans l'exemple que tu donnais 15/2 = 8 jrs
    Que doit donner 16/3 ? 5 ou 6 jrs ?

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Gestion_perso_usine__DEMO.zipBonjour Claude,

    Merci pour ton aide.
    Je n'ai pas pu enregistrer sous Access 2000. Je joins une base demo sans données confidentielles au format 2007

    Concernant la carence >14, il faut forcer à l'entier supérieur.

    Merci encore

    Cdt,
    Pièce jointe 188155

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Il s'agit du formulaire F_Mission

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour celthi et Claude ,

    Ci-joint la base en version 2000. C'est tout ce que je peux faire.

    @ celthi : il fallait supprimer le champ image personnel qui était définit comme étant pièce jointe. Access 2000 ne les gère pas.

    Cordialement
    Fichiers attachés Fichiers attachés

  10. #10
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Merci madefemere
    Je ne comprenais pas pourquoi.

    Est-il possible de passer par un evenement afterupdate du champs "date de fin de la dernière mission" pour utiliser la function et faire les calcules. J'ai encore beaucoup de mal avec VBA ou bien existe t'il un moyen plus efficient et plus propre

    Merci

    Cdt.

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Merci Mandresy,

    Je regarde après le repas !

  12. #12
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Voici



    N.B. Dans la table T_Mission, j’ai modifié le type de « Durée_dernière_mission » : date => long.

    Dans l’événement « Après mise à jour » du contrôle « Date_Fin_derniere_mission », ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Date_Fin_derniere_mission_AfterUpdate()
      'Vérifier que les dates sont cohérentes
      If Me.Date_Fin_derniere_mission - Nz(Me.Date_Début_derniere_mission, #1/1/2100#) < 0 Then
          MsgBox "les 2 dates sont incohérentes"
          Exit Sub
      End If
      'Calcul de la durée de la dernière mission
      Me.Durée_dernière_mission = NbreJOuvDeA(Me.Date_Début_derniere_mission, Me.Date_Fin_derniere_mission)
      'Calcul de la carence
      If Me.Durée_dernière_mission > 14 Then
          Me.Carence = Int((Me.Durée_dernière_mission / 3) + 0.67)
        Else
          Me.Carence = Int((Me.Durée_dernière_mission / 2) + 0.5)
      End If
    End Sub
    Fichiers attachés Fichiers attachés

  13. #13
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Bonjour Claude,
    Merci beaucoup, cela fonctionne.

    Il reste le champs "Date de reprise mini" à coder.
    J'ai pensé à mettre un évenement après mise à jour du champs Carence.
    Je veux récupérer la date du champs "Date fin dernière mission" et y ajouter la carence en tenant compte uniquement des jours ouvrés. Je me demande comment repassé par les données de la table des jours ouvrés, ou bien existe t'il une fonction ?

    Cdt,

  14. #14
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Désolé,
    Je viens de consulter ton article et j'ai un début de réponse, reste à réussir à l'adapter à mon cas.
    Cdt,

  15. #15
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Bonjour Claude,

    Un grand merci : ça fonctionne, j'ai récupéré la fonction dans ton article et c'est tout bon.
    Juste un point de finiolage. La fonction renvoi 12:00:00 AM si la date de fin de contrat n'est pas dans la tables des jours ouvrés, y aurait-il un moyen d'avancer cette date d'un ou deux jours en cas d'erreur ?

    Cdt

  16. #16
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour,


    Si je te comprends bien :

    la date de reprise mini = le lendemain de la date de fin + nbre de jours de carence,
    mais si la date de fin renseignée n’est pas ouvrable, alors il faut considérer la veille ouvrable de la fin renseignée.
    Ajoute cette fonction dans module2
    (N.B. Je viens de corriger une erreur dans le plic-ploc.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function Echeance(DateDebut As Date, NbreJrs As Integer) As Date
     'Renvoie la date ouvrable qui vient après le nombre de jours (qui peut être négatif)
     'DateDebut sous la forme anglo-saxonne
     'Si cette DateDebut n'existe pas dans la table, la fonction renvoie 00:00:00
     
      Dim rst As Recordset
      Set rst = CurrentDb.OpenRecordset("SELECT JoursOuvres FROM tJoursOuvres ORDER BY JoursOuvres;")
      Do While Not rst.EOF
        If rst("JoursOuvres") = DateDebut Then
            rst.Move NbreJrs
            Echeance = rst("JoursOuvres")
            Exit Function
          Else
            rst.MoveNext
        End If
      Loop
    End Function
    Et l’événement Après mise à jour de Date fin de dernière mission devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub Date_Fin_derniere_mission_AfterUpdate()
      Dim dFinReelle As Date
      'Vérifier que les dates sont cohérentes
      If Nz(Me.Date_Fin_derniere_mission, #1/1/1900#) - Nz(Me.Date_Début_derniere_mission, #1/1/2100#) < 0 Then
          MsgBox "les 2 dates sont incohérentes"
          Exit Sub
      End If
      'Calcul de la durée de la dernière mission
      Me.Durée_dernière_mission = NbreJOuvDeA(Me.Date_Début_derniere_mission, Me.Date_Fin_derniere_mission)
      'Calcul de la carence
      If Me.Durée_dernière_mission > 14 Then
          Me.Carence = Int((Me.Durée_dernière_mission / 3) + 0.67)
        Else
          Me.Carence = Int((Me.Durée_dernière_mission / 2) + 0.5)
      End If
      'Calcul de la date de reprise mini
      'Trouver la date de fin réelle (si la date fin non ouvrable ==> sa veille ouvrable)
      dFinReelle = DMax("JoursOuvres", "tJoursOuvres", "JoursOuvres<=#" & Format(Me.Date_Fin_derniere_mission, "mm/dd/yyyy") & "#")
      Me.Date_de_reprise_mini = Echeance(dFinReelle, Me.Carence + 1)
    End Sub


    Fichiers attachés Fichiers attachés

  17. #17
    Membre du Club
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Novembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 111
    Points : 54
    Points
    54
    Par défaut
    Bonsoir au Forum, Bonsoir Claude.

    Après avoir fait ces modifs, tout fonctionne à merveille.
    Merci pour ton aide sur ce point. Mon projet avance à grands pas, j'aurais certainement au moins une autre question, mais j'ouvrirai une autre discussion si je ne trouve pas de réponses.

    Mon probleme est résolu.

    Cdt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/10/2016, 18h53
  2. [AC-2007] Insérer une formule excel dans un champ
    Par jpg75014 dans le forum IHM
    Réponses: 5
    Dernier message: 22/06/2011, 12h07
  3. VBA lier une table Excel dans Access
    Par darkspoilt dans le forum VBA Access
    Réponses: 10
    Dernier message: 21/05/2007, 15h33
  4. Réponses: 5
    Dernier message: 20/06/2006, 08h24
  5. [debutant] Traduite une formule excel dans access
    Par zelob dans le forum Access
    Réponses: 5
    Dernier message: 25/02/2006, 05h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo