Macro qui plante... pour extraire des données d'un classeur fermé...

Christian0258

XLDnaute Accro
Bonsoir à tout le forum,

J'ai trouvé sur ce forum une macro (de michel_m).
Pourriez-vous me dire ce qu'il faut modifier sur son code, pour que ça fonctionne (ça plante sous Set Source).

Sub extraire() ' de michel_M
Dim Source As Object, Requete As Object
Dim Onglet As String, Plage As String, fichier As String
Dim Texte_SQL As String

'détermination de la plage à extraire
fichier = "C:\Users\christian\Desktop\Plannings 2016\tablserv1+.xlsm"
Onglet = "Janv"
Plage = "I97:AN111"

'connexion ADO
Set Source = CreateObject("ADODB.Connection")
Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"

'exerce la requete ADO sur les donnée à recopier
Texte_SQL = "SELECT * FROM [" & Onglet & "$" & Plage & "]"
Set Requete = CreateObject("ADODB.Recordset")
Set Requete = Source.Execute(Texte_SQL)

'restitue sur ton classeur
Range("I11").CopyFromRecordset Requete

'libère les pointeurs
Set Requete = Nothing
Set Source = Nothing

End Sub

Je précise que je travaille sous Excel 2007.

Merci pour votre aide si précieuse.
Bien amicalement.
Christian
 

Christian0258

XLDnaute Accro
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

Re, le forum, Roland_M

Merci, Roland_M pour ton aide.

Le message d'erreur ; La table externe n'est pas dans le format attendu.
J'ai ; ... (Multi-dimensional) 2.8 Library

A vous lire.
Merci
Christian
 
Dernière édition:

Christian0258

XLDnaute Accro
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

Re, bonjour à tout le forum, Roland_M

J'ai bien coché la Librairy Acive X 2.0, comme demandé par Roland, mais toujours même plantage.

A noter que les données source contiennent des formules ? ....

Merci pour votre aide si précieuse.

Bien à vous.
Christian
 

Roland_M

XLDnaute Barbatruc
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

re, bonjour à tous,

ça se complique ! j'ai trouvé ceci sur le net, une réponse apportée par Frédéric Sigonneau
ici: la table externe n'est ps dans le format attendu : Forum Excel

