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 :

Mise à jour d'une table en VBA selon importation fichier Excel [AC-2000]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut Mise à jour d'une table en VBA selon importation fichier Excel
    Bonjour à tous,

    Voila je met à jour une table Access grâce à des données contenues dans une feuille Excel.

    Voila mes tables :
    SbNeed(IdSb, IDNumber,DateSb,...)
    ML(IDml, IdSb)
    LinkMLEqb(IdML, IdEqb)
    Eqb(IDEqb,...,IdEq)
    Eq(IdEq,...)

    Lors du premier import, la table SbNeed se rempli normalement :
    1,1,2011
    2,1,2010
    ...
    Le champ IDNumber fait référence au nombre de date correspondant au IdSb, donc je suis censé avoir
    1,1
    1,2
    1,3
    etc...
    Cette table me permettrai d'avoir une liste de date correspondant à chaque IdML

    Cependant, lors de l'import d'un deuxieme fichier, je ne vois pas comment récupéré l'IdSB et lui ajouté une occurence qui serai du type :
    1,2,2010,...
    1,3,2009,...

    Voila une partie de 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
    WbName = ActiveWorkbook.Name
    'date recovery for assignation, modification or insertion SBDate
    SBModif = Mid(WbName, 5, 4)
    ...
    '--------------------------------------------------------------------------
    'If IdEq exist, then we updating the database else we insert data
    '--------------------------------------------------------------------------
        Sql = ("Select Eq.IDEQ from Eq where IDEQ ='" & safeString(IdEq) & "'")
        Set res = CurrentDb.OpenRecordset(Sql)
        'Set res = db.OpenRecordset(Sql)
            If Not res.EOF Then
    '--------------------------------------------------------------------------
    'Update of SBB date
    '--------------------------------------------------------------------------
                Sql = ("Select distinct ML.SB From ML,LinkEqBML, EqB, Eq where ML.IDML = LinkEqBML.IDML and LinkEqBML.IDEQB = EqB.IDEQ and EqB.ID =  Eq.ID and E.IDEQ = '" & safeString(IdEq) & "'")
                Set resSB = CurrentDb.OpenRecordset(Sql)
                If Not resSB.EOF Then
                    DoCmd.RunSQL "Insert into SBNEED values (" & IdSB & ",'+ 1','" & SBModif & "','" & DateSB & "', '" & ExSB & "')"
                End If
    '--------------------------------------------------------------------------
    'End of updating
    '--------------------------------------------------------------------------
            Else
    ...
    Je pense que ce n'est pas très clair donc n'hésiter pas à poser des questions.

    Merci
    Qui ne tente rien, ne tente rien !

  2. #2
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    Y aurait-il pas déjà une erreur de frappe dans ton code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                Set resSB = CurrentDb.OpenRecordset(Sql)
                If Not resSBB.EOF Then
    En vert mettre resSB plutôt non ?

    Ensuite pour ton problème, je ne vois pas trop effectivement ce que tu veux dire lol.
    Tu voudrais en fait pouvoir lire ton IdSb en fonction de ta feuille excel? (Dlookup?)
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    Oui désolé pour l'erreur de frappe.

    Bin en fait le VBA lis une ligne du fichier Excel.
    Si un IdEq existe déja, cela signifie qu'il existe un idSb pour l'équipement.

    Je voudrais récupéré cet IdSb, le stocker dans une variable, puis l'inserer dans ma table.
    Qui ne tente rien, ne tente rien !

  4. #4
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Ok, je pense que j'utiliserais Dlookup associé à Isnull :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNull(DLookup("[Nomdechamps]", "Nomdetable", " [Nomchamps] = '" & Variable & "'")) Then
    Donc l'utilisation est simple, si ton nomdechamps n'existe pas dans ta table (avec les conditions que tu veux) alors ...
    Sinon tu fais ...

    Ensuite pour récupérer ton IdSB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TaVariable = Dlookup("[IdSB]", "Nomtalbe", " IdEq =  untruc" )
    Donc là tu récupères l'IdSB d'une table où ta condition est que ton Ideq vaut quelque chose. Bien sur il faut une table où tu as ces informations ensemble. Et il faut que tu puisses d'abord récupérer l'IdEq, soit dans une variable(aussi avec Dlookup), soit bin manuellement...

    Voilà j'espère t'avoir un peu éclairer avec cette fonction qui est assez pratique et que c'est ce que tu recherches.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    Bon, j'ai réussi à progresser un peu :

    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
    '--------------------------------------------------------------------------
    'If IdEq exist, then we updating the database else we insert data
    '--------------------------------------------------------------------------
        Sql = ("Select Eq.ID from Eq where ID ='" & safeString(IdEq) & "'")
        Set res = CurrentDb.OpenRecordset(Sql)
        'Set res = db.OpenRecordset(Sql)
            If Not res.EOF Then
    '--------------------------------------------------------------------------
    'Update of SBB date
    '--------------------------------------------------------------------------
                 Sql = ("Select distinct ML.SB From ML,LinkEqBML, EqB, Eq where ML.IDML = LinkEqBML.IDML and LinkEqBML.IDEQB = EqB.IDEQ and EqB.ID =  Eq.ID and E.IDEQ = '" & safeString(IdEq) & "'")
     
                    'FSet resSBB = CurrentDb.OpenRecordset(Sql)
                If Not resSBB.EOF Then
                    'Find the IdSB
                    SBID = ("Select SBNeed.IDSB from SBNeed, ML,LinkEqBML, EqB, Eq where SBNEED.IDSB = ML.SB and ML.IDML = LinkEqBML.IDML and LinkEqBML.IDEQB = EqB.IDEQB and EqB.IDEQ =  Eq.IDEQ and Eq.ID = '" & safeString(IdEq) & "'")
                    Set resSB = CurrentDb.OpenRecordset(SBID)
                    IdSBB = resSBB.Fields("IdSB").Value
     
                    'Find Idnum
                    NumSbDate = ("Select Count(IDSB) From SBNEED where IdSB = '" & IdSB & "'")
                    Set resNumSbDate = CurrentDb.OpenRecordset(NumSbbDate)
                    Idnum = resNumSbDate.Fields("IDSB").Value
                    'Insertion
                    DoCmd.RunSQL "Insert into SBBHistory values (" & IdSB & "," & Idnum & ",'" & SBModif & "','" & DateSB & "', '" & ExSB & "')"
                End If
    '--------------------------------------------------------------------------
    'End of updating
    '--------------------------------------------------------------------------
            Else
    J'arrive à récupérer mon IDSB.
    Maintenant, j'ai un message d'erreur suite à la requete Count, sur la ligne 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NumSbDate = ("Select Count(IDSB) From SBNEED where IdSB = '" & IdSB & "'")
                    Set resNumSbDate = CurrentDb.OpenRecordset(NumSbbDate)
                    Idnum = resNumSbDate.Fields("IDSB").Value
    Erreur 3464
    Type de données imcompatible dans l'expression du critére.

    La valeur de resNumSbDate est Null, je ne vois pas comment l'eviter ou faire un test avant pour lui assigner une autre valeur


    EDIT : Je viens de lire ce que tu as mis sur DLookUp, et je vois que ca correspond à ce que je veux faire plus loin dans mon code
    Qui ne tente rien, ne tente rien !

  6. #6
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bin justement peut être avec un If Isnull(Dlookup(...)), c'est un test pour vérifier si la valeur de ton champs est null.
    S'il est null alors soit tu lui donnes une valeurs et tu fais tes manip, soit tu le laisses tomber et tu passes au suivant.
    Ensuite dans le else tu mets ce que tu dois faire s'il n'est pas null.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    Je n'arrive pas à faire fonctionner ma requete.

    J'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NumSbDate = ("Select Count(IDSB)   From SBNeed where IdSB = '" & IdSB & "'")
                    If (DLookup("Count(IDSB)", "SBNeed", "Count(IDSB)=0")) Is Null Then
                        Idnum = 0
                    Else
                        Set resNumSbDate = CurrentDb.OpenRecordset(NumSbDate)
                    End If
    J'ai tenté cela mais je ne peux pas avoir de Count dans le Where donc j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NumSbDate = ("Select Count(IDSB)as Coco  From SBNeed where IdSB = '" & IdSB & "'")
                    If (DLookup("Count(IDSB)", "SBNeed", "Coco = 0")) Is Null Then
                        Idnum = 0
                    Else
                        Set resNumSbDate = CurrentDb.OpenRecordset(NumSbDate)
                    End If
    Et la j'ai une erreur :
    Erreur 2471
    L'objet ne contient pas d'objet d'automatisation 'Coco"
    Qui ne tente rien, ne tente rien !

  8. #8
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Je voyais ça plus comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Isnull(Dlookup(("Count(IDSB)", "SBNeed", " [IDSB] =  '" & IdSB & "'")) then
    Idnum = 0
    Else 
    NumSbDate = ("Select Count(IDSB)   From SBNeed where IdSB = '" & IdSB & "'")
    Set resNumSbDate = CurrentDb.OpenRecordset(NumSbDate)
    End If
    Et mm ton Count ne sert à plus rien avec la fonction Dlookup.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    J'ai une erreur sur la premiere requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (DLookup("Count(IDSB)", "SBNeed", "(IDSB) = '" & IdSB & "' ")) Is Null Then
    Type de données imcompatible

    J'ai enlevé les simples côte pour la variable IdSb comme c'est un int
    et maintenant j'ai l'erreur :

    Objet requis, toujours sur la même ligne
    Qui ne tente rien, ne tente rien !

  10. #10
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Alors, pourquoi ne laisse tu pas le Isnull en fonction?
    Ensuite ta variable IdSB doit exister, cad qu'elle ne doit jamais être null qd tu la sélectionnes dans tes fichiers excel. Ensuite regarde si tu l'as bien écrite de la mm manière (je vois que tu as mis IdSBB pour le nom de ta variable, change l'un des 2, soit le nom de ta variable qd tu la définies, soit dans le dlookup tu rajoutes un B).

    Une dernière chose, le count te servait à compter le nombre d'IdSB dans ta base, dans le dlookup, il ne sert à rien, met plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (DLookup("[IDSB]", "SBNeed", "(IDSB) = '" & IdSB & "' ")) Is Null Then
    Comme ça il te retournera vraiment null s'il n'est pas dans ta base.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  11. #11
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    Oui tu as raison ça fonctionne maitenant.

    Merci beaucoup pour le temps que tu m'as consacré !

    Bonne journée
    Qui ne tente rien, ne tente rien !

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

Discussions similaires

  1. [AC-2007] Mise à jour d'une table via VBA
    Par Korleone dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/03/2014, 10h39
  2. Mise à jour d'une table selon les différences
    Par Kurt92 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/01/2013, 16h17
  3. Mise à jour d'une table à partir d'un formulaire en VBA
    Par jloois dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/04/2008, 14h20
  4. Réponses: 7
    Dernier message: 13/08/2007, 13h15
  5. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46

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