Pour les PROS de ADO

  • Initiateur de la discussion Kevin
  • Date de début
K

Kevin

Guest
Bonjour à tous,

A l' aide de la macro suivante (trouvée dans les archives du site) j' écris dans le classeur BASE2 Feuil1 la ligne A20:X20 de la Feuil3 du classeur actif sans ouvrir BASE2.

Mais j' ai le problème suivant que je n' arrive pas à résoudre.

La ligne s' inscrit bien en Feuil1 de BASE2 mais aussi en A20:X20. Or je voudrais que cette ligne s' inscrive en A2:X2 de cette Feuil1 et que lorsque je modifie la ligne du classeur actif, cette ligne aille se placer en Feuil1 de BASE2 mais sous la précédente.

Voilà la macro coupable:


Sub EcritDatas()
Dim Fich$, cell As Range

Fich = 'S:\\TEST\\BASE2.xls'
For Each cell In ActiveWorkbook.Sheets('Feuil3').Range('A20:X20')
SetExternalDatas Fich, 'Feuil1', cell.Address(0, 0), cell.Text
Next
End Sub

Sub SetExternalDatas(DestFile As String, _
DestFeuille As String, _
DestCellAdr As String, _
DataToWrite As Variant)
Dim oConn As ADODB.Connection
Dim oCmd As ADODB.Command
Dim oRS As ADODB.Recordset
Dim RangeDest
Set oConn = New ADODB.Connection
oConn.Open 'Provider=Microsoft.Jet.OLEDB.4.0;' & _
'Data Source=' & DestFile & ';' & _
'Extended Properties=''Excel 8.0;HDR=No;'';'
Set oCmd = New ADODB.Command
oCmd.ActiveConnection = oConn

RangeDest = DestCellAdr & ':' & DestCellAdr
oCmd.CommandText = 'SELECT * from `' & DestFeuille & '$' & RangeDest & '`'

Set oRS = New ADODB.Recordset
oRS.Open oCmd, , adOpenKeyset, adLockOptimistic

oRS(0).Value = DataToWrite
oRS.Update

oConn.Close
Set oConn = Nothing
Set oCmd = Nothing
Set oRS = Nothing

End Sub

Si vous avez une idée, merci.

A plus. Kevin.
 
K

Kevin

Guest
Salut Philippe,

Merci pour ta réponse, j' avais déjà essayé mais j' ai alors un problème à ce niveau :

oRS.Open oCmd, , adOpenKeyset, adLockOptimistic

Comme je n' y connait rien moi aussi a ADO, je ne comprends pas.
Dommage car ça a terriblement efficace par rapport à ma méthode qui consiste à ouvrir la base pour y inscrire les données puis à la refermer à chaque fois en sauvegardant avant de revenir au classeur actif.

A Pus. Kevin.
 

MichelXld

XLDnaute Barbatruc
bonjour Kevin , bonjour Philippe

s'il s'agit de placer les données à la suite des lignes existantes dans le classeur fermé tu pourrais tester la procedure ci dessous


Code:
Private Sub CommandButton1_Click()
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Library
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Fichier As String, Cible As String, Feuille As String
Dim i As Integer

Fichier = 'S:\\TEST\\BASE2.xls'
Feuille = 'Feuil1$' 'attention a ne pas oublier le '$'
Set Cn = New ADODB.Connection
Cn.Open 'Provider = Microsoft.Jet.OLEDB.4.0;' & _
'data source=' & Fichier & ';' & _
'extended properties=''Excel 8.0;'''

Cible = 'SELECT * FROM [' & Feuille & '];'

Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic

With Rs
.AddNew
For i = 0 To 4 'colonnes 1 à 5 dans le classeur fermé
.Fields(i) = ActiveWorkbook.Sheets('Feuil3').Cells(20, i +1 ) 'plage A20:E20 dans la Feuil3
Next i
.Update
End With

Rs.Close
Cn.Close
End Sub