Si ce message intervient en dehors de tout classeur particulier (ouverture
d'Excel avec un nouveau classeur, ou sans aucun classeur par exemple), l'erreur
peut provenir :
- d'une macro enregistrée dans le perso.xls
- d'un classeur stocké dans le dossier XLSTART et contenant des macros
- d'une macro complémentaire installée
Supprimer une à une ces causes d'erreur possibles jusqu'à trouver le coupable,
en
- vidant le dossier XLSTART de son contenu (transférer ailleurs les classeurs,
un par un)
- décocher les macros complémentaires (dans Outils Options) en fermant et
relançant Excel à chaque fois pour vérifier si le message d'erreur est toujours
là ou non.


maintenant si ça vient bien de cette ligne ( tu peux confirmer ça ? car le message ne semble pas correspondre )
Set Source = CreateObject("ADODB.Connection")


alors ça n'a rien à voir avec le fichier !? c'est plutôt une histoire de config ou d'options !?
on ne trouve aucune réponse sur le net à ce sujet ! si je trouve qq chose je reviens !
 
Dernière édition:

Christian0258

XLDnaute Accro
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

re, le forum, Roland

oui, ça plante sur cette ligne ;

Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"

Merci.
à vous lire,

Christian
 

Roland_M

XLDnaute Barbatruc
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

re

ha ! ce n'est déjà plus pareil, je croyais que c'était sur> Set Source = . . .
mais c'est de ma faute, car effectivement, je viens de relire ton premier post
et tu dis bien> sous Set Source
en fait c'est> Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" . . .
 

Roland_M

XLDnaute Barbatruc
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

re

en fait avec 2007 c'est différent ! ce n'est pas Excel 8 mais Excel 12 !
ça m'avait complètement échappé ! bizarre d'ailleurs que personne sur le forum n'a réagit !?

'tester la version excel avec Int(Val(Application.Version)) si < 12 (2007)
'HDR=No signifie sans entête(header) si HDR=Yes la prem.lig n'est pas chargée !
'Vers.< 12: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CheminFichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
'Vers.>=12: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CheminFichier & ";Extended Properties=""Excel 12.0;HDR=No;"";"

je viens de retrouver une de mes petites macros (avec des extraits codes de Jacques Boisgontier) pour t'éclairer

Code:
Sub ModifierUneCelluleClasseurFerme() 'une seule cellule
'init ici les variables
   RepDestin$ = ThisWorkbook.Path & "\" '< le rep idem à ce classeur
   FichDestin$ = "Fichier.xls"          '< nom du fichier complet
   FeuilDestin$ = "Feuil1"              '< non de la feuille destination
   CellDestin$ = "b3"                   '< nom de la cellule destination
   DonnSource$ = "ici tes valeurs"  'ou DonnSource$ = Sheets("NomDeTaFeuil").Cells(Lig, Col)
   ChemFichDestin$ = RepDestin$ & FichDestin$
  
   
   '---- ci-dessous ne rien modifier --------
   Set Cnn = New ADODB.Connection
   If Int(Val(Application.Version)) < 12 Then
      Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & ChemFichDestin$ & ";Extended Properties=""Excel 8.0;HDR=No;"";"
   Else
      Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ChemFichDestin$ & ";Extended Properties=""Excel 12.0;HDR=No;"";"
   End If
   Set Rs = New ADODB.Recordset
   R$ = "SELECT * from [" & FeuilDestin$ & CellDestin$ & ":" & CellDestin$ & "]"
   Rs.Open R$, Cnn, adOpenKeyset, adLockOptimistic
   Rs(0).Value = DonnSource$
   Rs.Update
   Rs.Close
   Cnn.Close
End Sub
 
Dernière édition:

Christian0258

XLDnaute Accro
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

Re, le forum, Roland,

Merci infiniment, Roland, pour ton aide.

Suivant tes explications, j'ai fait ça ;
est-ce bon ????

Option Explicit

Sub extraire() ' de michel_M
Dim Source As Object, Requete As Object
Dim Onglet As String, Plage As String, fichier As String
Dim Texte_SQL As String

'détermination de la plage à extraire
fichier = "C:\Users\christian\Desktop\Plannings 2016\tablserv1+.xlsm"
Onglet = "Janv"
Plage = "I97:AN111"

'connexion ADO
Set Source = CreateObject("ADODB.Connection")
Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"data source=" & fichier & ";Extended Properties=""Excel 12.0;HDR=No;"";"

'exerce la requete ADO sur les donnée à recopier
Texte_SQL = "SELECT * FROM [" & Onglet & "$" & Plage & "]"
Set Requete = CreateObject("ADODB.Recordset")
Set Requete = Source.Execute(Texte_SQL)

'restitue sur ton classeur
Range("I11").CopyFromRecordset Requete

'libère les pointeurs
Set Requete = Nothing
Set Source = Nothing

End Sub

Merci,
Christian
 

Roland_M

XLDnaute Barbatruc
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

re

as-tu essayé seulement !?

sinon voici pour toi adapter facilement la routine complète pour importer une ou des données
il suffit de mettre tes valeurs dans les variables sans modifier quoique ce soit dans le code:

Code:
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Library

'tester la version excel avec Int(Val(Application.Version)) si < 12 (2007)
'HDR=No signifie sans entête(header) si HDR=Yes la prem.lig n'est pas chargée !
'Vers.< 12: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CheminFichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
'Vers.>=12: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CheminFichier & ";Extended Properties=""Excel 12.0;HDR=No;"";"

Sub ImportUneCellOuRangDuClasseurFerme()
Dim ADOConnect As Object, ADORecord As Object, TextSQL As String
Dim FeuilSource$, RangSource$
Dim FeuilDestin$, RangDestin$
Dim NomDuClasseurSource$, CheminDuClassSource$, CheminFichSource$

'---------- init var destin pour recopie dans ce classeur --------------------------
NomDuClasseurSource = "nom du classeur avec extention" '<<<<< nom du classeur source
CheminDuClassSource = "chemin du classeur"  '<<<<<<<<<<<<< chemin du classeur source
FeuilSource = "Feuil1$" '<<<<<<<<<<<< nom de la feuil.source AJOUTER LE CARACTERE $ AU BOUT
RangSource = "A2:B3"    '<<<<<<<<<<<< nom du rang de données source exp "A1:A1" ou "A1:C10"
FeuilDestin = ActiveSheet.Name '<<<<< nom de la feuille de destination des données loadées
RangDestin = "A2" '<<<<<<<<<<<<<<<<<< nom de la cellule de destination (coin haut gauche)
'------------------------------------------------------------------------------------------

'  lancement
If Right(CheminDuClassSource, 1) <> "\" Then CheminDuClassSource = CheminDuClassSource & "\"
CheminFichSource = CheminDuClassSource & NomDuClasseurSource
TextSQL = "SELECT * FROM [" & FeuilSource & RangSource & "]"
'ouverture (test version excel)
Set ADOConnect = CreateObject("ADODB.Connection")
If Int(Val(Application.Version)) < 12 Then
   ADOConnect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & CheminFichSource & ";Extended Properties=""Excel 8.0;HDR=No;"";"
Else
   ADOConnect.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CheminFichSource & ";Extended Properties=""Excel 12.0;HDR=No;"";"
End If
    
'load les données
Set ADORecord = CreateObject("ADODB.Recordset")
Set ADORecord = ADOConnect.Execute(TextSQL)
      
'recopie dans ce classeur
Sheets(FeuilDestin).Range(RangDestin).CopyFromRecordset ADORecord

'fermeture connection
ADOConnect.Close
Set ADORecord = Nothing: Set ADOConnect = Nothing
End Sub
 
Dernière édition:

Christian0258

XLDnaute Accro
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

Re, le forum, Roalnd,

Merci, Roalnd, pour ton aide et ta patience....

J'ai déclaré mes variables dans ta dernière macro comme suit ;

NomDuClasseurSource = "tablserv1+.xlsm" '< nom du classeur source
CheminDuClassSource = "C:\Users\christian\Desktop\Plannings 2016" '<<<<<<<<<<<< chemin du classeur source
FeuilDestin = ActiveSheet.Name '<<<<< nom de la feuille de destination des données loadées
RangDestin = "I11" '<<<<<<<<<<<<<<<<<< nom de la cellule de destination (le coin haut gauche si rang )
FeuilSource = "Janv" '<<<<<<<<<<<< nom de la feuille AJOUTER LE CARACTERE $ AU BOUT !!!!
RangSource = "I97:AN111" '<<<<<<<<<<<< exp "A1:A1" ou "A1:C10"

Mais je n'ai pas la référence Microsoft ActiveX Data Objects x.x Library sur mon ordi....

Donc ça plante sur ;
ADOConnect.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CheminFichSource & ";Extended Properties=""Excel 12.0;HDR=No;"";"

Comment faire ?

Merci.
A vous lire.
Christian
 

Roland_M

XLDnaute Barbatruc
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

re

tu dis: Mais je n'ai pas la référence Microsoft ActiveX Data Objects x.x Library sur mon ordi....
perso j'ai aussi Excel 2007 et c'est Microsoft ActiveX Data Objects 2.0 Library
mais ça peut être Objects 2.1 ou 2.5 2.6 2.7 2.8 ...

si tu l'as pas c'est qu'il y a un problème avec ton installation Excel !?
je vais m'informer de mon côté ...
 
Dernière édition:

Christian0258

XLDnaute Accro
Re : Macro qui plante... pour extraire des données d'un classeur fermé...

Re, le forum, Roland,

OK chez moi également ; Microsoft ActiveX Data Objects 2.0 Library (coché)

Mais ça plante toujours, avec le même message, sur ;
ADOConnect.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CheminFichSource & ";Extended Properties=""Excel 12.0;HDR=No;"";"

En cherchant j'ai trouvé ça ???? sur le site EXCEL-PRATIQUE (pierrep56 à écrit):

"Si tu utilises une version récente d'Office les fichiers sont en .xlsx ou .xlsm, il faut donc ajouter ces types de fichier dans la chaine de connexion :
ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};"

Quand penses-tu ?

Merci
Christian
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 326
Membres
102 862
dernier inscrit
Emma35400