Plein l'dos d'ADO ! :(

Le
Circé
Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui
de 156 lignes est importé

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichDenis
Le #5163021
Je publie à nouveau la réponse que j'avais faite pour ceux que l'aventure intéresse !

Est-ce que la structure des données est la même dans chaque classeur ?
Le fichier dont seulement une partie des données est importé, Comment ces
dernières sont-elles disponsées ? Celles qui sont importées, Celles qui sont
omises? De quel type de données s'agit-il ? Numérique, texte, date ...

Et les dispositions des données du classeur oublié, qu'ont-elles de spéciales ?

J'avais à l'origine testé cette procédure sur des classeurs qui avaient exactement
la même structure et n'avait éprouvé aucun problème !

As-tu des plages nommées dans tes classeurs ? Quelles différences il y a -t-il entre
une classeur où l'importatiion réussie ou échoue ?

Il est très difficile se solutionner la question que tu poses sans pouivoir procéder à
des tests.

Tu as toujours l'option d'exécuter cette procédure "pas à pas" en utilisant la touche F8
Au fur et à mesure qu'elle progresse, tu vérifies si la teneur des différentes variables
correspond bien à ce que tu devrais obtenir.

Bonne chance.


================================================== Requiert les bibliothèques :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"
Version 2.8 de préférence sinon mettre à jour le MDAC
chez microsoft

Toutes les feuilles de données sont réputées avoir
une ligne d'étiquette définissant les champs de la table.

Ne pas oublier de déclarer les bibliothèques mentionnées
dans la procédure : "Extraire_Data_First_Excel_Sheet"


'------------------------------------------
Sub Test()
'Appel d'une procédure ayant 2 paramêtres
'A ) Répertoire à scanner
'Ne pas oublier le "" à la fin comme dans "c:AAA"

'B ) 'L'adresse de la première cellule du coin supérieur
'gauche où seront copiées les données recueillies
'Différente syntaxe possible d'indiquer la cellule
'à partir de laquelle seront copiés les résultats.

'----------1----------
'Même classeur que la procédure, dans la Feuil2
'Extraire_Data_First_Excel_Sheet "c:AAA", _
ThisWorkbook.Worksheets("Feuil2").Range("G10")

'-----------2----------
'Autre classeur ouvert que celui de la procédure
Extraire_Data_First_Excel_Sheet "c:AAA", _
Workbooks("Classeur2").Worksheets("Feuil2").Range("G10")

''-----------3----------
'Dans la feuille active du classeur actif au
'moment de lancer la procédure
' Extraire_Data_First_Excel_Sheet "c:AAA", Range("G10")

End Sub
'------------------------------------------

Sub Extraire_Data_First_Excel_Sheet(Chemin As String, Rg As Range)

'Nécessite l 'ajoute de la bibliothèque suivante :
'"Microsoft Activex Data Object 2.x librairy"
' ET
'"Microsoft Dao 3.6 Objects librairy"

'Extrait les données de plusieurs classeurs d'un même
'répertoire en prenant pour acquis que les données ont
'la même structure. Le nom de la première feuille est
'obtenue par la fonction "FirstExcelSheetName"

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String
Dim file As String, C As Integer, Ok As Integer
Dim ModeCalcul As String

'Extrait le premier fichier du répertoire
file = Dir(Chemin & "*.xls")

ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Do While file <> ""
'Exclure le classeur où sont copiées les données
'pour ne pas dédoubler les data...

If Chemin & Rg.Parent.Parent.Name <> Chemin & file Then
'Identifier la cellule supérieur de gauche
'où seront copiées les données
If Rg(1, 1) = "" Then
Set Rg = Rg(1, 1)
Else
Set Rg = Rg.EntireColumn.Find(What:="*", LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Offset(1)
Ok = 1
End If

'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & file & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'détermine le nom de la première feuille du classeur
NomFeuille = FirstExcelSheetName(Chemin & file)

'Détermine la requête à être exécuté
Requete = "SELECT * From [" & NomFeuille & "]"

'Exécution de la requête
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie le nom des champs du recordset vers Excel
'dans le cas du premier classeur seulement
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
'Copie le recordset vers Excel
Rg.Offset(1).CopyFromRecordset Rst
Else
'Copie le recordset vers Excel
Rg.CopyFromRecordset Rst
End If
'Ferme le recordset et la connection
Rst.Close: Conn.Close
'Passe au classeur suivant
file = Dir()
Else
'Passe au classeur suivant si le fichier
'où sont copiées les données est le même
'que celui qui est traité dans cette sub.
file = Dir()
End If
Loop
Application.EnableEvents = True
Application.Calculation = ModeCalcul
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'------------------------------------------
Function FirstExcelSheetName(Fichier As String)
'"Microsoft Dao 3.6 Objects librairy"
Dim XlDb As DAO.Database
Dim TbL As DAO.TableDef
Set XlDb = OpenDatabase(Fichier, False, True, "Excel 8.0;")
FirstExcelSheetName = XlDb.TableDefs(0).Name
XlDb.Close: Set XlDb = Nothing
End Function
'------------------------------------------
==================================================


"Circé" Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui
de 156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr
isabelle
Le #5161881
bonjour Circé,

j'ai le même problème avec ADO, les fichiers sont de structure identique contenent une seule feuille
avec des données alpha et numérique les plages sont de A1:Dx
j'ai alors opté pour la méthode FileSearch

Sub bachfile()
Set fs = Application.FileSearch
With fs
.LookIn = "C:zaza"
.Filename = "*.xls"
.Execute
For i = 1 To .FoundFiles.Count
' MsgBox .FoundFiles(i)
Workbooks.Open Filename:=.FoundFiles(i)
x = Workbooks("Classeur1.xls").Sheets("Feuil1").Range("A65536").End(xlUp).Row + 1
y = ActiveWorkbook.Sheets("Feuil1").Range("A65536").End(xlUp).Row + 1
Range("A1:D" & y).Copy Workbooks("Classeur1").Sheets("Feuil1").Range("A" & x)
ActiveWorkbook.Close SaveChanges:úlse
Next i
If .FoundFiles.Count = 0 Then
MsgBox "Aucun fichier n'a été trouvé."
End If
End With
End Sub

isabelle

Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui de
156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr




Circé
Le #5161861
Bonjour !

MichDenis a couché sur son écran :
Je publie à nouveau la réponse que j'avais faite pour ceux que l'aventure
intéresse !


Et quelle aventure !!! :s

Est-ce que la structure des données est la même dans chaque classeur ?


Strictement la même.
D'ailleurs, pour faire ces tests, je suis partie d'un fichier d'environ
300 lignes que j'ai scindé en plusieurs morceaux.

Le fichier dont seulement une partie des données est importé, Comment ces
dernières sont-elles disponsées ? Celles qui sont importées, Celles qui sont
omises? De quel type de données s'agit-il ? Numérique, texte, date ...


En fait c'est très aléatoire et on dirait qu'il y a comme une
limitation du nombre de lignes.
Par exemple un classeur tout seul de 25 lignes est bien importé. Ce
même classeur, dès lors qu'il se trouve en présence d'un autre n'est
plus importé...
Quand je mets le plus gros classeur (156 lignes) tout seul, pas de
soucis. S'il y en a d'autres, seul le gros classeur est importé...

Et les dispositions des données du classeur oublié, qu'ont-elles de spéciales
?


Comme je t'ai dit, il ne s'agit pas de certaines données qui sont
oubliées... Cela dépendrait plutôt du nombre de classeurs et de leur
nombre de lignes.
D'ailleurs, j'ai testé avec deux fichiers identiques (un original et
une copie), et un seul est importé.

J'avais à l'origine testé cette procédure sur des classeurs qui avaient
exactement la même structure et n'avait éprouvé aucun problème !

As-tu des plages nommées dans tes classeurs ? Quelles différences il y a
-t-il entre une classeur où l'importatiion réussie ou échoue ?


Dans chaque classeur, il y a une plage nommée (pour les données) via
une formule DECALER.

Il est très difficile se solutionner la question que tu poses sans pouivoir
procéder à des tests.

Tu as toujours l'option d'exécuter cette procédure "pas à pas" en utilisant
la touche F8 Au fur et à mesure qu'elle progresse, tu vérifies si la teneur
des différentes variables correspond bien à ce que tu devrais obtenir.


J'ai exécuté la macro en pas à pas, ça ne me donne pas grand chose...
J'avais mis deux fichiers, la boucle les a bien passé en revue tous les
deux, mais seul les données de l'un ont été insérées.

Bonne chance.


C'est mal parti pour la chance ! :s

Circé


================================================== > Requiert les bibliothèques :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"
Version 2.8 de préférence sinon mettre à jour le MDAC
chez microsoft

Toutes les feuilles de données sont réputées avoir
une ligne d'étiquette définissant les champs de la table.

Ne pas oublier de déclarer les bibliothèques mentionnées
dans la procédure : "Extraire_Data_First_Excel_Sheet"


'------------------------------------------
Sub Test()
'Appel d'une procédure ayant 2 paramêtres
'A ) Répertoire à scanner
'Ne pas oublier le "" à la fin comme dans "c:AAA"

'B ) 'L'adresse de la première cellule du coin supérieur
'gauche où seront copiées les données recueillies
'Différente syntaxe possible d'indiquer la cellule
'à partir de laquelle seront copiés les résultats.

'----------1----------
'Même classeur que la procédure, dans la Feuil2
'Extraire_Data_First_Excel_Sheet "c:AAA", _
ThisWorkbook.Worksheets("Feuil2").Range("G10")

'-----------2----------
'Autre classeur ouvert que celui de la procédure
Extraire_Data_First_Excel_Sheet "c:AAA", _
Workbooks("Classeur2").Worksheets("Feuil2").Range("G10")

''-----------3----------
'Dans la feuille active du classeur actif au
'moment de lancer la procédure
' Extraire_Data_First_Excel_Sheet "c:AAA", Range("G10")

End Sub
'------------------------------------------

Sub Extraire_Data_First_Excel_Sheet(Chemin As String, Rg As Range)

'Nécessite l 'ajoute de la bibliothèque suivante :
'"Microsoft Activex Data Object 2.x librairy"
' ET
'"Microsoft Dao 3.6 Objects librairy"

'Extrait les données de plusieurs classeurs d'un même
'répertoire en prenant pour acquis que les données ont
'la même structure. Le nom de la première feuille est
'obtenue par la fonction "FirstExcelSheetName"

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String
Dim file As String, C As Integer, Ok As Integer
Dim ModeCalcul As String

'Extrait le premier fichier du répertoire
file = Dir(Chemin & "*.xls")

ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Do While file <> ""
'Exclure le classeur où sont copiées les données
'pour ne pas dédoubler les data...

If Chemin & Rg.Parent.Parent.Name <> Chemin & file Then
'Identifier la cellule supérieur de gauche
'où seront copiées les données
If Rg(1, 1) = "" Then
Set Rg = Rg(1, 1)
Else
Set Rg = Rg.EntireColumn.Find(What:="*", LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Offset(1) Ok = 1
End If

'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & file & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'détermine le nom de la première feuille du classeur
NomFeuille = FirstExcelSheetName(Chemin & file)

'Détermine la requête à être exécuté
Requete = "SELECT * From [" & NomFeuille & "]"

'Exécution de la requête
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie le nom des champs du recordset vers Excel
'dans le cas du premier classeur seulement
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
'Copie le recordset vers Excel
Rg.Offset(1).CopyFromRecordset Rst
Else
'Copie le recordset vers Excel
Rg.CopyFromRecordset Rst
End If
'Ferme le recordset et la connection
Rst.Close: Conn.Close
'Passe au classeur suivant
file = Dir()
Else
'Passe au classeur suivant si le fichier
'où sont copiées les données est le même
'que celui qui est traité dans cette sub.
file = Dir()
End If
Loop
Application.EnableEvents = True
Application.Calculation = ModeCalcul
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'------------------------------------------
Function FirstExcelSheetName(Fichier As String)
'"Microsoft Dao 3.6 Objects librairy"
Dim XlDb As DAO.Database
Dim TbL As DAO.TableDef
Set XlDb = OpenDatabase(Fichier, False, True, "Excel 8.0;")
FirstExcelSheetName = XlDb.TableDefs(0).Name
XlDb.Close: Set XlDb = Nothing
End Function
'------------------------------------------
================================================== >


"Circé" Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui
de 156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr


Circé
Le #5161841
Bonjour Isabelle,

Je viens de répondre à MichDenis sans voir ton post.

Ben, déjà je me sens moins seule...
J'ai constaté aussi une autre erreur, certaines cellules importées
restent vides, va savoir pourquoi... Alors qu'il ne s'agit que de texte
tout bête !!!

Je te remercie beaucoup pour ta solution que je vais tester de ce pas.

A bientôt donc ;)

Circé
http://faqword.free.fr

isabelle avait prétendu :
bonjour Circé,

j'ai le même problème avec ADO, les fichiers sont de structure identique
contenent une seule feuille
avec des données alpha et numérique les plages sont de A1:Dx
j'ai alors opté pour la méthode FileSearch

Sub bachfile()
Set fs = Application.FileSearch
With fs
.LookIn = "C:zaza"
.Filename = "*.xls"
.Execute
For i = 1 To .FoundFiles.Count
' MsgBox .FoundFiles(i)
Workbooks.Open Filename:=.FoundFiles(i)
x =
Workbooks("Classeur1.xls").Sheets("Feuil1").Range("A65536").End(xlUp).Row + 1
y = ActiveWorkbook.Sheets("Feuil1").Range("A65536").End(xlUp).Row + 1
Range("A1:D" & y).Copy Workbooks("Classeur1").Sheets("Feuil1").Range("A"
& x)
ActiveWorkbook.Close SaveChanges:úlse
Next i
If .FoundFiles.Count = 0 Then
MsgBox "Aucun fichier n'a été trouvé."
End If
End With
End Sub

isabelle

Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer le
contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas si
concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui est
certain c'est que tous les fichiers ne sont pas importés, et pourtant il ne
s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source =>
seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de 106 au
total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui de
156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr






MichDenis
Le #5161811
Ceci est à télécharger : http://cjoint.com/?csqKZSD0J1

Dans ce fichier zip, il y a 4 fichiers.
3 classeurs : classeur1.xls , classeur2.xls, Classeur3.xls
Dans chaque classeur, 4 colonnes de données (les mêmes ;-) )

Dans le 4 ième fichier, la macro.

Placer ces 4 fichiers dans un répertoire où seulement ces fichiers
seront présents et exécuter la macro du classeur "FichierExécution.xls"

P.S. Les bibliothèques chargés dans le classeur FichierExécution sont :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"

Est-ce que cela ne fonctionne toujours pas ?





"Circé" Bonjour !

MichDenis a couché sur son écran :
Je publie à nouveau la réponse que j'avais faite pour ceux que l'aventure
intéresse !


Et quelle aventure !!! :s

Est-ce que la structure des données est la même dans chaque classeur ?


Strictement la même.
D'ailleurs, pour faire ces tests, je suis partie d'un fichier d'environ
300 lignes que j'ai scindé en plusieurs morceaux.

Le fichier dont seulement une partie des données est importé, Comment ces
dernières sont-elles disponsées ? Celles qui sont importées, Celles qui sont
omises? De quel type de données s'agit-il ? Numérique, texte, date ...


En fait c'est très aléatoire et on dirait qu'il y a comme une
limitation du nombre de lignes.
Par exemple un classeur tout seul de 25 lignes est bien importé. Ce
même classeur, dès lors qu'il se trouve en présence d'un autre n'est
plus importé...
Quand je mets le plus gros classeur (156 lignes) tout seul, pas de
soucis. S'il y en a d'autres, seul le gros classeur est importé...

Et les dispositions des données du classeur oublié, qu'ont-elles de spéciales
?


Comme je t'ai dit, il ne s'agit pas de certaines données qui sont
oubliées... Cela dépendrait plutôt du nombre de classeurs et de leur
nombre de lignes.
D'ailleurs, j'ai testé avec deux fichiers identiques (un original et
une copie), et un seul est importé.

J'avais à l'origine testé cette procédure sur des classeurs qui avaient
exactement la même structure et n'avait éprouvé aucun problème !

As-tu des plages nommées dans tes classeurs ? Quelles différences il y a
-t-il entre une classeur où l'importatiion réussie ou échoue ?


Dans chaque classeur, il y a une plage nommée (pour les données) via
une formule DECALER.

Il est très difficile se solutionner la question que tu poses sans pouivoir
procéder à des tests.

Tu as toujours l'option d'exécuter cette procédure "pas à pas" en utilisant
la touche F8 Au fur et à mesure qu'elle progresse, tu vérifies si la teneur
des différentes variables correspond bien à ce que tu devrais obtenir.


J'ai exécuté la macro en pas à pas, ça ne me donne pas grand chose...
J'avais mis deux fichiers, la boucle les a bien passé en revue tous les
deux, mais seul les données de l'un ont été insérées.

Bonne chance.


C'est mal parti pour la chance ! :s

Circé


================================================== > Requiert les bibliothèques :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"
Version 2.8 de préférence sinon mettre à jour le MDAC
chez microsoft

Toutes les feuilles de données sont réputées avoir
une ligne d'étiquette définissant les champs de la table.

Ne pas oublier de déclarer les bibliothèques mentionnées
dans la procédure : "Extraire_Data_First_Excel_Sheet"


'------------------------------------------
Sub Test()
'Appel d'une procédure ayant 2 paramêtres
'A ) Répertoire à scanner
'Ne pas oublier le "" à la fin comme dans "c:AAA"

'B ) 'L'adresse de la première cellule du coin supérieur
'gauche où seront copiées les données recueillies
'Différente syntaxe possible d'indiquer la cellule
'à partir de laquelle seront copiés les résultats.

'----------1----------
'Même classeur que la procédure, dans la Feuil2
'Extraire_Data_First_Excel_Sheet "c:AAA", _
ThisWorkbook.Worksheets("Feuil2").Range("G10")

'-----------2----------
'Autre classeur ouvert que celui de la procédure
Extraire_Data_First_Excel_Sheet "c:AAA", _
Workbooks("Classeur2").Worksheets("Feuil2").Range("G10")

''-----------3----------
'Dans la feuille active du classeur actif au
'moment de lancer la procédure
' Extraire_Data_First_Excel_Sheet "c:AAA", Range("G10")

End Sub
'------------------------------------------

Sub Extraire_Data_First_Excel_Sheet(Chemin As String, Rg As Range)

'Nécessite l 'ajoute de la bibliothèque suivante :
'"Microsoft Activex Data Object 2.x librairy"
' ET
'"Microsoft Dao 3.6 Objects librairy"

'Extrait les données de plusieurs classeurs d'un même
'répertoire en prenant pour acquis que les données ont
'la même structure. Le nom de la première feuille est
'obtenue par la fonction "FirstExcelSheetName"

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String
Dim file As String, C As Integer, Ok As Integer
Dim ModeCalcul As String

'Extrait le premier fichier du répertoire
file = Dir(Chemin & "*.xls")

ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Do While file <> ""
'Exclure le classeur où sont copiées les données
'pour ne pas dédoubler les data...

If Chemin & Rg.Parent.Parent.Name <> Chemin & file Then
'Identifier la cellule supérieur de gauche
'où seront copiées les données
If Rg(1, 1) = "" Then
Set Rg = Rg(1, 1)
Else
Set Rg = Rg.EntireColumn.Find(What:="*", LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Offset(1) Ok = 1
End If

'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & file & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'détermine le nom de la première feuille du classeur
NomFeuille = FirstExcelSheetName(Chemin & file)

'Détermine la requête à être exécuté
Requete = "SELECT * From [" & NomFeuille & "]"

'Exécution de la requête
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie le nom des champs du recordset vers Excel
'dans le cas du premier classeur seulement
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
'Copie le recordset vers Excel
Rg.Offset(1).CopyFromRecordset Rst
Else
'Copie le recordset vers Excel
Rg.CopyFromRecordset Rst
End If
'Ferme le recordset et la connection
Rst.Close: Conn.Close
'Passe au classeur suivant
file = Dir()
Else
'Passe au classeur suivant si le fichier
'où sont copiées les données est le même
'que celui qui est traité dans cette sub.
file = Dir()
End If
Loop
Application.EnableEvents = True
Application.Calculation = ModeCalcul
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'------------------------------------------
Function FirstExcelSheetName(Fichier As String)
'"Microsoft Dao 3.6 Objects librairy"
Dim XlDb As DAO.Database
Dim TbL As DAO.TableDef
Set XlDb = OpenDatabase(Fichier, False, True, "Excel 8.0;")
FirstExcelSheetName = XlDb.TableDefs(0).Name
XlDb.Close: Set XlDb = Nothing
End Function
'------------------------------------------
================================================== >


"Circé" Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui
de 156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr


Circé
Le #5161761
Alors, j'ai testé avec tes fichiers : ça marche

J'ai mis 5 de mes fichiers à la place des tiens, et j'en ai récupéré
seulement 3 dont l'un incomplet.
Sans compter que je récupère les entêtes et numéros de colonnes.

Mes fichiers seraient-ils trop compliqués ? Ils sont tous 45 colonnes
mais le nombre de lignes n'est pas très important : ça va de 25 à 150.

Quant à la solution d'Isabelle, c'était en fait ce que je voulais
éviter : ouvrir chaque fichier et copier/coller... il me semble que ça
va rallonger le temps d'exécution !

Circé
http://faqword.free.fr

MichDenis a formulé ce lundi :
Ceci est à télécharger : http://cjoint.com/?csqKZSD0J1

Dans ce fichier zip, il y a 4 fichiers.
3 classeurs : classeur1.xls , classeur2.xls, Classeur3.xls
Dans chaque classeur, 4 colonnes de données (les mêmes ;-) )

Dans le 4 ième fichier, la macro.

Placer ces 4 fichiers dans un répertoire où seulement ces fichiers
seront présents et exécuter la macro du classeur "FichierExécution.xls"

P.S. Les bibliothèques chargés dans le classeur FichierExécution sont :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"

Est-ce que cela ne fonctionne toujours pas ?





"Circé" Bonjour !

MichDenis a couché sur son écran :
Je publie à nouveau la réponse que j'avais faite pour ceux que l'aventure
intéresse !


Et quelle aventure !!! :s

Est-ce que la structure des données est la même dans chaque classeur ?


Strictement la même.
D'ailleurs, pour faire ces tests, je suis partie d'un fichier d'environ
300 lignes que j'ai scindé en plusieurs morceaux.

Le fichier dont seulement une partie des données est importé, Comment ces
dernières sont-elles disponsées ? Celles qui sont importées, Celles qui sont
omises? De quel type de données s'agit-il ? Numérique, texte, date ...


En fait c'est très aléatoire et on dirait qu'il y a comme une
limitation du nombre de lignes.
Par exemple un classeur tout seul de 25 lignes est bien importé. Ce
même classeur, dès lors qu'il se trouve en présence d'un autre n'est
plus importé...
Quand je mets le plus gros classeur (156 lignes) tout seul, pas de
soucis. S'il y en a d'autres, seul le gros classeur est importé...

Et les dispositions des données du classeur oublié, qu'ont-elles de
spéciales ?


Comme je t'ai dit, il ne s'agit pas de certaines données qui sont
oubliées... Cela dépendrait plutôt du nombre de classeurs et de leur
nombre de lignes.
D'ailleurs, j'ai testé avec deux fichiers identiques (un original et
une copie), et un seul est importé.

J'avais à l'origine testé cette procédure sur des classeurs qui avaient
exactement la même structure et n'avait éprouvé aucun problème !

As-tu des plages nommées dans tes classeurs ? Quelles différences il y a
-t-il entre une classeur où l'importatiion réussie ou échoue ?


Dans chaque classeur, il y a une plage nommée (pour les données) via
une formule DECALER.

Il est très difficile se solutionner la question que tu poses sans pouivoir
procéder à des tests.

Tu as toujours l'option d'exécuter cette procédure "pas à pas" en utilisant
la touche F8 Au fur et à mesure qu'elle progresse, tu vérifies si la teneur
des différentes variables correspond bien à ce que tu devrais obtenir.


J'ai exécuté la macro en pas à pas, ça ne me donne pas grand chose...
J'avais mis deux fichiers, la boucle les a bien passé en revue tous les
deux, mais seul les données de l'un ont été insérées.

Bonne chance.


C'est mal parti pour la chance ! :s

Circé


================================================== >> Requiert les bibliothèques :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"
Version 2.8 de préférence sinon mettre à jour le MDAC
chez microsoft

Toutes les feuilles de données sont réputées avoir
une ligne d'étiquette définissant les champs de la table.

Ne pas oublier de déclarer les bibliothèques mentionnées
dans la procédure : "Extraire_Data_First_Excel_Sheet"


'------------------------------------------
Sub Test()
'Appel d'une procédure ayant 2 paramêtres
'A ) Répertoire à scanner
'Ne pas oublier le "" à la fin comme dans "c:AAA"

'B ) 'L'adresse de la première cellule du coin supérieur
'gauche où seront copiées les données recueillies
'Différente syntaxe possible d'indiquer la cellule
'à partir de laquelle seront copiés les résultats.

'----------1----------
'Même classeur que la procédure, dans la Feuil2
'Extraire_Data_First_Excel_Sheet "c:AAA", _
ThisWorkbook.Worksheets("Feuil2").Range("G10")

'-----------2----------
'Autre classeur ouvert que celui de la procédure
Extraire_Data_First_Excel_Sheet "c:AAA", _
Workbooks("Classeur2").Worksheets("Feuil2").Range("G10")

''-----------3----------
'Dans la feuille active du classeur actif au
'moment de lancer la procédure
' Extraire_Data_First_Excel_Sheet "c:AAA", Range("G10")

End Sub
'------------------------------------------

Sub Extraire_Data_First_Excel_Sheet(Chemin As String, Rg As Range)

'Nécessite l 'ajoute de la bibliothèque suivante :
'"Microsoft Activex Data Object 2.x librairy"
' ET
'"Microsoft Dao 3.6 Objects librairy"

'Extrait les données de plusieurs classeurs d'un même
'répertoire en prenant pour acquis que les données ont
'la même structure. Le nom de la première feuille est
'obtenue par la fonction "FirstExcelSheetName"

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String
Dim file As String, C As Integer, Ok As Integer
Dim ModeCalcul As String

'Extrait le premier fichier du répertoire
file = Dir(Chemin & "*.xls")

ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Do While file <> ""
'Exclure le classeur où sont copiées les données
'pour ne pas dédoubler les data...

If Chemin & Rg.Parent.Parent.Name <> Chemin & file Then
'Identifier la cellule supérieur de gauche
'où seront copiées les données
If Rg(1, 1) = "" Then
Set Rg = Rg(1, 1)
Else
Set Rg = Rg.EntireColumn.Find(What:="*", LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Offset(1) Ok = 1
End If

'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & file & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'détermine le nom de la première feuille du classeur
NomFeuille = FirstExcelSheetName(Chemin & file)

'Détermine la requête à être exécuté
Requete = "SELECT * From [" & NomFeuille & "]"

'Exécution de la requête
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie le nom des champs du recordset vers Excel
'dans le cas du premier classeur seulement
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
'Copie le recordset vers Excel
Rg.Offset(1).CopyFromRecordset Rst
Else
'Copie le recordset vers Excel
Rg.CopyFromRecordset Rst
End If
'Ferme le recordset et la connection
Rst.Close: Conn.Close
'Passe au classeur suivant
file = Dir()
Else
'Passe au classeur suivant si le fichier
'où sont copiées les données est le même
'que celui qui est traité dans cette sub.
file = Dir()
End If
Loop
Application.EnableEvents = True
Application.Calculation = ModeCalcul
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'------------------------------------------
Function FirstExcelSheetName(Fichier As String)
'"Microsoft Dao 3.6 Objects librairy"
Dim XlDb As DAO.Database
Dim TbL As DAO.TableDef
Set XlDb = OpenDatabase(Fichier, False, True, "Excel 8.0;")
FirstExcelSheetName = XlDb.TableDefs(0).Name
XlDb.Close: Set XlDb = Nothing
End Function
'------------------------------------------
================================================== >>


"Circé" Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui
de 156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr




MichDenis
Le #5161461
Ado fonctionne bien si tes tableaux en Excel sont bâtis un peu
à la manière d'une table d'une base de données

Les colonnes ont un étiquette de colonne (pas nécessaire mais il faut
en tenir compte dans la chaîne de connexion : dans la ligne de code
qui suit de la procédure : Yes = étiquette de colonne , si c'était No
il y aurait absence d'étiquettes de colonnes.
"Extended Properties=""Excel 8.0;HDR=YES;"""

Habituellement chaque colonne doit contenir des données de même type.
De mémoire, ADO utilise les 8 premières lignes du champ (colonne) pour
déterminer le type de données de la colonne. Un problème "D'OUBLI" de
data survient si ADO évalue le type comme étant "String" et qu'il y a quelques
données numériques ...L'inverse est vrai aussi.




"Circé" Alors, j'ai testé avec tes fichiers : ça marche

J'ai mis 5 de mes fichiers à la place des tiens, et j'en ai récupéré
seulement 3 dont l'un incomplet.
Sans compter que je récupère les entêtes et numéros de colonnes.

Mes fichiers seraient-ils trop compliqués ? Ils sont tous 45 colonnes
mais le nombre de lignes n'est pas très important : ça va de 25 à 150.

Quant à la solution d'Isabelle, c'était en fait ce que je voulais
éviter : ouvrir chaque fichier et copier/coller... il me semble que ça
va rallonger le temps d'exécution !

Circé
http://faqword.free.fr

MichDenis a formulé ce lundi :
Ceci est à télécharger : http://cjoint.com/?csqKZSD0J1

Dans ce fichier zip, il y a 4 fichiers.
3 classeurs : classeur1.xls , classeur2.xls, Classeur3.xls
Dans chaque classeur, 4 colonnes de données (les mêmes ;-) )

Dans le 4 ième fichier, la macro.

Placer ces 4 fichiers dans un répertoire où seulement ces fichiers
seront présents et exécuter la macro du classeur "FichierExécution.xls"

P.S. Les bibliothèques chargés dans le classeur FichierExécution sont :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"

Est-ce que cela ne fonctionne toujours pas ?





"Circé" Bonjour !

MichDenis a couché sur son écran :
Je publie à nouveau la réponse que j'avais faite pour ceux que l'aventure
intéresse !


Et quelle aventure !!! :s

Est-ce que la structure des données est la même dans chaque classeur ?


Strictement la même.
D'ailleurs, pour faire ces tests, je suis partie d'un fichier d'environ
300 lignes que j'ai scindé en plusieurs morceaux.

Le fichier dont seulement une partie des données est importé, Comment ces
dernières sont-elles disponsées ? Celles qui sont importées, Celles qui sont
omises? De quel type de données s'agit-il ? Numérique, texte, date ...


En fait c'est très aléatoire et on dirait qu'il y a comme une
limitation du nombre de lignes.
Par exemple un classeur tout seul de 25 lignes est bien importé. Ce
même classeur, dès lors qu'il se trouve en présence d'un autre n'est
plus importé...
Quand je mets le plus gros classeur (156 lignes) tout seul, pas de
soucis. S'il y en a d'autres, seul le gros classeur est importé...

Et les dispositions des données du classeur oublié, qu'ont-elles de
spéciales ?


Comme je t'ai dit, il ne s'agit pas de certaines données qui sont
oubliées... Cela dépendrait plutôt du nombre de classeurs et de leur
nombre de lignes.
D'ailleurs, j'ai testé avec deux fichiers identiques (un original et
une copie), et un seul est importé.

J'avais à l'origine testé cette procédure sur des classeurs qui avaient
exactement la même structure et n'avait éprouvé aucun problème !

As-tu des plages nommées dans tes classeurs ? Quelles différences il y a
-t-il entre une classeur où l'importatiion réussie ou échoue ?


Dans chaque classeur, il y a une plage nommée (pour les données) via
une formule DECALER.

Il est très difficile se solutionner la question que tu poses sans pouivoir
procéder à des tests.

Tu as toujours l'option d'exécuter cette procédure "pas à pas" en utilisant
la touche F8 Au fur et à mesure qu'elle progresse, tu vérifies si la teneur
des différentes variables correspond bien à ce que tu devrais obtenir.


J'ai exécuté la macro en pas à pas, ça ne me donne pas grand chose...
J'avais mis deux fichiers, la boucle les a bien passé en revue tous les
deux, mais seul les données de l'un ont été insérées.

Bonne chance.


C'est mal parti pour la chance ! :s

Circé


================================================== >> Requiert les bibliothèques :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"
Version 2.8 de préférence sinon mettre à jour le MDAC
chez microsoft

Toutes les feuilles de données sont réputées avoir
une ligne d'étiquette définissant les champs de la table.

Ne pas oublier de déclarer les bibliothèques mentionnées
dans la procédure : "Extraire_Data_First_Excel_Sheet"


'------------------------------------------
Sub Test()
'Appel d'une procédure ayant 2 paramêtres
'A ) Répertoire à scanner
'Ne pas oublier le "" à la fin comme dans "c:AAA"

'B ) 'L'adresse de la première cellule du coin supérieur
'gauche où seront copiées les données recueillies
'Différente syntaxe possible d'indiquer la cellule
'à partir de laquelle seront copiés les résultats.

'----------1----------
'Même classeur que la procédure, dans la Feuil2
'Extraire_Data_First_Excel_Sheet "c:AAA", _
ThisWorkbook.Worksheets("Feuil2").Range("G10")

'-----------2----------
'Autre classeur ouvert que celui de la procédure
Extraire_Data_First_Excel_Sheet "c:AAA", _
Workbooks("Classeur2").Worksheets("Feuil2").Range("G10")

''-----------3----------
'Dans la feuille active du classeur actif au
'moment de lancer la procédure
' Extraire_Data_First_Excel_Sheet "c:AAA", Range("G10")

End Sub
'------------------------------------------

Sub Extraire_Data_First_Excel_Sheet(Chemin As String, Rg As Range)

'Nécessite l 'ajoute de la bibliothèque suivante :
'"Microsoft Activex Data Object 2.x librairy"
' ET
'"Microsoft Dao 3.6 Objects librairy"

'Extrait les données de plusieurs classeurs d'un même
'répertoire en prenant pour acquis que les données ont
'la même structure. Le nom de la première feuille est
'obtenue par la fonction "FirstExcelSheetName"

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String
Dim file As String, C As Integer, Ok As Integer
Dim ModeCalcul As String

'Extrait le premier fichier du répertoire
file = Dir(Chemin & "*.xls")

ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Do While file <> ""
'Exclure le classeur où sont copiées les données
'pour ne pas dédoubler les data...

If Chemin & Rg.Parent.Parent.Name <> Chemin & file Then
'Identifier la cellule supérieur de gauche
'où seront copiées les données
If Rg(1, 1) = "" Then
Set Rg = Rg(1, 1)
Else
Set Rg = Rg.EntireColumn.Find(What:="*", LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Offset(1) Ok = 1
End If

'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & file & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'détermine le nom de la première feuille du classeur
NomFeuille = FirstExcelSheetName(Chemin & file)

'Détermine la requête à être exécuté
Requete = "SELECT * From [" & NomFeuille & "]"

'Exécution de la requête
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie le nom des champs du recordset vers Excel
'dans le cas du premier classeur seulement
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
'Copie le recordset vers Excel
Rg.Offset(1).CopyFromRecordset Rst
Else
'Copie le recordset vers Excel
Rg.CopyFromRecordset Rst
End If
'Ferme le recordset et la connection
Rst.Close: Conn.Close
'Passe au classeur suivant
file = Dir()
Else
'Passe au classeur suivant si le fichier
'où sont copiées les données est le même
'que celui qui est traité dans cette sub.
file = Dir()
End If
Loop
Application.EnableEvents = True
Application.Calculation = ModeCalcul
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'------------------------------------------
Function FirstExcelSheetName(Fichier As String)
'"Microsoft Dao 3.6 Objects librairy"
Dim XlDb As DAO.Database
Dim TbL As DAO.TableDef
Set XlDb = OpenDatabase(Fichier, False, True, "Excel 8.0;")
FirstExcelSheetName = XlDb.TableDefs(0).Name
XlDb.Close: Set XlDb = Nothing
End Function
'------------------------------------------
================================================== >>


"Circé" Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui
de 156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr




Circé
Le #5161431
Bonsoir,

Ayé !!! 'ai trouvé le pourquoi du comment !!!


La première colonne des fichiers est une colonne de dates. Or, la
manière dont ont été saisies jusqu'à présent les dates, c'était du
n'importe quoi ! Il y avait des vraies dates et des "fausses" dates,
type "T2 2007".

J'ai mis de vraies dates reconnues par Excel dans toute la colonne de
tous les fichiers, et la magie a opéré !

Quand ces fichiers fonctionneront en prod, le problème ne se posera
plus, car ils seront obligatoirement remplis via un formulaire qui
impose des formats.

Ce que tu viens de dire confirme ce que j'ai fini par trouver, même si
ça reste encore assez flou pour moi.
Je vais regarder ça de près demain, sachant que j'avais repéré que des
cellules remplies de texte étaient restées blanches à l'importation.

Certains champs ne devant pas être obligatoirement saisis, penses-tu
que je risque des problème de ce côté là ?

En tous les cas, je te remercie pour l'intérêt que tu portes à ce
problème.

Circé
http://faqword.free.fr


MichDenis a exposé le 18/02/2008 :
Ado fonctionne bien si tes tableaux en Excel sont bâtis un peu
à la manière d'une table d'une base de données

Les colonnes ont un étiquette de colonne (pas nécessaire mais il faut
en tenir compte dans la chaîne de connexion : dans la ligne de code
qui suit de la procédure : Yes = étiquette de colonne , si c'était No
il y aurait absence d'étiquettes de colonnes.
"Extended Properties=""Excel 8.0;HDR=YES;"""

Habituellement chaque colonne doit contenir des données de même type.
De mémoire, ADO utilise les 8 premières lignes du champ (colonne) pour
déterminer le type de données de la colonne. Un problème "D'OUBLI" de
data survient si ADO évalue le type comme étant "String" et qu'il y a
quelques données numériques ...L'inverse est vrai aussi.




"Circé" Alors, j'ai testé avec tes fichiers : ça
marche

J'ai mis 5 de mes fichiers à la place des tiens, et j'en ai récupéré
seulement 3 dont l'un incomplet.
Sans compter que je récupère les entêtes et numéros de colonnes.

Mes fichiers seraient-ils trop compliqués ? Ils sont tous 45 colonnes
mais le nombre de lignes n'est pas très important : ça va de 25 à 150.

Quant à la solution d'Isabelle, c'était en fait ce que je voulais
éviter : ouvrir chaque fichier et copier/coller... il me semble que ça
va rallonger le temps d'exécution !

Circé
http://faqword.free.fr

MichDenis a formulé ce lundi :
Ceci est à télécharger : http://cjoint.com/?csqKZSD0J1

Dans ce fichier zip, il y a 4 fichiers.
3 classeurs : classeur1.xls , classeur2.xls, Classeur3.xls
Dans chaque classeur, 4 colonnes de données (les mêmes ;-) )

Dans le 4 ième fichier, la macro.

Placer ces 4 fichiers dans un répertoire où seulement ces fichiers
seront présents et exécuter la macro du classeur "FichierExécution.xls"

P.S. Les bibliothèques chargés dans le classeur FichierExécution sont :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"

Est-ce que cela ne fonctionne toujours pas ?





"Circé" Bonjour !

MichDenis a couché sur son écran :
Je publie à nouveau la réponse que j'avais faite pour ceux que l'aventure
intéresse !


Et quelle aventure !!! :s

Est-ce que la structure des données est la même dans chaque classeur ?


Strictement la même.
D'ailleurs, pour faire ces tests, je suis partie d'un fichier d'environ
300 lignes que j'ai scindé en plusieurs morceaux.

Le fichier dont seulement une partie des données est importé, Comment ces
dernières sont-elles disponsées ? Celles qui sont importées, Celles qui
sont omises? De quel type de données s'agit-il ? Numérique, texte, date ...


En fait c'est très aléatoire et on dirait qu'il y a comme une
limitation du nombre de lignes.
Par exemple un classeur tout seul de 25 lignes est bien importé. Ce
même classeur, dès lors qu'il se trouve en présence d'un autre n'est
plus importé...
Quand je mets le plus gros classeur (156 lignes) tout seul, pas de
soucis. S'il y en a d'autres, seul le gros classeur est importé...

Et les dispositions des données du classeur oublié, qu'ont-elles de
spéciales ?


Comme je t'ai dit, il ne s'agit pas de certaines données qui sont
oubliées... Cela dépendrait plutôt du nombre de classeurs et de leur
nombre de lignes.
D'ailleurs, j'ai testé avec deux fichiers identiques (un original et
une copie), et un seul est importé.

J'avais à l'origine testé cette procédure sur des classeurs qui avaient
exactement la même structure et n'avait éprouvé aucun problème !

As-tu des plages nommées dans tes classeurs ? Quelles différences il y a
-t-il entre une classeur où l'importatiion réussie ou échoue ?


Dans chaque classeur, il y a une plage nommée (pour les données) via
une formule DECALER.

Il est très difficile se solutionner la question que tu poses sans pouivoir
procéder à des tests.

Tu as toujours l'option d'exécuter cette procédure "pas à pas" en utilisant
la touche F8 Au fur et à mesure qu'elle progresse, tu vérifies si la teneur
des différentes variables correspond bien à ce que tu devrais obtenir.


J'ai exécuté la macro en pas à pas, ça ne me donne pas grand chose...
J'avais mis deux fichiers, la boucle les a bien passé en revue tous les
deux, mais seul les données de l'un ont été insérées.

Bonne chance.


C'est mal parti pour la chance ! :s

Circé


================================================== >>> Requiert les bibliothèques :
'"Microsoft Dao 3.6 Objects librairy"
'"Microsoft Activex Data Object 2.x librairy"
Version 2.8 de préférence sinon mettre à jour le MDAC
chez microsoft

Toutes les feuilles de données sont réputées avoir
une ligne d'étiquette définissant les champs de la table.

Ne pas oublier de déclarer les bibliothèques mentionnées
dans la procédure : "Extraire_Data_First_Excel_Sheet"


'------------------------------------------
Sub Test()
'Appel d'une procédure ayant 2 paramêtres
'A ) Répertoire à scanner
'Ne pas oublier le "" à la fin comme dans "c:AAA"

'B ) 'L'adresse de la première cellule du coin supérieur
'gauche où seront copiées les données recueillies
'Différente syntaxe possible d'indiquer la cellule
'à partir de laquelle seront copiés les résultats.

'----------1----------
'Même classeur que la procédure, dans la Feuil2
'Extraire_Data_First_Excel_Sheet "c:AAA", _
ThisWorkbook.Worksheets("Feuil2").Range("G10")

'-----------2----------
'Autre classeur ouvert que celui de la procédure
Extraire_Data_First_Excel_Sheet "c:AAA", _
Workbooks("Classeur2").Worksheets("Feuil2").Range("G10")

''-----------3----------
'Dans la feuille active du classeur actif au
'moment de lancer la procédure
' Extraire_Data_First_Excel_Sheet "c:AAA", Range("G10")

End Sub
'------------------------------------------

Sub Extraire_Data_First_Excel_Sheet(Chemin As String, Rg As Range)

'Nécessite l 'ajoute de la bibliothèque suivante :
'"Microsoft Activex Data Object 2.x librairy"
' ET
'"Microsoft Dao 3.6 Objects librairy"

'Extrait les données de plusieurs classeurs d'un même
'répertoire en prenant pour acquis que les données ont
'la même structure. Le nom de la première feuille est
'obtenue par la fonction "FirstExcelSheetName"

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomFeuille As String
Dim file As String, C As Integer, Ok As Integer
Dim ModeCalcul As String

'Extrait le premier fichier du répertoire
file = Dir(Chemin & "*.xls")

ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Do While file <> ""
'Exclure le classeur où sont copiées les données
'pour ne pas dédoubler les data...

If Chemin & Rg.Parent.Parent.Name <> Chemin & file Then
'Identifier la cellule supérieur de gauche
'où seront copiées les données
If Rg(1, 1) = "" Then
Set Rg = Rg(1, 1)
Else
Set Rg = Rg.EntireColumn.Find(What:="*", LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Offset(1) Ok = 1
End If

'établir la connection avec le fichier...
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & file & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'détermine le nom de la première feuille du classeur
NomFeuille = FirstExcelSheetName(Chemin & file)

'Détermine la requête à être exécuté
Requete = "SELECT * From [" & NomFeuille & "]"

'Exécution de la requête
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie le nom des champs du recordset vers Excel
'dans le cas du premier classeur seulement
If Ok <> 1 Then
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
'Copie le recordset vers Excel
Rg.Offset(1).CopyFromRecordset Rst
Else
'Copie le recordset vers Excel
Rg.CopyFromRecordset Rst
End If
'Ferme le recordset et la connection
Rst.Close: Conn.Close
'Passe au classeur suivant
file = Dir()
Else
'Passe au classeur suivant si le fichier
'où sont copiées les données est le même
'que celui qui est traité dans cette sub.
file = Dir()
End If
Loop
Application.EnableEvents = True
Application.Calculation = ModeCalcul
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'------------------------------------------
Function FirstExcelSheetName(Fichier As String)
'"Microsoft Dao 3.6 Objects librairy"
Dim XlDb As DAO.Database
Dim TbL As DAO.TableDef
Set XlDb = OpenDatabase(Fichier, False, True, "Excel 8.0;")
FirstExcelSheetName = XlDb.TableDefs(0).Name
XlDb.Close: Set XlDb = Nothing
End Function
'------------------------------------------
================================================== >>>


"Circé" Bonjour,

Avec l'aide de MichDenis, j'ai une macro qui utilise ADO pour importer
le contenu d'une feuille de différents classiers, dans un fichier
destinataire.
Quand je dis l'aide de MichDenis, autant dire qu'il a fait complètement
cette macro, tellement moi j'y comprends rien à ADO...

Les petits tests étaient très concluants, mais maintenant que je suis
censée mettre cette macro en prod, je me rends compte que ce n'est pas
si concluant que ça ! (grosse grimace...)

Aussi, je pose la question : quelles sont les limites d'ADO dans cette
fonction ?
Car j'ai du mal à faire une syntbèse de ce qui ne va pas, mais ce qui
est certain c'est que tous les fichiers ne sont pas importés, et
pourtant il ne s'agit pas de grosses quantités de données.

Tests :
- 4 fichiers d'un total de 145 lignes de données dans le dossier source
=> seuls 3 fichiers sont importés, avec 94 lignes de données au lieu de
106 au total pour ces 3 classeurs...

- 1 seul fichier de 156 lignes = OK, tout est importé

- 2 fichiers dont celui de 156 lignes et un de 27 lignes : seul celui
de 156 lignes est importé...

Bref, je n'y comprends rien ! Donc Au secours !!!!!!!!!!!!!!!!!!!!

Circé
http://faqword.free.fr






MichDenis
Le #5161371
| Certains champs ne devant pas être obligatoirement saisis, penses-tu
| que je risque des problème de ce côté là ?

ça ne devrait pas causer de problème ! même que sur une feuille, la colonne
peut être vide sauf pour l'étiquette et cela devrait fonctionner... c'est surtout
le format de cellule et le type de données qu'il faut surveiller.




"Circé" Bonsoir,

Ayé !!! 'ai trouvé le pourquoi du comment !!!


La première colonne des fichiers est une colonne de dates. Or, la
manière dont ont été saisies jusqu'à présent les dates, c'était du
n'importe quoi ! Il y avait des vraies dates et des "fausses" dates,
type "T2 2007".

J'ai mis de vraies dates reconnues par Excel dans toute la colonne de
tous les fichiers, et la magie a opéré !

Quand ces fichiers fonctionneront en prod, le problème ne se posera
plus, car ils seront obligatoirement remplis via un formulaire qui
impose des formats.

Ce que tu viens de dire confirme ce que j'ai fini par trouver, même si
ça reste encore assez flou pour moi.
Je vais regarder ça de près demain, sachant que j'avais repéré que des
cellules remplies de texte étaient restées blanches à l'importation.

Certains champs ne devant pas être obligatoirement saisis, penses-tu
que je risque des problème de ce côté là ?

En tous les cas, je te remercie pour l'intérêt que tu portes à ce
problème.

Circé
http://faqword.free.fr
Publicité
Poster une réponse
Anonyme