Signaler

Ajout données dans classeur fermé [Résolu]

Posez votre question julia Namor 341Messages postés jeudi 27 mars 2014Date d'inscription 5 septembre 2017 Dernière intervention - Dernière réponse le 26 avril 2017 à 09:12 par michel_m
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


Utile
+0
plus moins
Bonjour,

Regardes ici :
http://silkyroad.developpez.com/VBA/ClasseursFermes/
Donnez votre avis
Utile
+0
plus moins
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!

michel_m 14858Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 21 septembre 2017 Dernière intervention - 24 avril 2017 à 14:02
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
Répondre
Donnez votre avis
Utile
+0
plus moins
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
f894009 12134Messages postés dimanche 25 novembre 2007Date d'inscription 22 septembre 2017 Dernière intervention - 26 avril 2017 à 09:07
Bonjour,

Remplacez source par cnn (votre connection au debut de votre code)
Répondre
Donnez votre avis
Utile
+0
plus moins
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/bug-memory-leak-occurs-when-you-query-an-open-excel-worksheet-by-using-activex-data-objects-ado



Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !