RécupérationEnregistrement de données via ADO

6 réponses
Avatar
Apitos
Bonjour =C3=A0 tous,

J'aimerais r=C3=A9cup=C3=A9r=C3=A9 des donn=C3=A9es dans un Userform depuis=
un classeur ferm=C3=A9 Q2.xlsx ensuite faire une mise =C3=A0 jour pour ces=
m=C3=AAmes donn=C3=A9es.

J'ai utilis=C3=A9 les objets ADODB pour le faire, mais voila j'ai une erreu=
r quant =C3=A0 la mise =C3=A0 jour dans le classeur ferm=C3=A9.

http://www.cjoint.com/c/FLFspVEKGjH
http://www.cjoint.com/c/FLFsq7q6NEH

Merci d'avance.

6 réponses

Avatar
News.aioe.org
Bonjour,
Voici un fichier zip contenant 2 fichiers démontrant comment faire
l'entretien d'une petite base de données d'un classeur fermé à partir
d'un autre classeur.
Ceci date de l'en 2003. Il doit y avoir moyen de faire mieux aujourd'hui!
;-))
Sous Excel 2007 et plus récent, on doit modifier la ligne de code pour
établir la connexion : je fais référence à ce type de truc :
'Chaine de connexion
StConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
'Yes -> en-tête de colonne
'NO -> sans en-tête de colonne
http://www.cjoint.com/c/GAboSvVvDTi
Remarque, les plages nommées dans le fichier de la base de données.
Excel n'est pas une base de données (Access). Les noms des plages
de cellules doivent vraiment représenter la plage de données.
Si tu as des lignes qui avaient des données et que tu as effacées
manuellement, tu vas avoir des problèmes. SUPPRIME toutes les lignes
après la dernière entrée de ta plage de données.
Pour ce qui est du reste... tu vas devoir te débrouiller avec cela!
MichD
Avatar
Apitos
Bonjour MichD,
J'ai apporté quelque modification sur mon fichier selon ton exemple, m ais en voulant mettre à jour un enregistrement l'erreur suivante est a ffichée :
BOF ou EOF est égal à true ou l'enregistrement actuel a ét é supprimé
sur la ligne :
'-------
Rs(0).Value = Me.CmbNum
'-------
J'ai testé et j'ai trouvé que EOF est à vrai pourtant Rs.rec ordset.count m’indique bien qu'il y'a un enregistrement trouvé !?
http://www.cjoint.com/c/GAbvlM6hBbU
Avatar
News.aioe.org
A ) Indique-moi avec précision dans quelle procédure du formulaire se
retrouve cette ligne de code.
Ce qui suit n'est pas une ligne de code du classeur soumis.
'-------
Rs(0).Value = Me.CmbNum
'-------
B ) Est-ce que le recordset "RS" contient des enregistrements ?
Pour tester : Msgbox RS.RecordCount
Avant de lancer la mise à jour sur un ou des enregistrements, teste si
le recordset est plus grand que 1
if Rs.Recordcount >0 then
Rs(0).Value = Me.CmbNum
..../...
End if
Si le recordset est vide, ta requête n’est probablement pas bonne si tu
es sûr qu'un tel enregistrement est existe.
C ) Le fichier se veut un exemple sur ce qu'il est possible de faire avec
ADO et que j'ai déjà soumis ici il y a très longtemps en réponse à une
question sur ce forum. Je ne l'ai jamais testé à fond! Excel n'est pas une
application "base de données", ce que tu cherches à faire est réalisable,
mais pas toujours évident!
MichD
Avatar
Apitos
Bonjour Michd,
A ) Indique-moi avec précision dans quelle procédure du formula ire se
retrouve cette ligne de code.

