[VBA]Recordset ADO VB6.3 [Résolu]

Messages postés
36
Date d'inscription
mardi 21 février 2012
Dernière intervention
11 juillet 2012
- - Dernière réponse : ThomasFalguieres
Messages postés
36
Date d'inscription
mardi 21 février 2012
Dernière intervention
11 juillet 2012
- 3 avril 2012 à 08:52
Bonjour,

Je suis actuellement en stage et doit faire une application VBA sous excel 2007 communicant avec une base de donnée ACCESS.
Afin de communiquer avec la BdD j'utilise l'objet ADO et donc les recordests.

C'est à ce niveau là que j'ai un problème. En effet, une commande basique permettant d'extraire une data du recordset est la suivante:

Dim Rst As ADODB.Recordset
Set Rst = New ADODB.Recordset
...
'La fameuse opération basique
value = Rst![Objective ID]


Sachant que le champ "Objective ID" existe bien et est bien écrit.

Ce que je voudrais faire maintenant c'est pouvoir mettre entre crochets une variable et non pas directement le nom du champ. Exemple:


Dim Rst As ADODB.Recordset
Set Rst = New ADODB.Recordset
Dim FieldName as string
FieldName = "Objective ID"
...
'On remplace "Objective ID" par la variable FieldName = Objective ID
value = Rst![FieldName]


J'ai pour habitude de chercher sur les forum du site (qui est une très bonne source d'informations) mais n'ai finalement pas trouvé.

Pour information, mon recordset contient le contenu d'une feuille d'un classeur excel (considérée donc comme table) et "Objective ID" est le nom d'une colonne de la feuille donc considéré comme le nom de champ de la table.

Quelqu'un pourrait-il m'aider ?

Merci d'avance

Thomas
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
1403
Date d'inscription
mardi 1 mai 2007
Dernière intervention
7 octobre 2012
3
Merci
Bonsoir,

D' ordinaire ça fonctionne.

Essaies encore avec la position ordinale de ton champ.
(Je rappelle:position ordinale=n° colonne-1)

Dim FieldIndex As Integer
FieldIndex = 0 (si ton champ est en première colonne)

value = Rst.Fields(FieldIndex)





[] Ce qui va sans dire. va mieux en le disant.

Merci LIBRE_MAX 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de LIBRE_MAX
Messages postés
303
Date d'inscription
mercredi 12 janvier 2005
Dernière intervention
3 octobre 2013
3
Merci
Bonjour
Je n'ai pas d'exemple sous les yeux mais il me semble que la syntaxe est :
value = Rst.Fields.item(FieldName) (attention value est réservé)

bonne journée

Merci c148270 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de c148270
Messages postés
1403
Date d'inscription
mardi 1 mai 2007
Dernière intervention
7 octobre 2012
3
Merci
Bonsoir,

Penses à fermer ta connexion et à détruire les objets cnx er rst
à la fin du traitement.
rst.Close
cnx.Close

Set cnx=Nothing
Set rst=Nothing

Si rst.CursorType = adOpenKeyset, c' est donc que tu ne veux avoir qu'un aperçu, je pense.

Sinon, penses à le declarer dynamique.

Si toutefois, tu aurais résolu le problème entre temps.

...."(désolé de vous importuner une nouvelle fois ^^)."

T' en fais pas pour ça !
Si on est là, c' est parcequ' on a choisi de l' être


[] Ce qui va sans dire. va mieux en le disant.

Merci LIBRE_MAX 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de LIBRE_MAX
Messages postés
1403
Date d'inscription
mardi 1 mai 2007
Dernière intervention
7 octobre 2012
0
Merci
Bonjour,
essaies ceci :
Dim value = Rst.Fields(FieldName)



