Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2011, 09h06   #1
Membre habitué
 
Homme Mathieu R
Etudiant MIAGe
Inscription : février 2010
Messages : 145
Détails du profil
Informations personnelles :
Nom : Homme Mathieu R
Âge : 22
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant MIAGe
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2010
Messages : 145
Points : 141
Points : 141
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 :
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
Tydher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 09h18   #2
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bonjour,

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

Code :
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 09h21   #3
Membre habitué
 
Homme Mathieu R
Etudiant MIAGe
Inscription : février 2010
Messages : 145
Détails du profil
Informations personnelles :
Nom : Homme Mathieu R
Âge : 22
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant MIAGe
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2010
Messages : 145
Points : 141
Points : 141
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.
Tydher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 09h47   #4
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Ok, je pense que j'utiliserais Dlookup associé à Isnull :

Code :
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 :
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 09h52   #5
Membre habitué
 
Homme Mathieu R
Etudiant MIAGe
Inscription : février 2010
Messages : 145
Détails du profil
Informations personnelles :
Nom : Homme Mathieu R
Âge : 22
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant MIAGe
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2010
Messages : 145
Points : 141
Points : 141
Bon, j'ai réussi à progresser un peu :

Code :
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 :
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
Tydher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 09h59   #6
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 10h13   #7
Membre habitué
 
Homme Mathieu R
Etudiant MIAGe
Inscription : février 2010
Messages : 145
Détails du profil
Informations personnelles :
Nom : Homme Mathieu R
Âge : 22
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant MIAGe
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2010
Messages : 145
Points : 141
Points : 141
Je n'arrive pas à faire fonctionner ma requete.

J'ai :
Code :
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 :
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"
Tydher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 10h21   #8
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Je voyais ça plus comme ça :

Code :
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 10h29   #9
Membre habitué
 
Homme Mathieu R
Etudiant MIAGe
Inscription : février 2010
Messages : 145
Détails du profil
Informations personnelles :
Nom : Homme Mathieu R
Âge : 22
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant MIAGe
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2010
Messages : 145
Points : 141
Points : 141
J'ai une erreur sur la premiere requete

Code :
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
Tydher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 10h55   #10
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 :
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 11h18   #11
Membre habitué
 
Homme Mathieu R
Etudiant MIAGe
Inscription : février 2010
Messages : 145
Détails du profil
Informations personnelles :
Nom : Homme Mathieu R
Âge : 22
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant MIAGe
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2010
Messages : 145
Points : 141
Points : 141
Oui tu as raison ça fonctionne maitenant.

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

Bonne journée
Tydher est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h24.


 
 
 
 
Partenaires

Hébergement Web