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 Discussion :

probleme de boucle


Sujet :

VBA

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 11
    Points
    11
    Par défaut
    bonjour a tous,

    Voila j'ai un petit probleme sur un programme VBA (toujours le meme, sa fait plusieurs sujet que je poste )

    Donc je dois enregistrer des NumIntervenant et NumTache d'excel vers acces dans une table PARTICIPER, j'ai donc fait un programme en VBA, sa marche mais le seul probleme c'est que le programme enregistre dans la base de donnée seulement le premier NumIntervenant et le premier NumTache mais pas les autres (en gros il ne passe pas a la ligne suivante), donc il doit y avoir un probleme de boucle surement dans mon programme...

    Mon 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
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    '=======variable globale du programme =======
     
    'déclaration de la variable connexion
    Public connexion As ADODB.Connection
    Public Const piloteBase As String = "Microsoft.Jet.Oledb.4.0"
     
    'fait le lien avec la base de donnée Gestproj
    Public Const cheminBase As String = "chemin de ma base"
     
    'déclaration de la variable RECAP en tant que chaine de charactere qui prend comme valeur
    '"RECAP"(feuille de travaille)
    Public Const RECAP As String = "RECAP"
    ' ligne du tableau ou il y a le premier numéro intervenants
    Public Const lgDepartNumIntervenant = 12
    'colonne du tableau ou il y a les numéros des taches
    Public Const colNumTache = 7
    'colonne du tableau ou il y a les numéros d'intervenants
    Public Const colNumIntervenant = 6
    Sub ouvertureBase()
     
        ' Teste pour savoir si le chemin est accessible à la base de donnée
        If Len(Dir("chemin de ma base")) > 0 Then
            ' Déclaration de la variable de connexion
            Set connexion = New ADODB.Connection
     
            'Définition du pilote de connexion
            connexion.Provider = piloteBase
     
            'Définition de la chaîne de connexion
            connexion.ConnectionString = "chemin de ma base"
     
            'Ouverture de la base de données
            connexion.Open
        End If
    End Sub
    'fermeture de la base
    Sub fermetureBase()
        connexion.Close
    End Sub
     
    Sub AjouterIntervenant()
     
    'déclaration des données a enregistrer
    Dim NumIntervenant As Long
    Dim NumTache As Integer
     
    'variable necessaire pour le traitement de l'enregistrement
     
    'indice de parcours du tableau des employés (ligne en cours qui est traité)
    Dim lgIntervenantEnCour As Integer
     
    'l'enregistrement
     
    'initialisation au premier Intervenant a traiter
    lgIntervenantEnCour = lgDepartNumIntervenant
     
    NumIntervenant = Worksheets(RECAP).Cells(lgIntervenantEnCour, colNumIntervenant)
    While (NumIntervenant <> 0)
     
        'récupération des informations à enregister dans la base de données dans la colonne "colNumTache"
        NumTache = Worksheets(RECAP).Cells(lgDepartNumIntervenant, colNumTache)
     
        'enregistrement de l'intervenant dans la base de données : appel du sous-programme EnregistrerIntervenant()
        Call EnregistrerIntervenant(NumIntervenant, NumTache)
     
        'Passage à la ligne suivante, pour enregistrer l'intervenant suivant
        lgIntervenantEnCours = lgIntervenantEnCours + 1
        'écrasement des données présente dans NumIntervenant pour le passage a la ligne suivante
         NumIntervenant = Worksheets(RECAP).Cells(lgIntervenantEnCours, colNumIntervenant)
     
    Wend
    MsgBox ("les numéros intervenants et numéros taches ont bien été enregistrés")
    End Sub
     
    Sub EnregistrerIntervenant(NumeroIntervenant As Long, NumeroTache As Integer)
     
    Dim requeteSQL As String
     
    'construction de la requete d'insertion
        requeteSQL = requeteAjoutIntervenant(NumeroIntervenant, NumeroTache)
     
    'ouverture et appel de la base de données
        Call ouvertureBase
     
     'exécution de la requete d'insertion (SQL)
        connexion.Execute (requeteSQL)
     
    'fermeture de la base de donnée
        Call fermetureBase
    End Sub
     
    Function requeteAjoutIntervenant(NumeroIntervenantI As Long, NumeroTacheI As Integer) As String
     
    'déclaration des variable de la requete
    Dim strSQL As String
     
    strSQL = "INSERT INTO PARTICIPER (NumEmploye, NumTache )" & _
                            " VALUES(""" & NumeroIntervenantI & """, """ & NumeroTacheI & """)"
     
     'renvoie la requete SQL ainsi construite
        requeteAjoutIntervenant = strSQL
     
    End Function
    merci d'avance pour votre aide

    Je pense qu'il n'y a que besoin du programme principal, le reste sa n'a pas d'importance pour mon probleme

    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
    Sub AjouterIntervenant()
     
    'déclaration des données a enregistrer
    Dim NumIntervenant As Long
    Dim NumTache As Integer
     
    'variable necessaire pour le traitement de l'enregistrement
     
    'indice de parcours du tableau des employés (ligne en cours qui est traité)
    Dim lgIntervenantEnCour As Integer
     
    'l'enregistrement
     
    'initialisation au premier Intervenant a traiter
    lgIntervenantEnCour = lgDepartNumIntervenant
     
    NumIntervenant = Worksheets(RECAP).Cells(lgIntervenantEnCour, colNumIntervenant)
    While (NumIntervenant <> 0)
     
        'récupération des informations à enregister dans la base de données dans la colonne "colNumTache"
        NumTache = Worksheets(RECAP).Cells(lgDepartNumIntervenant, colNumTache)
     
        'enregistrement de l'intervenant dans la base de données : appel du sous-programme EnregistrerIntervenant()
        Call EnregistrerIntervenant(NumIntervenant, NumTache)
     
        'Passage à la ligne suivante, pour enregistrer l'intervenant suivant
        lgIntervenantEnCours = lgIntervenantEnCours + 1
        'écrasement des données présente dans NumIntervenant pour le passage a la ligne suivante
         NumIntervenant = Worksheets(RECAP).Cells(lgIntervenantEnCours, colNumIntervenant)
     
    Wend
    MsgBox ("Les numéros intervenants et taches ont bien été enregistrés")
    End Sub
    voila sa sera je pense beaucoup plus lisible

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Je n'ai pas fait de sql depuis 91 (1991, pas 1800) mais j'ajouterais trois doEvents dans ton code, quoique je pense que tu peux te passer du dernier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'ouverture et appel de la base de données
        Call ouvertureBase
        DoEvents
     'exécution de la requete d'insertion (SQL)
        connexion.Execute (requeteSQL)
        DoEvents
    'fermeture de la base de donnée
        Call fermetureBase
        DoEvents
    End
    Si tu ne sais pas, regarde dans l'aide à quoi ça sert
    A tout hasard, donc. En tous cas ta boucle me "paraît" correcte... si tu n'as pas de ligne vide dans ta plage de données dans Excel

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonjour
    la variable Public Const lgDepartNumIntervenant = 12
    etant constante ne permet pas l evolution de la boucle
    declare la Public lgDepartNumIntervenant = 12

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 11
    Points
    11
    Par défaut
    En mettant les DoEvents sa ne marche toujours pas

    et en déclarant la variable comme sa "Public lgDepartNumIntervenant = 12" la ligne s'affiche en rouge...


  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Alors mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public lgDepartNumIntervenant
    et dans la première sub qui l'utilise, initialise-le à 12 comme n'importe quelle variable locale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lgDepartNumIntervenant = 12

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 11
    Points
    11
    Par défaut
    Je viens d'essayer sa ne marche toujours pas, je suis désesperé

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    après cette ligne,
    NumIntervenant = Worksheets(RECAP).Cells(lgIntervenantEnCours, colNumIntervenant)
    mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.print NumIntervenant
    et affiche la fenêtre "Exécution" -> Editeur VB -> Affichage -> fenêtre exécution
    et lance ta procédure. dans la fenêtre, tu devrais voir toutes les valeurs successives de NumIntervenant
    Ensuite, tu dis...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 11
    Points
    11
    Par défaut
    désolé mais j'ai office en anglais donc je ne trouve pas sa :
    "Exécution" -> Editeur VB -> Affichage -> fenêtre exécution

    Tu pourrais me dire les emplacements exactes ...

    Bon ben là je suis completement perdu, je comprend vraiment pas ou peut etre l'erreur ...

    Bon j'ai essayer d'exécuter le programme pas à pas avec F8 et j'ai poser des espions sur NumIntervenants, lgdepartnumintervenant, lgintervenantencours

    Tout se passe bien jusqu'a ce qu'on arrive a cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     lgIntervenantEnCours = lgIntervenantEnCours + 1
    Ou lgintervenantEnCours devrait s'incrémenter de +1 et donc passer a 13 et changer de ligne, mais il ne le fait pas, et donc le programme se termine en ne faisant que la premiere ligne du tableau excel

    j'espere que quelqu'un pourra m'aider ...

    Au pire je peux donner la base de donnée et le programme pour que quelqu'un regarde, et m'aide parce que là j'en est vraiment besoin ...

    EDIT : Je me permet de mettre mon programme et ma base de donnée en esperant que quelqu'un pourra y jeter un coup d'oeil et m'aider

    l'application à développer.zip

    EDIT2 : il faut bien sur dans le programme changer le chemin de la base de donnée

    Bon j'ai du nouveau (meme si il y a pas grand monde qui doit me lire lol), donc j'ai trouver l'erreur en faite j'avais declaré une variable en temps que "lgIntervenantEnCour" et dans le programme je l'avais écrit avec un "s" a la fin, bref maintenant sa marche donc tout les NumTache et NumIntervenant ont été transferé dans la table PARTICIPER, les NumTache et NumIntervenant correspondent bien mais il ne sont pas dans l'ordre du tableau excel, par exemple la premiere ligne de mon tableau excel est en 4 eme position de la ligne de ma base de donnée ... donc là je comprend pas mais alors pas du tout d'ou sa vient ... :s

  9. #9
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par Anorgasmophobie
    en faite j'avais declaré une variable en temps que "lgIntervenantEnCour" et dans le programme je l'avais écrit avec un "s" a la fin
    D'où l'intérêt de mettre en début de programme.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 11
    Points
    11
    Par défaut
    Et pour mon probleme d'ordre dans la base de donnée ?

    personne ?

    J'avais penser a faire un ORDER BY sur ma requete... le truc c'est que je n'arrive pas a l'inserer cet order by dans ma requete SQL

    ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strSQL = "INSERT INTO PARTICIPER (NumEmploye, NumTache )" & _
                            " VALUES(""" & NumeroIntervenantI & """, """ & NumeroTacheI & """)"
    EDIT : j'ai peut etre trouver d'ou venait l'erreur en faite, parce que c'est bizarre dans ma base de donnée, dans ma table PARTICIPER, les NumIntervenants sont rangés dans l'ordre croissant, alors que je n'est rien spécifié, c'est vraiment bizarre ...

Discussions similaires

  1. Probleme de boucle a s arracher les cheuveux
    Par calimero642 dans le forum Langage
    Réponses: 6
    Dernier message: 16/03/2006, 14h44
  2. Probleme de boucle avec des processus sous UNIX
    Par sebastieng dans le forum POSIX
    Réponses: 6
    Dernier message: 15/10/2005, 18h57
  3. [Language]Problème de boucle
    Par marc_dd dans le forum Langage
    Réponses: 11
    Dernier message: 06/10/2005, 14h24
  4. Problem de boucle.....
    Par skad dans le forum C++
    Réponses: 6
    Dernier message: 29/09/2005, 16h28
  5. [C#] Probleme de boucle for et random
    Par Freeman166 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/01/2005, 14h34

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