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 :

[vba] Problème avec MoveNext - Erreur de collection ?


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut [vba] Problème avec MoveNext - Erreur de collection ?
    Bonjour !

    j'ai un souci avec mes MoveNext. Lors de l'éxécution du code une erreur apparait : Elément non trouvé dans cette collection.

    Voici le code en question :
    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
     
        Dim sql As String
        Dim tia As Recordset
        Dim tnaf1 As Recordset
        Dim tnafr As Recordset
        Dim i As Integer
     
        DoCmd.SetWarnings False
        sql = "DELETE T_info_arrete.*"
        sql = sql + " FROM T_info_arrete;"
        DoCmd.RunSQL sql
     
        Set tia = CurrentDb.OpenRecordset("T_info_arrete")
        Set tnaf1 = CurrentDb.OpenRecordset("T_naf_annee1")
        Set tnafr = CurrentDb.OpenRecordset("T_naf_routine")
     
        While Not tnaf1.EOF
            For i = 2 To tnaf1.Fields.Count
                If Not IsNull(tnaf1.Fields(i)) Then
                    tia.AddNew
                    tia.Fields(0) = tnaf1.Fields(0)
                    tia.Fields(1) = tnaf1.Fields(1)
                    tia.Fields(2) = i - 1
                    tia.Fields(3) = tnaf1.Fields(i)
                    While Not tnafr.EOF And (IsNull(tia.Fields(4)) Or tia.Fields(4) = 0)
                        If tnafr.Fields(2) = tnaf1.Fields(2) And tnafr.Fields(0) = tnaf1.Fields(0) Then
                            tia.Fields(4) = tnafr.Fields(i)
                        End If
                        tnafr.MoveNext
                    Wend
                    tia.Update
                End If
            Next i
            tnaf1.MoveNext
        Wend
     
        tia.Close
        tnaf1.Close
        tnafr.Close
        Set tia = Nothing
        Set tnaf1 = Nothing
        Set tnafr = Nothing
        DoCmd.SetWarnings True

  2. #2
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Finalement, je ne suis pas certain que le problème vienne du MoveNext, car qd je le met en commentaire, l'erreur reste la même !

  3. #3
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Bon, pour être plus précis et peut-être pour que vous puissiez mieux localiser le problème, voici ce qui se passe :

    Le premier enregistrement de tnaf1 est pris en compte ;
    la boucle For fonctionne correctement ;
    la deuxième boucle while n'est pas prise en compte ou ne fonctionne pas correctement ;
    on ne passe pas à l'enregistrement suivant de tnaf1 à cause de l'erreur citée précédemment...

    Please help me !

  4. #4
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    j'ai localisé un des problèmes :

    ce n'est pas le MoveNext qui est en cause, mais le counter de ma boucle For :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tnaf1.Fields.Count
    en effet, si je remplace cette portion de code par une valeur numérique, tous les enregistrements de tnaf1 sont pris en compte.

    il me reste le problème de ma deuxième boucle while...

    ceci dit, n'y a t'il pas un moyen de compter automatiquement le nombre de champ d'une table et de baser une boucle For sur ce nombre, plutot que de rentrer une valeur numérique ?

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    pour la deuxième boucle While, je dirai qu'il manque un tnafr.MoveFirst avant d'entrer dans la boucle.
    Autrement tu reste en permanence après le dernier enregistrement et EOF est toujour Vrai.

    Pour les champs :
    Ils vont de 0 à Fields.Count - 1.
    Ex: de 0 à 4 pour une table à cinq champs.

    A+

  6. #6
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Merci !
    En effet en ajoutant tnafr.MoveFirst, la deuxième boucle fonctionne... presque !

    le nouveau code est donc le suivant :
    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
    45
    46
     
        Dim sql As String
        Dim tia As Recordset
        Dim tnaf1 As Recordset
        Dim tnafr As Recordset
        Dim i As Integer
     
        DoCmd.SetWarnings False
        sql = "DELETE T_info_arrete.*"
        sql = sql + " FROM T_info_arrete;"
        DoCmd.RunSQL sql
     
        Set tia = CurrentDb.OpenRecordset("T_info_arrete")
        Set tnaf1 = CurrentDb.OpenRecordset("T_naf_annee1")
        Set tnafr = CurrentDb.OpenRecordset("T_naf_routine")
     
        While Not tnaf1.EOF
            For i = 2 To 11
                If Not IsNull(tnaf1.Fields(i)) Then
                    tia.AddNew
                    tia.Fields(0) = tnaf1.Fields(0)
                    tia.Fields(1) = tnaf1.Fields(1)
                    tia.Fields(2) = i - 1
                    tia.Fields(3) = tnaf1.Fields(i)
                    tnafr.MoveFirst
                    While Not tnafr.EOF And (IsNull(tia.Fields(4)) Or tia.Fields(4) = 0)
                        If tnafr.Fields(2) = tnaf1.Fields(2) And tnafr.Fields(0) = tnaf1.Fields(0) Then
                            tia.Fields(4) = tnafr.Fields(i)
                        Else
                            tia.Fields(4) = 0
                        End If
                        tnafr.MoveNext
                    Wend
                    tia.Update
                End If
            Next i
            tnaf1.MoveNext
        Wend
     
        tia.Close
        tnaf1.Close
        tnafr.Close
        Set tia = Nothing
        Set tnaf1 = Nothing
        Set tnafr = Nothing
        DoCmd.SetWarnings True
    le problème, c'est que j'ai des mélanges dans les valeurs, mais pas pour toutes, et des valeurs qui ne sont pas prises en compte (en rapport avec tnafr)

    j'explique le but de la manoeuvre, ça peut aider !

    j'ai deux tables T_naf_annee1 et T_naf_routine qui ont la même structure :
    n°arrete, nom_analyse, naf1,... naf0
    T_naf_annee1 correspond à la première année d'analyse, et T_naf_routine correspond aux années suivantes (routine)

    Le but est de regrouper dans une même table T_info_arrete, T_naf_annee1 et T_naf_arrete, sachant qu'il est possible qu'en routine, un type d'analyse ne soit plus effectué (d'où le tia.Fields(4)=0).
    D'autre part, la table T_info_arrete a la structure suivante :
    n°arrete, nom_analyse, nb_analyse_annee1, nb_analyse_routine

    Voila ce que j'essaie de faire, j'y suis presque grâce à ton aide, mais pas encore !

  7. #7
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Mille excuses pour mon incompétence notoire !

    l'erreur concernant la deuxième boucle while et le mélange des valeurs vient tout simplement du fait que je ne contraignais pas sur le bon champ...

    en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If tnafr.Fields(2) = tnaf1.Fields(2) And tnafr.Fields(0) = tnaf1.Fields(0) Then
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If tnafr.Fields(1) = tnaf1.Fields(1) And tnafr.Fields(0) = tnaf1.Fields(0) Then
    ça fonctionne très bien !!!

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

Discussions similaires

  1. problème avec l'apostrophe dans une requête
    Par mika0102 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2019, 16h51
  2. Problème avec l'erreur 3464 sur access
    Par somalien10 dans le forum Access
    Réponses: 10
    Dernier message: 16/05/2006, 09h30
  3. Problème avec sizeof(...) : erreur de taille
    Par Invité dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 06/05/2006, 12h53
  4. [VBA] Problème avec composant VB6
    Par Diablo_22 dans le forum Général VBA
    Réponses: 8
    Dernier message: 16/03/2006, 20h41
  5. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24

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