Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

ADODB encore une fois... SVP

  • Initiateur de la discussion Initiateur de la discussion nak
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

nak

XLDnaute Occasionnel
Bonjour à tous,

Décidément je n'arrive pas à utiliser la fonction ADO. 🙁

J'ai un premier fichier dans lequel je réalise mes enregistrements. Pour l'exemple j'ai utilisé les infos d'un participant quelconque. Je rempli ma ligne 6 de mon fichier un.xls, je clique sur le bouton, cela envoi les informations dans mon fichier base.xls.
Pour chaque numéro de participant je veux enregistrer à la suite.
Par contre si un numéro de participant est déjà existant j'aimerais que la ligne dans le fichier base.xls soit mise à jour.

Pouvez vous m'aider SVP car je n'arrive à rien...

Merci par avance.

A+
 

Pièces jointes

Re : ADODB encore une fois... SVP

Bonsoir Nak,

Voici le code qui te permettra de faire ce que tu souhaites
VB:
Private Sub CommandButton1_Click()
    Dim Cn As ADODB.Connection
    Dim Cd As ADODB.Command
    Dim Rst As ADODB.Recordset
    Dim Fichier As String
    Dim VSearch As String
    Dim FlgFind As Boolean
    
    Fichier = ThisWorkbook.Path & "\base.xls"
        
    Set Cn = New ADODB.Connection
    Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Fichier & ";" & _
        "Extended Properties=""Excel 8.0;HDR=No;"";"
    
    Set Cd = New ADODB.Command
    Cd.ActiveConnection = Cn
    ' Ouvrir 100 lignes d'enegistrement
    Cd.CommandText = "SELECT * FROM [Feuil1$A1:F100]"
    Set Rst = New ADODB.Recordset
    Rst.Open Cd, , adOpenKeyset, adLockOptimistic
    ' Se positionner sur le premier enregistrement
    Rst.MoveFirst
    ' Valeur à chercher, Flag de recherche
    VSearch = Range("A6"): FlgFind = False
    ' Effectuer une boucle pour trouver l'enregistrement correspondant
    Do While Not Rst.EOF
      ' Si la valeur du champ 1 est égal à la valeur cherchée
      If Rst(0).Value = VSearch Or Rst(0).Value = "" Then
        ' Met le flag de recherche à VRAI
        FlgFind = True
        ' Sort de la boucle
        Exit Do
      End If
      Rst.MoveNext
    Loop
    ' Si le flag de recherche est faux : aucun enregistrement trouvé
    ' On en créé un nouveau
    If FlgFind = False Then Rst.AddNew
    ' On rempli la ligne d'enregistrement avec les valeurs
    Rst(0).Value = Range("A6")
    Rst(1).Value = Range("B6")
    Rst(2).Value = Range("C6")
    Rst(3).Value = Range("D6")
    Rst(4).Value = Range("E6")
    Rst(5).Value = Range("F6")
    Rst.Update
    
    Cn.Close
    Set Cn = Nothing
    Set Cd = Nothing
    Set Rst = Nothing
End Sub

A+
 
Re : ADODB encore une fois... SVP

Bonjour à tous,

Bruno, juste une chtite question: pourquoi ne pas rechercher directement un enregistrement existant plutôt que de parcourir le résultat de la requête, en utilisant une clause WHERE dans la requête par ex ?
 
Re : ADODB encore une fois... SVP

Bonjour,

J'ai une petite question qui me trottine dans la tête. Avec les lignes suivantes je me contente de transférer six cellules. Si j'augmente significativement leurs nombres ma forme va devenir très longue.
Est-ce possible de transférer la ligne entière ou peux être plus simple les cellules A6:BZ6 ?

Merci

Rst(0).Value = Range("A6")
Rst(1).Value = Range("B6")
Rst(2).Value = Range("C6")
Rst(3).Value = Range("D6")
Rst(4).Value = Range("E6")
Rst(5).Value = Range("F6")
 
Re : ADODB encore une fois... SVP

Salut Jam
Bonjour à tous,
Bruno, juste une chtite question: pourquoi ne pas rechercher directement un enregistrement existant plutôt que de parcourir le résultat de la requête, en utilisant une clause WHERE dans la requête par ex ?

En ADODB si tu as la soluce, je suis preneur 😉