[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
Messages postés
1403
Date d'inscription
mardi 1 mai 2007
Dernière intervention
7 octobre 2012
0
Merci
désolé !
un Dim s' est glissé dans la ligne..

value = Rst.Fields(FieldName)
[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
Messages postés
36
Date d'inscription
mardi 21 février 2012
Dernière intervention
11 juillet 2012
0
Merci
Bonjour,

Désolé pour le retard.

Merci pour la réponse mais malheureusement j'ai toujours la même erreur:

Erreur d'exécution '3625':

Item not can be found in the collection corresponding to the request name or ordinal


L'instruction prend la chaîne de caractère "FieldName" telle quelle mais ne prend pas le contenu de la variable. Même si je n'ai pas trouvé la solution je persiste à croire qu'il y a une solution .

J'ai essayé de mettre la variable entre simple cote, doubles cotes (sans grand espoir) mais rien n'y fait.

Je dois avouer que je craque un peu sur ce problème :p
Commenter la réponse de ThomasFalguieres
Messages postés
36
Date d'inscription
mardi 21 février 2012
Dernière intervention
11 juillet 2012
0
Merci
Je pensais à utiliser le principe des pointeurs (bien qu'en soi une variable est un genre de pointeur) afin d'aller chercher la valeur ou le contenu pointé par la variable.
J'ai cherché mais le concept de pointeur en VB m'a l'air inexistant
Commenter la réponse de ThomasFalguieres
Messages postés
36
Date d'inscription
mardi 21 février 2012
Dernière intervention
11 juillet 2012
0
Merci
Bonjour,

Merci à vous deux pour ces informations !!

@LIBRE_MAX:
En effet l'instruction que vous m'aviez donnée fonctionne mais avec un Integer en paramètre, ce qui au final ne répondait pas exactement à ma question car je voulais arriver à réaliser une requête du genre value = Rst![FieldName] avec "value" étant le nom du champ de ma table et de type string .
Cela m'a néanmoins beaucoup aidé dans le sens où cela m'a fait comprendre comment me déplacer dans mon recordset et j'arrive maintenant à avoir les informations que je souhaite.

@LIBRE_MAX et c148270 :
Vos deux instructions fonctionnent, ont la même fonctionnalité et marchent bien

J'aurais maintenant voulu vous faire part d'un autre problème....(désolé de vous importuner une nouvelle fois ^^).

En effet je charge dans un recordset le contenu d'un tableau excel avec le code suivant:

Sub RequeteClasseurFerme_Excel()
        
    Dim Cn As ADODB.Connection
    Dim Fichier As String
    Dim NomFeuille As String, texte_SQL As String
    Dim Rst As ADODB.Recordset
    Set Rst  = New ADODB.Recordset
    Dim Rst1 As ADODB.Recordset
    Set Rst1 = New ADODB.Recordset
    Dim tableauLTR() As ltrObjectif
    
    'Définit le classeur fermé servant de base de données
    Fichier = "P:\ltrsample2.xlsx"
    'Nom de la feuille dans le classeur fermé
    NomFeuille = "Feuil1"
    
    Set Cn = New ADODB.Connection
    
    '--- Connexion ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
    '-----------------
    'On définit la requête ...
    '
    Rst.CursorType = adOpenKeyset
    Rst.CursorLocation = adUseClient
    Rst.Open "SELECT * FROM [" & NomFeuille & "$]", Cn, adOpenDynamic, adLockOptimistic


Lorsque j'exécute une première fois, tout va bien lors de la lecture mais si je fais des modifications manuelles (je vais dans le fichier excel modifier les informations à la main), lorsque je ré exécute, les modifications ne sont pas prises en compte. J'ai l'impression que mon recordset garde les informations de l'exécution précédentes.

une idée d'où cela pourrait provenir ?

Je vous remercie d'avance

Thomas
Commenter la réponse de ThomasFalguieres
Messages postés
36
Date d'inscription
mardi 21 février 2012
Dernière intervention
11 juillet 2012
0
Merci
Bonjour !!

Bon ben je tiens à vous remercier pour ces précieux conseils car du coup ça marche !! En effet j'avais oublié de détruire le recordset pensant l'avoir fait :p (En général je fais le recordset et la connexion mais la....non :p )

En tout cas merci beaucoup de votre aide précieuse !!

Thomas
Commenter la réponse de ThomasFalguieres

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.