IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Excel VBA : Manipuler les données des bases Access depuis Excel
Un tutoriel de Laurent Ott

Le , par laurent_ott

34PARTAGES

7  1 
Bonjour.

J'ai le plaisir de vous présenter ce tutoriel :

Manipuler les données Access depuis Excel

Dans cet article vous allez apprendre à manipuler avec le VBA Excel les données des bases Access avec la technologie ADODB. Des exemples vous permettront de comprendre le fonctionnement de cette technologie ainsi que les fonctions présentées, qui couvrent une large gamme de besoins

Vous pouvez apporter vos avis dans cette discussion.

Bonne lecture.
Vous avez lu gratuitement 56 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de vba_lieb
Membre à l'essai https://www.developpez.com
Le 04/03/2025 à 14:22
Bonjour,

Tout d'abord un grand merci pour ce tuto !!!! Une aide bien précieuse pour moi qui n'est pas un novice, mais non plus un expert de VBA.

Je souhaite faire une vérification dans un champ si une référence existe :
Dans le champ OF, j'ai 400 lignes avec des références uniques.

J'ai placé dans Option Explicit :
Code : Sélectionner tout
1
2
Public OF_NUMBER As Long
Public ID_USI60 As Long

Puis

Code : Sélectionner tout
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
Sub VERIF_OF_USI60()

'On réinitialise Result_Enr_Info
Result_Enr_Info = 0

' Ouvre une connexion:
If ADO.Cnn_Initialise(Cnn1, "I:\070_IND\03_Fabrication\09_Muret\500 - ARCHIVES\BDD_LIEBHERR1_V1.5.accdb") = True Then


    ' Initialisation du traitement ADO avec transaction:
        ADO.Cnn_Debut AvecTransaction


    If Not ADO.Enr_Info(Cnn1, "REF_USI60_V1", "OF='" & NumOF & "'", valeur, "ID") = 0 Then
        ID_USI60 = ADO.Enr_Info(Cnn1, "REF_USI60_V1", "OF='" & NumOF & "'", valeur, "ID")
    Else
    MsgBox "Aucune donnée trouvée."
    End If



'J'AI TESTE AUSSI CECI...    
    'ID_USI60 = ADO.Enr_Info(Cnn1, "REF_USI60_V1", "OF='" & NumOF & "'", valeur, "ID")
    'If ID_USI60 = 0 Then
        'MsgBox "La valeur du champ est : " & ID_USI60
        'MsgBox ("Dans Verif_USI60, la valeur de ID_USI60 :  " & ID_USI60)
    'Else
    '   MsgBox "Aucune donnée trouvée."
    '    MsgBox ("Dans Verif_USI60, la valeur de ID_USI60 :  " & ID_USI60)
    'End If


'On ferme la transaction
'ADO.Cnn_Fin SansMessage
ADO.Cnn_Fin AvecMessage

End If

End Sub

Malgré des test dans tous les sens... J'ai toujours cette erreur si, et uniquement si, l'OF n'existe pas dans mon champ OF :


En fait, je n'arrive pas à trouver une solution pour que Enr_Info, si il ne trouve pas de valeur, cela ne déclenche pas d'erreur.

Sinon crée une requete sous ACCESS, puis en VBA y faire appel pour voir si l'OF existe et si oui je récupére son ID.... Mais là aussi, ça dépasse mes compétences...

Merci à tous pour vos retours.
1  0 
Avatar de Qwazerty
Expert éminent https://www.developpez.com
Le 04/03/2025 à 21:41
Salut