A+
 
Re : ADODB encore une fois... SVP

Salut nak,


Jam à raison au sujet du parcour des enregistrements, mieux vaut utiliser un 'Find'
VB:
Private Sub CommandButton1_Click()
  Dim Cn As ADODB.Connection
  Dim Cd As ADODB.Command
  Dim Rst As ADODB.Recordset
  Dim Fichier As String
  Dim VSearch As String, I As Integer
  ' Chemin d'accès de la base
  Fichier = ThisWorkbook.Path & "\base.xls"
  ' Créer la connexion
  Set Cn = New ADODB.Connection
  Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & Fichier & ";" & _
          "Extended Properties=""Excel 8.0;HDR=No;"";"
  Set Cd = New ADODB.Command
  Cd.ActiveConnection = Cn
  ' Ouvrir 1000 lignes d'enegistrement
  Cd.CommandText = "SELECT * FROM [Feuil1$A1:F1000]"
  Set Rst = New ADODB.Recordset
  Rst.Open Cd, , adOpenKeyset, adLockOptimistic
  ' Chercher la valeur dans la BdD
  Rst.Find "F1 = '" & Range("A6") & "'", , adSearchForward, 1
  ' Si on se retrouve à la fin des enregistrement
  ' On en créé un nouveau
  If Rst.EOF = True Then Rst.AddNew
  ' On rempli la ligne d'enregistrement avec les valeurs
  For I = 0 To 5  ' Mettre ici le nombre de champs -1
    Rst(I).Value = Cells(6, 1 + I)
  Next I
  ' Metre à jour la ligne d'enregistrement
  Rst.Update
  ' Fermer la connexion
  Cn.Close
  ' Effacer les variables objet
  Set Cn = Nothing
  Set Cd = Nothing
  Set Rst = Nothing
End Sub

A+
 
Dernière modification par un modérateur:
Re : ADODB encore une fois... SVP

Bruno,

Suis au taf et n'est pas trop le temps de regarder le code en détail. Néanmoins il est vrai que ma question n'était pas tout à fait juste. En fait il faut recherche l'enregistrement dans Base.xls via une clause WHERE. S'il existe on utilise effectue un UPDATE sinon un INSERT INTO (en SQL of course 🙂).

Dès que j'ai un peu de temps j'essaie d'écrire un bout de code.

Au fait, Nak, le code de Bruno fonctionnant très bien (et il est de plus très concis) je t'invite donc à l'utiliser. Il n'y a pas qu'une seule voie en programmation, ce qui fait d'ailleurs tout son charme !
 
Re : ADODB encore une fois... SVP

Merci pour cette nouvelle formule 😉

J'ai essayé d'ajouter deux cellules mais j'ai une erreur. J'ai bien mis à -1 pour le I et 8 en nombre de cellules. Bizarre...
J'ai encore fait une erreur ?

Merci

For I = 0 To 7 ' Mettre ici le nombre de champs -1
Rst(I).Value = Cells(8, 1 + I)
Next I
 
Re : ADODB encore une fois... SVP

Au fait, Nak, le code de Bruno fonctionnant très bien (et il est de plus très concis) je t'invite donc à l'utiliser. Il n'y a pas qu'une seule voie en programmation, ce qui fait d'ailleurs tout son charme !

Moi j'ai déjà du mal à trouver la première voie...
En tout cas merci pour tes conseils Jam. 🙂
 
Re : ADODB encore une fois... SVP

Bonsoir à tous,

Désolé de faire remonter le poste mais je n'arrive toujours pas à transférer plus de 6 colonnes... 🙁

J'ouvre de A1 à K1000, je fais un For I = 0 To 10 . Toujours l'erreur 3265...

Pouvez vous m'aider SVP ?

Merci

 
Re : ADODB encore une fois... SVP

Bonsoir Bruno,

Le pire dans l'histoire c'est que je viens de trouver le problème après plusieurs semaines. Bon j'avoue ne pas avoir pensé à ce problème tous les jours 🙂

Cela vient du fichier base, il faut obligatoirement qu'il y ait des cellules renseignées (avec légendes par ex.) sur toute la longueur de la ligne importée.

Désolé d'avoir insisté sur un problème si simple.

Merci

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
880
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…