Ajout données dans classeur fermé

Résolu
julia Namor Messages postés 532 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis dans une impasse ABSOLUE depuis des heures .
Je voudrais ajouter les données de la plage
Sheets("fact").Range ("$C$10:$G$28")
du classeur d'origine
AdoOrigine
vers la cellule
Sheets("bilan").Range ("E10")
du classeur de destination
"Adodestination"
.Sans ouvrir le classeur de destination:
La connection entre les classeurs se fait bien mais je bloque à l'écriture de la procédure

Sub ajout()
' cocher Microsoft Activex Data Object 2.8
ChDir ActiveWorkbook.Path
#If VBA7 And Win64 Then
Set cnn = CreateObject("Adodb.Connection")
cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & _
ThisWorkbook.Path & "\ADODestination.XLS;" & _
"Extended Properties=""Excel 12.0;HDR=Yes"""

#Else
Set cnn = CreateObject("Adodb.Connection")
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
ThisWorkbook.Path & "\ADODestination.XLS;" & _
"Extended Properties=""Excel 8.0;HDR=Yes"""
#End If

'''''''''''''''''''''''''''''''''''''''''''''LA procedure de copie''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Sheets("bilan").Range ("E10").value=Sheets("fact").Range ("$C$10:$G$28").value

''''''''''''''''''''''''
end sub



MERCI de votre aide

4 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    Pour faire ce que tu désires, il faut que le classeur cible soit une liste de données et on utilise la fonction "Insert" du langage SQL dans une requete ("ADODB.recordset")

    ci joint un vieil exemple (xl2000) de facture sur 1 ligne :il faudra donc faire une boucle puisqu' il y a plusieurs lignes à copier dans "archives.xls"

    https://mon-partage.fr/f/EMyh9xxS/

    extraire le zip et non l'ouvrir

    Bon courage!

    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      RE

      tu peux aussi travailler cellule par cellule sans ent^te- nom de champ

      Dim source As ADODB.Connection
      Dim externe As ADODB.Recordset
      Dim fichier As String, onglet As String, nom_plage As String, texte_SQL As String

      'code une fois connecté

      ' affecte la valeur à écrire dans fermé.xls dans cellule B2
      onglet = "ecrire"
      nom_plage = "B2:B2"
      ' requete SQL de la cellule de destination; "nom_plage" est une "vraie-fausse base _
      de données": une étiquette,une ligne
      texte_SQL = "SELECT * FROM [" & onglet & "$" & nom_plage & "]"
      Set externe = New Recordset
      externe.Open texte_SQL, source, adOpenKeyset, adLockOptimistic
      'externe.MoveFirst
      externe(0).Value = Range("G2").Value
      externe.Update

      externe.Close
      source.Close
      Set externe = Nothing
      Set source = Nothing
      0
  2. julia Namor Messages postés 532 Statut Membre 33
     
    Bonjour
    Merci de votre aide

    J'obtiens l'erreur " impossible d'utiliser cette connexion pour effectuer cette operation , elles esr peut etre fermée ou non valide dans ce contexte"
    erreur sur la ligne
    externe.Open texte_SQL, source, adOpenKeyset, adLockOptimistic


    le code :

    Dim source As ADODB.Connection
    Dim externe As ADODB.Recordset
    Dim fichier As String, onglet As String, nom_plage As String, texte_SQL As String

    #If VBA7 And Win64 Then
    Set cnn = CreateObject("Adodb.Connection")
    cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & _
    ThisWorkbook.Path & "\ADODestination.XLS;" & _
    "Extended Properties=""Excel 12.0;HDR=Yes"""

    #Else
    Set cnn = CreateObject("Adodb.Connection")
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
    ThisWorkbook.Path & "\ADODestination.XLS;" & _
    "Extended Properties=""Excel 8.0;HDR=Yes"""
    #End If
    'code une fois connecté

    ' affecte la valeur à écrire dans fermé.xls dans cellule B2
    onglet = "ecrire"
    nom_plage = "B2:B2"
    ' requete SQL de la cellule de destination; "nom_plage" est une "vraie-fausse base _
    de données": une étiquette,une ligne
    texte_SQL = "SELECT * FROM [" & onglet & "$" & nom_plage & "]"
    Set externe = New Recordset
    externe.Open texte_SQL, source, adOpenKeyset, adLockOptimistic

    'externe.MoveFirst
    externe(0).Value = Range("G2").Value
    externe.Update

    externe.Close
    source.Close
    Set externe = Nothing
    Set source = Nothing


    Cordialement
    0
    1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Bonjour,

      Remplacez source par cnn (votre connection au debut de votre code)
      0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    1/ dans ton code, tu as baptisé la connexion Cnn, dans le mien elle est baptisée "source"

    2: enlève l'apostrophe devant 'externe.movefirst --->externe.movefirst

    3/ dans la connexion HDR=No"""

    j'avais oublié:
    si tu transfère des nombres il sont restitués en texte;
    Tu transfère 72 cellules mais ADODB n'aime pas du tout effectuer un certain (?) nombre de requetes;
    si ca plante, il faudrait alors quitter le classeur et tenter de relancer la connexion en notant le nombre de fois où ca a marché ---> usine à gaz et prise de t^te probables

    bon courage car le maniement d'adodb n'est pas toujours évident

    edit: dans le lien cité par notre ami Patrice, la cas que je cite est traité ici
    https://support.microsoft.com/en-us/help/319998/

     Michel
    0