un autre exemple qui pourra t'aider

Lien supprimé



bonne soiree
MichelXld

Message édité par: MichelXld, à: 16/05/2005 19:58
 
K

Kevin

Guest
Bonsoir Michel,

Merci pour ta réponse. J' ai mis un bouton de commande sur la Feuil1 de mon classeur actif avec le code que tu as posté. Mais lorsque je clique sur celui-ci, j' ai l'erreur suivante : Impossible de trouver l' objet dans la collection correspondant au nom ou à la référence ordinale demandé.
En déboguant, j' ai la ligne suivante en jaune:

.Fields(i) = ActiveWorkbook.Sheets('Feuil3').Cells(20, i + 1) 'plage A20:E20 dans la Feuil3

Merci. A plus. Kevin
 

MichelXld

XLDnaute Barbatruc
rebonsoir Kevin

la procedure que je t'ai proposé n'est qu'un exemple theorique , et tu devras certainement l'adapter à ton projet pour que cela fonctionne

peux tu placer tes 2 classeurs zippés sur le forum pour voir plus précisément ton soucis ?

sinon à tu testé le lien que je te proposé et qui envoies aussi des infos à la suite dans un classeur fermé


bonne soiree
MichelXld
 
K

Kevin

Guest
Rebonsoir à tous,

Je joins un fichier pour essayer de mieux me faire comprendre.
Merci Michel pour le lien, mais je voudrais seulement copier une ligne d' un classeur actif dans le classeur fermé, sans utiliser d' USF.
Le but final étant de copier une ligne de 26 cellules, je ne voudrais pas me faire un USF avec 26 Textbox.

Merci. A plus Kevin. [file name=Temp.zip size=21258]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Temp.zip[/file]
 

Pièces jointes

  • Temp.zip
    45.5 KB · Affichages: 34
  • Temp.zip
    45.5 KB · Affichages: 38
  • Temp.zip
    45.5 KB · Affichages: 32
K

Kevin

Guest
Re Re,

Mille excuses et merci à Michel, son code fonctionne parfaitement. Les données s' empilent bien sur la Feuil1 du classeur fermé. Il ne me reste plus que le soucis de la position. A savoir que les données sont en ligne 20 du classeur actif, et elles se mettent en ligne 20 de la Feuil1 du classeur fermé, les autres se mettant en ligne 21 puis 22 etc...
J' aurais voulu que les données en ligne 20 du classeur actif se positionnent en ligne 2 sur la Feuil1 du classeur fermé puis les nouvelles en ligne3 puis 4 etc....

Bonsoir à tous. Kevin.
 
K

Kevin

Guest
Encore bonsoir,

Michel, je viens d' essayer ton fichier et là je n' ai qu' un mot à te dire : BRAVO. C' est exactement le but que je recherchais.

Néanmoins, il y a un truc que je ne comprends pas : si dans la classeur fermé, la dernière ligne servie est la ligne5, et si je sélectionne les lignes 2 à 5 et que je fais effacer le contenu, pourquoi une nouvelle saisie vient se mettre en ligne 6 alors que la ligne 2 est vide?

Encore merci. A plus .Kevin.
 
K

Kevin

Guest
Encore moi,

En fait au lieu de faire effacer le contenu, je fais supprimer et c' est bon.
Encore merci à Michel pour son aide précieuse et efficace. Je vais tenter d' adapter son code à mon fichier car ouvrir et fermer une base partagée en réseau, c' est vraiment lent.

J' arrête là pour ce soir mais je pense que je risque de revenir bientôt.

Bonsoir à tous. A plus. Kevin
 
K

Kevin

Guest
Bonsoir à tous,

Je sentais que j' allais bien vite revenir. En effet dans la macro écrite hier par Michel, tout fonctionne parfaitement si les 2 classeurs sont dans le même dossier. Maintenant, si je déplace le classeur fermé, j' ai une erreur. Par exemple si je le place en D:\\TEST\\TOTO\\Classeur Fermé.xls et que je mets ce chemin à la place de '\\Classeur Fermé.xls' ça ne fonctionne plus. La macro est la suivante :