Vu qu'il ne s'agit que de lire le contenu de la table, il serait peut-être plus judicieux d'utiliser PowerQuery.
Il y a un connecteur pour les bases access (Menu "Données", "Obtenir des données", "A partir d'une base de données", "A partir d'une base de données Microsoft Access".
Je n'ai pas utilisé ce connecteur mais j'imagine que comme les autres, tu vas ensuite être invité à choisir la table où se trouve les données, puis il faudra travailler ton jeu de donnée pour ne garder que ce qui t'intéresse.

Une fois les données filtrées, ça va te créer un tableau sur une feuille du classeur. Tu pourras en VBA rafraichir cette table (un coup d'enregistreur pour avoir le code de base), puis récupérer le contenu du tableau pour alimenter ta logique.

++
Qwaz
1  0 
Avatar de Philippe Tulliez
Rédacteur https://www.developpez.com
Le 04/03/2025 à 22:22
Bonjour Quaz,
Je n'ai pas utilisé ce connecteur mais j'imagine que comme les autres, tu vas ensuite être invité à choisir la table où se trouve les données, puis il faudra travailler ton jeu de donnée pour ne garder que ce qui t'intéresse.
Non seulement avec Power Query tu peux connecter une table mais également une requête. C'est tellement plus simple que de passer par du VBA
1  0 
Avatar de vba_lieb
Membre à l'essai https://www.developpez.com
Le 05/03/2025 à 8:22
Merci Qwazerty et Philippe,

Arff, j'ai enfin trouvé...

Je lui dis de chercher dans mon champ NUMBER_OF alors que le champ s'appelle OF_NUMBER...

Merci pour vos messages
1  0 
Avatar de Philippe Tulliez
Rédacteur https://www.developpez.com
Le 05/03/2025 à 10:01
Bonjour,
Par contre connais pas Power Query....
En fait j'ai réellement besoin d'utiliser VBA car j'ai associé à Excel des boutons pour l'exécution de script afin d'automatiser de nombreuses taches dont les personnes utilisant la solution ont des difficultés avec l'informatique.
Mais j'utilise également le VBA pour juste faire un refresh (une ligne de code)

@Quaz
@Philippe T. : Je dis ça à cause de la gestion de confidentialité, tu pourras peut-être dire si ça pose problème pour ce type de source.
Pour ignorer le niveau de confidentialité par VBA ThisWorkbook.Queries.FastCombine = True. Ligne à placer avant le Refresh
1  0 
Avatar de vba_lieb
Membre à l'essai https://www.developpez.com
Le 05/03/2025 à 10:13
Bonjour,

Mince j'ai édité mon message puis je viens de voir vos réponses...

En fait j'avais fait une inversion dans le nom du champ (voir mon message que j'ai édité...)

Bon en tout cas vous tiens au courant de mes progressions. Au moins j'aurai buché le fonctionnement
1  0 
Avatar de Philippe Tulliez
Rédacteur https://www.developpez.com
Le 05/03/2025 à 10:46
Bonjour Quaz,
Ohoh, je testerais ça rapidement, si ça peut éviter une manip de paramétrage à mes utilisateurs... Encore merci
C'est effectivement efficace.
C'est grâce à J.P. (jurassic pork) que je connais cette instruction. Dans cette discussion Problème de requête sur des ordinateurs autres que celui sur lequel j'ai créé celle-ci
1  0 
Avatar de vba_lieb
Membre à l'essai https://www.developpez.com
Le 10/03/2025 à 15:15
Merci tous,

je teste et vous tiens au courant.

Par contre là aussi, j'ai une erreur si pas de data trouvée....
Je l'utilise pour regarder par rapport à un ID (le champ s'appelle ID_OF qui est la clé primaire) la foncion Enr_Info afin de voir si il y a une date écrite. Et si oui, je l'envoi dans mon TextBox de mon Userform (J'utilise les UserForm de Excel)

Si il trouve aucune date, alors malgré avoir cherché... J'ai toujours un message d'erreur à la fin.



Je suis pas novice en VBA Script, mais pas un cador aussi

Code : Sélectionner tout
1
2
3
4
5
6
'On place la date de début des opérations si existant sinon, sinon place le symble "-"
If ADO.Enr_Info(Cnn1, "TABLE_TACHES_OF", "ID=" & ID_OF, valeur, "DATE_DEBUT") = "" Then
    TextBox15 = "-"
    Else
    TextBox15 = ADO.Enr_Info(Cnn1, "TABLE_TACHES_OF", "ID=" & ID_OF, valeur, "DATE_DEBUT")
End If


Je teste dans tous les cas avec "On Error Resume Next" avant la fonction Enr_Info, puis restaurer avec "Err.Clear" et "On Error GoTo 0"

et je vous tiens tous au courant.

Pour info, j'ai trouvé mon souci sur mon précédent message... Honte à moi, je cherchais dans la table GENERAL_OF alors qu'elle s'appelle OF_GENERAL

Merci pour votre aide
1  0 
Avatar de Philippe Tulliez
Rédacteur https://www.developpez.com
Le 10/03/2025 à 16:22
Bonjour,
je teste et vous tiens au courant.
Par contre là aussi, j'ai une erreur si pas de data trouvée....
Pourquoi faire simple quand on peut faire compliqué

Avez-vous essayé la solution avec Power Query ?
Vous créez votre requête dans Access et vous connectez ensuite cette requête depuis Power Query
Cela ne vous prendra pas plus de 5 minutes pour créer cette requête et encore quelques minutes pour intégrer le code VBA pour effectuer l'actualisation de la requête
1  0 
Avatar de vba_lieb
Membre à l'essai https://www.developpez.com
Le 11/03/2025 à 9:56
Citation Envoyé par Philippe Tulliez Voir le message
Bonjour,

Pourquoi faire simple quand on peut faire compliqué

Avez-vous essayé la solution avec Power Query ?
Vous créez votre requête dans Access et vous connectez ensuite cette requête depuis Power Query
Cela ne vous prendra pas plus de 5 minutes pour créer cette requête et encore quelques minutes pour intégrer le code VBA pour effectuer l'actualisation de la requête
Bonjour,,
Bon j'ai trouvé mon erreur, ... Au lieu de ID= c'etait plutot ID_OF qui est le nom du champ correct...

Code : Sélectionner tout
If ADO.Enr_Info(Cnn1, "TABLE_TACHES_OF", "ID_OF=" & ID_OF, valeur, "DATE_DEBUT") = "" Then
Sinon, pour Power Query, je connais pas un exemple ?
1  0