J'ai refais les tests sur une autre machine et le meme message d'erreur est affiché pendant l'execution de cette ligne :
'---------
Me.TextBox2.Value = Rs(1).Value '.Fields(1)
'---------
dans la procedure suivante :
'--------------------------------------------
Private Sub CmbNum_Change()
Dim strSQL As String
' strSQL = "SELECT * FROM [" & NomFeuille & "$] WHERE F1='" & Me.Cmb Num & "'"
If Rs.RecordCount > 0 Then
Me.TextBox2.Value = Rs(1).Value '.Fields(1)
Me.TextBox3.Value = Rs.Fields(2)
Me.TextBox4.Value = Rs.Fields(3)
Me.TextBox5.Value = Rs.Fields(4)
Else
MsgBox "Pas d'enregistrments.", vbCritical + vbOKOnly
Exit Sub
End If
Me.CmdExporter.Enabled = True
End Sub
'---------------------------
B ) Est-ce que le recordset "RS" contient des enregistrements ?
Pour tester : Msgbox RS.RecordCount

Il contient un seul enregistrement
Avant de lancer la mise à jour sur un ou des enregistrements, teste si
le recordset est plus grand que 1

Le classeur fermé sur lequel je fais les tests contient une seule lign e de données.
http://www.cjoint.com/c/GAcoTmUvWVB
Avatar
News.aioe.org
Dans l'événement "Intialize" du formulaire :
Attention, quand tu te déplaces LE POINTEUR DU RECORDSET dans les
enregistrements du recordset par ceci :
Do While Not Rs.EOF
CmbNum.AddItem Rs.Fields(0)
Rs.MoveNext
Loop
Le pointeur du recordset se situe à EOF, soit à la toute fin du recordset
où il n'y a plus d'enregistrement pour être plus clair...
Comme tu utilises la même variable RS (pour ton recorset) pour tout le
formulaire,
la ligne de code avec lequel tu éprouves un problème, elle ne peut pas
trouver la
valeur que tu lui demandes, car le pointeur se retrouve à EOF suite à la
boucle de
la procédure "Initialize", d'où le message d'erreur.
Il s'agit simplement d'ajouter la ligne de code ".MoveFirst" pour ramener le
pointeur
du recordset au premier enregistrement, et cela devrait fonctionner.
'----------------------------------------------------
If Rs.RecordCount > 0 Then
Rs.MoveFirst ' AJOUTÉ
Me.TextBox2.Value = CStr(Rs(1).Value) '.Fields(1)
Me.TextBox3.Value = Rs(2).Value 'Fields(2)
Me.TextBox4.Value = Rs.Fields(3)
Me.TextBox5.Value = Rs.Fields(4)
Else
MsgBox "Pas d'enregistrments.", vbCritical + vbOKOnly
Exit Sub
End If
Me.CmdExporter.Enabled = True
'----------------------------------------------------
MichD
"Apitos" a écrit dans le message de groupe de discussion :
Bonjour Michd,
A ) Indique-moi avec précision dans quelle procédure du formulaire se
retrouve cette ligne de code.

J'ai refais les tests sur une autre machine et le meme message d'erreur est
affiché pendant l'execution de cette ligne :
'---------
Me.TextBox2.Value = Rs(1).Value '.Fields(1)
'---------
dans la procedure suivante :
'--------------------------------------------
Private Sub CmbNum_Change()
Dim strSQL As String
' strSQL = "SELECT * FROM [" & NomFeuille & "$] WHERE F1='" & Me.CmbNum &
"'"
If Rs.RecordCount > 0 Then
Me.TextBox2.Value = Rs(1).Value '.Fields(1)
Me.TextBox3.Value = Rs.Fields(2)
Me.TextBox4.Value = Rs.Fields(3)
Me.TextBox5.Value = Rs.Fields(4)
Else
MsgBox "Pas d'enregistrments.", vbCritical + vbOKOnly
Exit Sub
End If
Me.CmdExporter.Enabled = True
End Sub
'---------------------------
B ) Est-ce que le recordset "RS" contient des enregistrements ?
Pour tester : Msgbox RS.RecordCount

Il contient un seul enregistrement
Avant de lancer la mise à jour sur un ou des enregistrements, teste
si
le recordset est plus grand que 1

Le classeur fermé sur lequel je fais les tests contient une seule ligne de
données.
http://www.cjoint.com/c/GAcoTmUvWVB
Avatar
Apitos
Bonjour MichD,
Merci.
Je vais testé cette astuce.