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 :

Erreur 2766 - Erreur automation "C"


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut Erreur 2766 - Erreur automation "C"
    Bonjour la Communauté,

    Dans le code ci-dessous j'ai ajouté le parametre lve pour faire une selection supplementaire mais depuis il m'affiche une erreur:
    Citation Envoyé par Erreur 2766
    l'objet ne contient pas d'objet Automation <<C>>
    Mais je ne vois pas où access veut en venir?

    Ligne d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Nz(DCount("*", "Employee_Data", sSQL)) = 0 Then
    Quelqu'un pourrait-il m'aider?

    Merci d'avance

    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
    21
    22
    23
    24
    25
    26
     
    Public Function nbJ(nP As Long, lve As String, d1 As Date)
     
       Dim n As Long
       Dim sSQL As String
     
       sSQL = "[Employee Number] = " & nP & " And [Leave] = " & lve & " And [Date_Leave] = #" & Format(DateAdd("d", n, d1), "yyyy-mm-dd") & "#"
       If Nz(DCount("*", "Employee_Data", sSQL)) = 0 Then
          '--- jour précédent est contigu
          nbJ = 1
       Else
          '--- jour précédent n'est pas contigu
          n = 0
          While True
             n = n + 1
          sSQL = "[Employee Number] = " & nP & " And [Leave] = " & lve & " And [Date_Leave] = #" & Format(DateAdd("d", n, d1), "yyyy-mm-dd") & "#"
          Debug.Print sSQL,
          Debug.Print Nz(DCount("*", "Employee_Data", sSQL))
             If Nz(DCount("*", "Employee_Data", sSQL)) = 0 Then
                nbJ = n
          Debug.Print "Nbr j :"; nbJ,
                Exit Function
             End If
          Wend
       End If
    End Function

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bonjour,

    C'est une chaîne de caractères, il faut l'encadrer par des guillemets :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    And [Leave] = """ & lve & """ And
    Sous réserve que lve ne contiennent pas de guillemets, sinon il faut les doubler dans la variable.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut
    Ok mon code erreur a disparu mais j'ai des 1 partout. En fait il ne reconnait pas & lve & qui est un texte court

    Comprends vraiment pas.

  4. #4
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par HABILER Voir le message
    Ok mon code erreur a disparu mais j'ai des 1 partout. En fait il ne reconnait pas & lve & qui est un texte court

    Comprends vraiment pas.
    Bonsoir,

    Je ne comprends rien...

    Des 1 partout, un texte court...

    Vu de l'extérieur c'est difficile.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut
    Le champs Leave a texte court comme type de donnee deans ma table Employee_Data.
    Et le résultat du est

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Nbr j : 1     [Employee Number] = 4682 And [Leave] = ' & lve & ' And [Date_Leave] = #2019-04-23#   0 
    ……………………………………………………………………………………………………………………………………………..
     
    Public Function nbJ(nP As Long, lve As String, d1 As Date)
     
       Dim n As Long
       Dim sSQL As String
     
       sSQL = "[Employee Number] = " & nP & " And [Leave] = '& lve &' And [Date_Leave] = #" & Format(DateAdd("d", n, d1), "yyyy-mm-dd") & "#"
       If Nz(DCount("*", "Employee_Data", sSQL)) = 1 Then
          '--- jour pr?c?dent est contigu
          nbJ = 0
        Debug.Print "Nbr j 0:"; nbJ,
       Else
          '--- jour pr?c?dent n'est pas contigu
          n = 0
          While True
             n = n + 1
          sSQL = "[Employee Number] = " & nP & " And [Leave] = ' & lve & ' And [Date_Leave] = #" & Format(DateAdd("d", n, d1), "yyyy-mm-dd") & "#"
          Debug.Print sSQL,
          Debug.Print Nz(DCount("*", "Employee_Data", sSQL))
             If Nz(DCount("*", "Employee_Data", sSQL)) = 0 Then
                nbJ = n
          Debug.Print "Nbr j :"; nbJ,
                Exit Function
             End If
          Wend
       End If
    End Function

  6. #6
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Ok, texte court c'est le type de colonne de la table.
    lve est une variable string.

    Et l'encadrement avec guillemets doubles que j'avais proposé est passé en guillemets simples, ce qui est possible, mais là c'est mal écrit .
    La variable doit être sortie de la chaîne de caractères pour être évaluée.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut
    Ok. Cela marche mais comment faire pour ne retenir ou mettre en evidence le nombre maximum.
    En fait cela équivaudrait a mon sens de tester que si si n-1 existe alors n-1 egale 0
    Ou ma logique est elle erronée.?Et comme mon code foctionne ai peur de le bousiller.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut Boucle repetitive inutile?
    Bonjour à tous,

    Lorsque j'analyse le debug.print de mon sSql je constate que mon code repasse la condition autant de fois qu'il y a de possibilités de dates contigües ce qui avec un fichier avec un miller d'enregistrement l'amène a bloquer le PC. Est_ce normal. Ou est-ce dû à l'ecriture de mon code. ?

    Merci d'avance pour votre aide.

    Habiler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-17#  DCount :  1   Nbr n: 1 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-18#  DCount :  1   Nbr n: 2 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-19#  DCount :  1   Nbr n: 3 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-20#  DCount :  0   Nbr n: 4 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-18#  DCount :  1   Nbr n: 1 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-19#  DCount :  1   Nbr n: 2 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-20#  DCount :  0   Nbr n: 3 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-19#  DCount :  1   Nbr n: 1 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-20#  DCount :  0   Nbr n: 2 
    sSQL :[Employee Number] = 4682 And [Leave] = "CS1" And [Date_Leave] = #2019-04-20#  DCount :  0   Nbr n: 1 

  9. #9
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bonjour,

    Je n'ai pas étudié tout le code, mais il certain que des DCount dans une boucle ce n'est pas performant.
    Il y a sans doute mieux à faire avec un recordset, en inversant la logique.
    Plutôt que de requêter jour par jour, faire une seule requête et la parcourir.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut Addition de jours contigus.
    Bonjour,

    J'essaye de chercher si plusieurs dates se souvent pour les additionner mais ma fonction Dateadd n'a pas l'air de fonctionner.
    J'avais un code utilisant Dcount mais il m'a été conseiller d'utiliser DAO. Mais comme n'y connait rien j'ai fabrique quelque chose.
    Si quelqu'un pouvait m'aider?

    Merci d'avance

    Habiler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Date_Leave] = #" & Format(DateAdd("d", n, d1), "yyyy-mm-dd") & "#")
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Public Function nbJrs(nP As Long, lve As String, d1 As Date)
        Dim dbs As DAO.Database
        Dim rst As DAO.Recordset
        Dim strDateLeave As String
        Dim n As Long
        Set dbs = CurrentDb
        n = 0
        '
        Set rst = dbs.OpenRecordset("SELECT * FROM qryMain WHERE [Employee Number] = " & nP & " And [Leave] = """ & lve & """ And [Date_Leave] = #" & Format(DateAdd("d", n, d1), "yyyy-mm-dd") & "#")
           Debug.Print n
        'Begin row processing
        Do While Not rst.EOF
     
     
            strDateLeave = rst!Date_Leave
     
        n = n + 1
            'Now filter the Recordset to return only the customers from that city
     
           'rst.Filter = "Date_Leave = " & Format(DateAdd("d", n, d1), "yyyy-mm-dd") & ""
            Debug.Print "n :"; n
            Debug.Print "D1 :"; d1
            Debug.Print "strDateLeave :"; strDateLeave
     
            Exit Do
            rst.MoveNext
     
        Loop
     
        rst.Close
     
     
        Set rst = Nothing
     End Function

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    Pourquoi il y a un Exit Do non conditionné au beau milieu de ton Do While ?

    Ça va arrêter le code dés la 1ère itération donc tu vas lire le 1er enregistrement et sortir après.
    En principe on ne sert du Exit Do que si on ne veut pas lire tous les enregistrements et selon une condition particulière.
    Je pense qu'il faut le supprimer.

    A+

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut
    juste
    J'ai corrigé mais le dateAdd et mon itération ne fonctionnent pas.
    Quelque chose m’échappe. Ne parvient a écrire la logique à suivre

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 816
    Points : 14 909
    Points
    14 909
    Par défaut
    bonsoir,
    Peux-tu expliquer ce que tu souhaites faire avec ce code (exemple à l'appui si possible) ? car, pour le moment, je pense que personne n'a compris à quoi il sert ...

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut
    Bonjour à tous,

    le but est de comptabiliser les périodes. Donc si plusieurs dates se suivent les comptabiliser.
    J'avais essayé avec un DCOUNT mais cela prenait un temps fou et on m'a conseillé de le faire via DAO. Mais comme je suis nul en vba, je m’emmêle les pinceaux et je ne trouve pas la logique.
    Si date + 1 jour existe alors on comptabilise jusqu'à ce que date+1 n'existe pas.
    J'ai essayé avec DateAdd mais il n'ajoute pas de 1 à ma date.

    En fait j'ai les données suivantes :

    Employee Number Leave Date_Leave.
    0002 xyz 01/04/2019
    0002 xyz 02/04/2019
    0002 xyz 03/04/2019
    0002 xyz 10/04/2019
    0002 xyz 11/04/2019
    0002 abc 27/04/2019
    0002 abc 28/04/2019
    0002 abc 30/04/2019
    0002 xyz 01/05/2019


    et je voudrais obtenir :

    Employee Number Leave Date_Leave. Contigous days
    0002 xyz 01/04/2019 3
    0002 xyz 10/04/2019 2
    0002 abc 27/04/2019 2
    0002 abc 30/04/2019 1
    0002 xyz 01/05/2019 1
    0003 ……...

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 816
    Points : 14 909
    Points
    14 909
    Par défaut
    bonjour,
    c'est nettement plus lumineux avec un exemple ...
    Une question: le résultat de sortie doit-il être dans une nouvelle table ? Car autrement, ce serait plus compliqué ...

  16. #16
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 391
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    Bonsoir,

    Il faudrait intégrer dans la boucle principale, une autre boucle pour comptabiliser les jours qui se suivent.

    On ajoute le nombre de jours contigus associé à une date et à un employé dans une table T_NbJoursPeriode :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Dim rst as DAO.RecordSet
    Dim rst2 as DAO.RecordSet
    Dim EmployeeNumber as string, Leave as string, DateLeave as Date
     
    ...
     
    DoCmd.SetWarnings false
    DoCmd.RunSQL"delete from T_NbJoursPeriode;" ' on vide la table temporaire
    DoCmd.SetWarnings true
     
    Set rst2 = dbs.OpenRecordset("T_NbJoursPeriode",dbopendynaset) ' on ouvre le recordset lié à la table temporaire pour la mettre à jour
     
    Do While Not rst.EOF
     
        EmployeeNumber= rst![Employee Number]  
        Leave = rst![Leave]
        DateLeave = rst![Date_Leave]
     
        dt=  rst![Date_Leave]
     
            do while (EmployeeNumber= rst![Employee Number]) and (Leave = rst![Leave]) and (dt=rst![Date_Leave]) ' on parcourt les jours qui se suivent pour un même employé
                 dt=dt+1
                 rst.MoveNext
                     if rst.eof then exit do
            Loop
     
            rst2.addnew ' ajout d'une ligne dans la table temporaire T_NbJoursPeriode
            rst2![Employee Number]=EmployeeNumber
            rst2![Leave]=Leave
            rst2![Date_Leave]=DateLeave
            rst2![Contigous days]=(dt-DateLeave) ' nombre de jours contigus
            rst2.Update
     
        Loop
     
    ....
     
    rst.Close
    rst2.Close
     
    set rst=Nothing
    set rst2=Nothing
     
    ....

    Cdlt,

Discussions similaires

  1. postgres-php erreur unterminated quoted
    Par peppena dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 02/05/2006, 16h24

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