Sub TransfertDonnees()
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Library
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Fichier As String, Cible As String, Feuille As String
Dim i As Integer

Fichier = ThisWorkbook.Path & '\\Classeur Fermé.xls'
Feuille = 'Feuil1$' 'attention a ne pas oublier le '$'
Set Cn = New ADODB.Connection
Cn.Open 'Provider = Microsoft.Jet.OLEDB.4.0;' & _
'data source=' & Fichier & ';' & _
'extended properties=''Excel 8.0;'''

Cible = 'SELECT * FROM [' & Feuille & '];'

Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic

With Rs
.AddNew
For i = 0 To 25 'colonnes 1 à 26 dans le classeur fermé
.Fields(i) = ThisWorkbook.Sheets('Feuil3').Cells(20, i + 1) 'plage A20:E20 dans la Feuil3
Next i
.Update
End With

Rs.Close
Cn.Close

End Sub

Je ne dois pas indiquer le bon chemin puisque la cible ne peut être ouverte.

Auriez-vous une idée ? Merci.

A plus. Kevin.
 
K

Kevin

Guest
Bonsoir Michel,

Je te remercie encore de t' intéresser à mon cas , car j' en suis un vrai. En effet en mettant la ligne de code que tu me proposes tout est redevenu normal. J' avais l ' impression de l' avoir déjà fait mais en regardant de plus près, je viens de m' apercevoir que j' avais mis un anti-slash de trop. Encore merci pour ton code qui est parfait.
Si je puis me permettre, puisque tu as l' air de bien maîtriser le sujet,
j' ose une nouvelle question.

Pour le boulot, j' ai fait une usine à gaz et je m' interesse à ADO car les données inscrites dans mon classeur doivent s 'entasser dans une base. Une douzaine de postes possède le classeur et les saisies faites sur les différents postes doivent aller dans la base. La base est donc partagée mais sur le réseau ça rame énormément. Je pensais donc qu' avec ce principe les choses devaient s' accélérer.
Mais mon problème est que certaines fonctions du classeur doivent aussi aller chercher des infos dans la base. Donc je me pose la question suivante : Si je mets la base en classeur fermé par Ado, est-ce que je peux aussi la partager ? Donc du rapide pour inscrire les données et du lent pour aller chercher des données.

Merci. Kevin.
 

Jam

XLDnaute Accro
Salut Kevin, le Forum,

Bravo de t'interresser à ADO, c'est la réponse à ton problème :)

1. Oui tu peux 'partagager' ton classeur via cette méthode
2. Si tu veux vraiment mettre à dispo des données à plusieurs utilisateurs, mieux vaux utiliser un vrai format de base de donnée tel que Access (le plus simple), ou DBase (c'est vieux mais ça marche encore bien). Le gros avantage par rapport à un classeur XL c'est l'indexation des données et la gestion des accès aux données par le moteur de base de données. Les index viendront considérablement accélérer l'accès au données (surtout sur un réseau). Tu n'as pas Access, pas de problème, tu n'en as pas besoin (ni tes utilisateurs) pour accéder à la base de donnée. ADO s'occupe de tout ;)
Bon l'idéal serait d'avoir une licence Access afin de pouvoir accéder tranquilement aux bases de données, sinon il va falloir que tu apprenne la syntaxe SQL au plus vite :(
3. Un autre 'truc'. Si ton admin réseau est ouvert, demande lui si tu (il) peux monter un serveur MySQL. Tu pourras accéder aux données via l'interface PHPMyadmin, et tes utilisateurs pourrons accéder aux BDD via ADO aussi.

Bon courage
 

Discussions similaires

Statistiques des forums

Discussions
312 508
Messages
2 089 137
Membres
104 046
dernier inscrit
ouiza