Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Excel + Vba + Access

1 réponse
Avatar
Emcy
Bonjours,

j'ai créé une BDD avec Access et j'utilise Excel + Vba pour venir
lire/écrire à l'interieur.

la BDD que j'ai créée s'appele "c:\echange\bd1.mdb"
Elle est constituée d'une table qui se nomme "Essai" et de trois champs
"Reference" (clef primaire) , "Valeur","Designation" de type string

j'ai remplie ma table avec 5 lignes de 3 elements :
"Réf1" "Val1" "Dés1"
"Réf2" "Val2" "Dés2"
"Réf3" "Val3" "Dés3"
"Réf4" "Val4" "Dés4"
"Réf7" "Val5" "Dés7"

Code:
Option Explicit

Public Type TypeElementTableStr
BDD As String
Table As String
Colonne As String
Element As String
End Type

Function RechercheUnElementString(ByRef MonElementStr As
TypeElementTableStr) As Collection
'recherche un element dans la BDD et renvoie la première ligne
associée
'tous les elements de la BDD doivent être de type string

'Elements entrant :
'BDD = location de la BDD (ex : c:\toto.mdb")
'Table = nom de la table dans laquel on veut faire la recherche
'Colonne = Nom de la colonne dans laquel on veut faire la recherche
'Element = chaine de caractère à rechercher

Dim MaRequete As String

Dim MonRecordset As ADODB.Recordset
Dim MaConnexion As New ADODB.Connection

Dim i As Integer

Dim MonMessageErreur As String

MaRequete = "SELECT * FROM " & MonElementStr.Table & " WHERE " &
MonElementStr.Colonne & "='" & MonElementStr.Element & "'"

Set MonRecordset = New ADODB.Recordset
Set MaConnexion = New ADODB.Connection

On Error GoTo RechercheUnElementFin

Set RechercheUnElementString = New Collection

'Définition du pilote de connexion (fournisseur)
MaConnexion.Provider = "Microsoft.Jet.Oledb.4.0"

'Définition de la chaîne de connexion : chemin complet du .mdb
MaConnexion.ConnectionString = MonElementStr.BDD

'Ouverture de la base de données
MaConnexion.Open "Data Source=" & MonElementStr.BDD

MonRecordset.Open MaRequete, MaConnexion

If MonRecordset.EOF And MonRecordset.EOF Then
MsgBox "Element introuvable !"
Else
'affiche l'element recherché
For i = 0 To MonRecordset.Fields.Count - 1
RechercheUnElementString.Add MonRecordset(i).Value
Next i

MsgBox MonRecordset.RecordCount
End If

MonRecordset.Close
Set MonRecordset = Nothing

MaConnexion.Close
Set MaConnexion = Nothing

On Error GoTo 0

Exit Function

RechercheUnElementFin:

MonMessageErreur = "BDD : " & MonElementStr.BDD & vbCr & _
"Table : " & MonElementStr.Table & vbCr & _
"Colonne : " & MonElementStr.Colonne & vbCr & _
"Element recherché : " & MonElementStr.Element
& vbCr

MonMessageErreur = MonMessageErreur & vbCr & Err.Description

On Error GoTo 0

MsgBox MonMessageErreur

End Function

Sub main()

Dim MonElementStr As TypeElementTableStr
Dim MaCollection As New Collection
Dim MaChaine As String
Dim Element As Variant

MonElementStr.Element = "Réf2"
MonElementStr.BDD = "c:\echange\bd1.mdb"
MonElementStr.Table = "Essai"
MonElementStr.Colonne = "Reference"

Set MaCollection = RechercheUnElementString(MonElementStr)

If Not (MaCollection.Count = 0) Then
For Each Element In MaCollection
MaChaine = MaChaine & Element & vbCr
Next Element

MsgBox (MaChaine)
End If

End Sub


la fonction MonRecordset.RecordCount ne fonctionne pas correctement : j'ai
comme résultat -1 : est-ce que ce bourt de code fonctionne chez vous ? de
quoi vient le probleme (tout le reste fonctionne) ?

1 réponse

Avatar
michdenis
Bonjour Emcy,

Pour pouvoir compter le nombre d'enregistrements dans un recordset, tu ne dois pas utiliser ce type de curseur "adOpenForwardOnly"
qui est le curseur par détaut lorsque tu ne le spécifie pas dans ta ligne de commande. Il est le plus rapide... mais il est très
limité !

