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 MrExcel,

Merci pour ta réponse. Pour la licence Access, pas de problèmes, le problème, c' est moi. Le classeur que j' ai fait rend service à pas mal de personnes, et n' étant pas un pro d' excel il doit avoir pas mal d' imperfections et de lourdeurs, mais il fonctionne. Le problème est la lenteur en écriture sur la base partagée. Maintenant, Access, je n' y connait vraiment rien. Donc aller faire la base sous Access je ne me sens pas. Je pense que le projet va s' arrêter là.

Merci pour votre aide. A plus. Kevin.
 
K

Kevin

Guest
Bonsoir à tous.

Je suis toujours sur mon classeur fermé (je suis borné), et je ne comprends pas le phénomène suivant.
Mon classeur fermé est maintenant sur le disque S: et s' appelle Base. Je voudrais copier la ligne A102:X102 de la Feuil2(DONNEES) du classeur ouvert dans celui-ci. Je mets donc la macro 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 = 'S:\\BASE.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 2 'colonnes 1 à 25 dans le classeur fermé
.Fields(i) = ThisWorkbook.Sheets('DONNEES').Cells(102, i + 1)
Next i
.Update
End With

Rs.Close
Cn.Close

End Sub

Mais j' ai l' erreur suivante : Trop de champs définis et la ligne de code Rs.Open Cible....... se met en jaune.

Auriez-vous une idée sur la cause du problème ?

Merci. Kevin.
 
K

Kevin

Guest
Bonjour à tous,

J' ai l'impression de verser dans la lourdeur, mais Michel m' ayant fourni un exemple qui fonctionne parfaitement, je voudrais l' adapter à mon fichier mais ça ne fonctionne pas et ça m' énerve. Ce fichier étant trop gros pour le joindre, je tente une nouvelle fois de vous demander si vous comprenez où est l' erreur dans le code que je mets. Toutes mes excuses pour insister autant mais j' aimerais vraiment y arriver.

Bonne journée. Kevin.
 
K

Kevin

Guest
Bonjour Michel,

C' est avec plaisir que je te retrouve sur ce forum. Tu m' as bien aidé jusqu' à maintenant mais comme tu peux le voir, je ne m' en sors toujours pas.

Le classeur fermé, correspond à la pièce jointe. Dans le classeur ouvert les utilisateurs renseignent des cellules de la Feuil1 et celles-ci viennent se positionner sur la ligne A102:X102 de la feuil DONNEES.
D' autres utilisateurs renseignent les cellules de la Feuil5 et celles-ci viennent en A106:X106 de la Feuil DONNEES. Celui qui se sert de la Feuil1, à l' aide d' une macro copie la ligne A102:X102 pour la coller dans la BASE qui est partagée. Idem pour celui qui se sert de la Feuil5.

Chaque utilisateur a le classeur sur son poste de travail et la BASE est placée sur un autre disque. Comme l' enregistrement est long, je voulais essayer de mettre la base en classeur fermé. J' ai essayé au boulot ton exemple et ça fonctionne très bien.

Je te joins donc un extrait de base pour voir si tu as une idée.

Merci. Kevin.
 
K

Kevin

Guest
Encore une erreur, j' ai oublié de joindre la base. [file name=BASE.zip size=14464]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/BASE.zip[/file]
 

Pièces jointes

  • BASE.zip
    3.9 KB · Affichages: 20
  • BASE.zip
    3.9 KB · Affichages: 20
  • BASE.zip
    3.9 KB · Affichages: 30

MichelXld

XLDnaute Barbatruc
rebonjour Kevin

effectivement j'ai eu le meme message d'erreur

j'ai supprimé toutes les colonnes à droite de la colonne X et supprimé de nombreuses lignes 'vides' pour faire le ménage

apres ça les informations sont bien exportées sans message d'erreur

ci joint le classeur fermé à tester



bonne soiree
MichelXld
[file name=Basev02.zip size=8511]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Basev02.zip[/file]

Message édité par: MichelXld, à: 21/05/2005 18:39
 

Pièces jointes

  • Basev02.zip
    8.3 KB · Affichages: 28
K

Kevin

Guest
Bonsoir,

Merci Michel pour ton fichier, tu es vraiment sympa et patient.

J' ai donc remplacé ma base par la tienne, mais maintenant dans le classeur ouvert, en executant la macro je vais plus loin mais j' ai une erreur à ce niveau :

Si je mets : .Fields(i) = ThisWorkbook.Sheets('DONNEES').Cells(120, i + 1)
j' ai l'erreur : Impossible de trouver l' objet dans la collection correspondant au nom ou à la référence demandé.

La feuille nommée DONNEES étant la Feuil2 du classeur ouvert,

Si je mets : .Fields(i) = ThisWorkbook.Sheets('Feuil2').Cells(120, i + 1)
j' ai l' erreur : L' indice n' appartient pas à la sélection.

Je crois que je vais devenir fou. Ca plante à 3 lignes de la fin du code.

Bonne soirée. Kevin.
 

MichelXld

XLDnaute Barbatruc
rebonjour Kevin

si j'ai bien compris tu dois alimenter les colonnes A à X dans le classeur fermé

as tu bien précisé dans ta boucle : For i = 0 To 23


ce qui donne

For i = 0 To 23 'colonnes A à X
.Fields(i) = ThisWorkbook.Sheets('DONNEES').Cells(120, i + 1)
Next i



bonne soiree
MichelXld
 
K

Kevin

Guest
Bonjour à tous,

Grace à Michel que je remercie encore une fois pour sa disponibilité et sa patience, j' arrive maintenant à alimenter les colonnes A à X du classeur fermé à partir de la ligne 102 de la feuille DONNEES du classeur ouvert. Cette ligne 102 est alimentée par la Feuil1 du classeur ouvert.
Maintenant, si je veux aussi alimenter le classeur fermé à partir de la ligne 106 de la feuil DONNEES, ligne 106 alimentée par la Feuil5 du classeur ouvert, je fais une autre macro qui ne diffère de la précédente que par la ligne :
.Fields(i) = ThisWorkbook.Sheets('DONNEES').Cells(106, i + 1)

Mais j' ai alors l' erreur suivante: Le type ne correspond pas.

Donc ma question est la suivante: Peut-on alimenter le classeur fermé par 1 ligne à l' aide d' une macro et l' alimenter par une 2ème ligne à l' aide d' une autre macro ou faut-il faire 2 classeurs ?

Encore merci à Michel. Bonne journée à tous.

Kevin.
 
K

Kevin

Guest
Bonjour Michel,

Je viens de vérifier les formats : le format de la cellule A102 est identique à celui de A106 dans la classeur ouvert et identique à celui de la colonne A du classeur fermé. Idem pour le reste.
La macro contenant Cells(102, i + 1) fonctionne parfaitement tandis que celle contenant Cells(106, i + 1) me fait l' erreur 'le type ne correspond pas'. Les 2 macros sont pourtant identiques à l' exception de 102 dans l' une et 106 dans l'autre.

Bonne journée. Kevin.
 

Discussions similaires

Statistiques des forums

Discussions
312 685
Messages
2 090 947
Membres
104 705
dernier inscrit
Mike72