[VBA]Recordset ADO VB6.3

Résolu
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012 - 30 mars 2012 à 09:27
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre 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
A voir également:

9 réponses

LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
31 mars 2012 à 00:23
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.
3
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
31 mars 2012 à 01:22
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
3
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
3 avril 2012 à 00:25
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.
3
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
30 mars 2012 à 12:10
Bonjour,
essaies ceci :
Dim value = Rst.Fields(FieldName)



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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
30 mars 2012 à 12:11
désolé !
un Dim s' est glissé dans la ligne..

value = Rst.Fields(FieldName)
[] Ce qui va sans dire. va mieux en le disant.
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
30 mars 2012 à 15:21
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
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
30 mars 2012 à 15:23
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
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
2 avril 2012 à 09:45
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
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
3 avril 2012 à 08:52
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
0
Rejoignez-nous