Modifie ta ligne de commande :
MonRecordset.Open MaRequete, MaConnexion

Pour :

MonRecordset.Open MaRequete, MaConnexion, adOpenStatic,adLockOptimistic


Un peu de lecture sur le sujet là :
http://www.vb-faq.com/Articles/Greener/reccount.asp




Salutations!


"Emcy" a écrit dans le message de news:
Bonjours,

j'ai créé une BDD avec Access et j'utilise Excel + Vba pour venir
lire/écrire à l'interieur.

la BDD que j'ai créée s'appele "c:echangebd1.mdb"
Elle est constituée d'une table qui se nomme "Essai" et de trois champs
"Reference" (clef primaire) , "Valeur","Designation" de type string

j'ai remplie ma table avec 5 lignes de 3 elements :
"Réf1" "Val1" "Dés1"
"Réf2" "Val2" "Dés2"
"Réf3" "Val3" "Dés3"
"Réf4" "Val4" "Dés4"
"Réf7" "Val5" "Dés7"

Code:
Option Explicit

Public Type TypeElementTableStr
BDD As String
Table As String
Colonne As String
Element As String
End Type

Function RechercheUnElementString(ByRef MonElementStr As
TypeElementTableStr) As Collection
'recherche un element dans la BDD et renvoie la première ligne
associée
'tous les elements de la BDD doivent être de type string

'Elements entrant :
'BDD = location de la BDD (ex : c:toto.mdb")
'Table = nom de la table dans laquel on veut faire la recherche
'Colonne = Nom de la colonne dans laquel on veut faire la recherche
'Element = chaine de caractère à rechercher

Dim MaRequete As String

Dim MonRecordset As ADODB.Recordset
Dim MaConnexion As New ADODB.Connection

Dim i As Integer

Dim MonMessageErreur As String

MaRequete = "SELECT * FROM " & MonElementStr.Table & " WHERE " &
MonElementStr.Colonne & "='" & MonElementStr.Element & "'"

Set MonRecordset = New ADODB.Recordset
Set MaConnexion = New ADODB.Connection

On Error GoTo RechercheUnElementFin

Set RechercheUnElementString = New Collection

'Définition du pilote de connexion (fournisseur)
MaConnexion.Provider = "Microsoft.Jet.Oledb.4.0"

'Définition de la chaîne de connexion : chemin complet du .mdb
MaConnexion.ConnectionString = MonElementStr.BDD

'Ouverture de la base de données
MaConnexion.Open "Data Source=" & MonElementStr.BDD

MonRecordset.Open MaRequete, MaConnexion

If MonRecordset.EOF And MonRecordset.EOF Then
MsgBox "Element introuvable !"
Else
'affiche l'element recherché
For i = 0 To MonRecordset.Fields.Count - 1
RechercheUnElementString.Add MonRecordset(i).Value
Next i

MsgBox MonRecordset.RecordCount
End If

MonRecordset.Close
Set MonRecordset = Nothing

MaConnexion.Close
Set MaConnexion = Nothing

On Error GoTo 0

Exit Function

RechercheUnElementFin:

MonMessageErreur = "BDD : " & MonElementStr.BDD & vbCr & _
"Table : " & MonElementStr.Table & vbCr & _
"Colonne : " & MonElementStr.Colonne & vbCr & _
"Element recherché : " & MonElementStr.Element
& vbCr

MonMessageErreur = MonMessageErreur & vbCr & Err.Description

On Error GoTo 0

MsgBox MonMessageErreur

End Function

Sub main()

Dim MonElementStr As TypeElementTableStr
Dim MaCollection As New Collection
Dim MaChaine As String
Dim Element As Variant

MonElementStr.Element = "Réf2"
MonElementStr.BDD = "c:echangebd1.mdb"
MonElementStr.Table = "Essai"
MonElementStr.Colonne = "Reference"

Set MaCollection = RechercheUnElementString(MonElementStr)

If Not (MaCollection.Count = 0) Then
For Each Element In MaCollection
MaChaine = MaChaine & Element & vbCr
Next Element

MsgBox (MaChaine)
End If

End Sub


la fonction MonRecordset.RecordCount ne fonctionne pas correctement : j'ai
comme résultat -1 : est-ce que ce bourt de code fonctionne chez vous ? de
quoi vient le probleme (tout le reste fonctionne) ?