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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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!
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
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
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!
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
'--------------------------------------------
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
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
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 :
c6caec50-12c3-4912-aafa-48fbccb5a006@googlegroups.com...
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 :
'--------------------------------------------
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.
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