Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

BOGUE : Le pilote Microsoft.Jet.OLEDB ignore les paramètres FirstRowHasNames et Header

9 réponses
Avatar
isabelle
bonjour à tous,

voici le problème:

sur un fichier (fermé) http://cjoint.com/?DErjlx8nmev
il y a 2 plages de cellules nommées
la première est située en cellule A1:D6 - A1:D1 ont les titres de colonnes
la deuxième est située en cellule H5:J8 - H5:J5 ont les titres de colonnes

à l'aide de la macro suivante je récupère les données des 2 plages nommées
le problème se produit sur la plage1, les titres ne sont pas récupérés, seule
les titres de la plage2 sont récupérées.
2ème constatation si un champ de colonne est vide sur la plage1 (sans valeur) le
titre est récupéré


'__________________________________________________________________________________________
'http://support.microsoft.com/kb/257819
'http://support.microsoft.com/kb/257819/en-us
'http://support.microsoft.com/kb/288343/fr
'with header HDR=NO
'without header HDR=YES

Sub copy_cells_of_named_range_from_closed_workbook()
'Need to activate the reference Microsoft ADO ext x.x for DLL and Security
'Need to activate the reference Microsoft ActiveX Data Objects x.x Library
Dim cn As ADODB.Connection
Dim oCat As ADOX.Catalog
Dim oFile As String, Resultat As String
Dim oSheet As ADOX.Table
Dim named_range()
Dim i As Integer, n As Integer, rw As Long

oFile = "C:\MyFile.xlsm" 'adapt path

Set cn = New ADODB.Connection
Set oCat = New ADOX.Catalog

With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& oFile & ";Extended Properties=""Excel 12.0;HDR=NO;"""
.Open
End With

Set oCat.ActiveConnection = cn

For Each oSheet In oCat.Tables
If Not Right(oSheet.Name, 1) = "$" Then
ReDim Preserve named_range(n)
named_range(n) = oSheet.Name
n = n + 1
End If
Next

For i = LBound(named_range) To UBound(named_range)
rw = Cells(65000, 1).End(xlUp).Row + 1
Set rs = cn.Execute("SELECT * FROM " & named_range(i))
Cells(rw + 1, 1) = named_range(i) ' modify destination cell
Cells(rw + 2, 1).CopyFromRecordset rs ' modify destination cell
Next

Set oSheet = Nothing
Set oCat = Nothing
cn.Close
Set cn = Nothing
End Sub

'__________________________________________________________________________________________
isabelle

9 réponses

Avatar
DanielCo
Bonjour,
La première ligne d'un tableau est considérée comme des entêtes. Ce
n'est apparemment pas le cas si le tableau ne commence pas en ligne 1.
Pour ne pas récupérer les entêtes, spécifie HDR=YES :

.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=" _
& oFile & ";Extended Properties=""Excel 12.0;HDR=YES;"""

Daniel


bonjour à tous,

voici le problème:

sur un fichier (fermé) http://cjoint.com/?DErjlx8nmev
il y a 2 plages de cellules nommées
la première est située en cellule A1:D6 - A1:D1 ont les titres de colonnes
la deuxième est située en cellule H5:J8 - H5:J5 ont les titres de colonnes

à l'aide de la macro suivante je récupère les données des 2 plages nommées
le problème se produit sur la plage1, les titres ne sont pas récupérés, seule
les titres de la plage2 sont récupérées.
2ème constatation si un champ de colonne est vide sur la plage1 (sans valeur)
le titre est récupéré


'__________________________________________________________________________________________
'http://support.microsoft.com/kb/257819
'http://support.microsoft.com/kb/257819/en-us
'http://support.microsoft.com/kb/288343/fr
'with header HDR=NO
'without header HDR=YES

Sub copy_cells_of_named_range_from_closed_workbook()
'Need to activate the reference Microsoft ADO ext x.x for DLL and
Security
'Need to activate the reference Microsoft ActiveX Data Objects x.x
Library
Dim cn As ADODB.Connection
Dim oCat As ADOX.Catalog
Dim oFile As String, Resultat As String
Dim oSheet As ADOX.Table
Dim named_range()
Dim i As Integer, n As Integer, rw As Long

oFile = "C:MyFile.xlsm" 'adapt path

Set cn = New ADODB.Connection
Set oCat = New ADOX.Catalog

With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
_
& oFile & ";Extended Properties=""Excel 12.0;HDR=NO;"""
.Open
End With

Set oCat.ActiveConnection = cn

For Each oSheet In oCat.Tables
If Not Right(oSheet.Name, 1) = "$" Then
ReDim Preserve named_range(n)
named_range(n) = oSheet.Name
n = n + 1
End If
Next

For i = LBound(named_range) To UBound(named_range)
rw = Cells(65000, 1).End(xlUp).Row + 1
Set rs = cn.Execute("SELECT * FROM " & named_range(i))
Cells(rw + 1, 1) = named_range(i) ' modify destination cell
Cells(rw + 2, 1).CopyFromRecordset rs ' modify destination cell
Next

Set oSheet = Nothing
Set oCat = Nothing
cn.Close
Set cn = Nothing
End Sub

'__________________________________________________________________________________________
isabelle
Avatar
MichD
Bonjour Isabelle,

Ce n'est pas un bogue, ADO n'aime pas travailler de nuit!

;-))
Avatar
MichD
Bonjour,

Un fichier exemple + explication à l'intérieur :
http://cjoint.com/?DErpxhVODo7
Avatar
isabelle
bonjour Daniel,

merci pour ta réponse, mais bon but est surtout de montrer que le supposer
"Résolution" mentionné à cette adresse :
http://support.microsoft.com/kb/288343/fr ne fonctionne pas.
______________________________________________________________________________________________________________
Le HDR = paramètre est fonctionnel et disponible lorsque vous utilisez le
fournisseur Microsoft Jet OLE DB et le pilote ISAM Excel.
Par conséquent, la meilleure solution est d'utiliser le fournisseur Jet plutôt
que le pilote ODBC Excel.

Microsoft a confirmé qu'il s'agit d'un bogue dans les produits Microsoft
répertoriés au début de cet article.
______________________________________________________________________________________________________________

isabelle

Le 2014-05-17 05:41, DanielCo a écrit :
Bonjour,
La première ligne d'un tableau est considérée comme des entêtes. Ce n'est
apparemment pas le cas si le tableau ne commence pas en ligne 1. Pour ne pas
récupérer les entêtes, spécifie HDR=YES :

.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& oFile & ";Extended Properties=""Excel 12.0;HDR=YES;"""

Daniel


bonjour à tous,

voici le problème:

sur un fichier (fermé) http://cjoint.com/?DErjlx8nmev
il y a 2 plages de cellules nommées
la première est située en cellule A1:D6 - A1:D1 ont les titres de colonnes
la deuxième est située en cellule H5:J8 - H5:J5 ont les titres de colonnes

à l'aide de la macro suivante je récupère les données des 2 plages nommées
le problème se produit sur la plage1, les titres ne sont pas récupérés, seule
les titres de la plage2 sont récupérées.
2ème constatation si un champ de colonne est vide sur la plage1 (sans valeur)
le titre est récupéré


'__________________________________________________________________________________________

'http://support.microsoft.com/kb/257819
'http://support.microsoft.com/kb/257819/en-us
'http://support.microsoft.com/kb/288343/fr
'with header HDR=NO
'without header HDR=YES

Sub copy_cells_of_named_range_from_closed_workbook()
'Need to activate the reference Microsoft ADO ext x.x for DLL and Security
'Need to activate the reference Microsoft ActiveX Data Objects x.x Library
Dim cn As ADODB.Connection
Dim oCat As ADOX.Catalog
Dim oFile As String, Resultat As String
Dim oSheet As ADOX.Table
Dim named_range()
Dim i As Integer, n As Integer, rw As Long

oFile = "C:MyFile.xlsm" 'adapt path

Set cn = New ADODB.Connection
Set oCat = New ADOX.Catalog

With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& oFile & ";Extended Properties=""Excel 12.0;HDR=NO;"""
.Open
End With

Set oCat.ActiveConnection = cn

For Each oSheet In oCat.Tables
If Not Right(oSheet.Name, 1) = "$" Then
ReDim Preserve named_range(n)
named_range(n) = oSheet.Name
n = n + 1
End If
Next

For i = LBound(named_range) To UBound(named_range)
rw = Cells(65000, 1).End(xlUp).Row + 1
Set rs = cn.Execute("SELECT * FROM " & named_range(i))
Cells(rw + 1, 1) = named_range(i) ' modify destination cell
Cells(rw + 2, 1).CopyFromRecordset rs ' modify destination cell
Next

Set oSheet = Nothing
Set oCat = Nothing
cn.Close
Set cn = Nothing
End Sub

'__________________________________________________________________________________________

isabelle
Avatar
isabelle
bonjour Denis,

merci pour ta réponse, mais bon but est surtout de montrer que le supposer
"Résolution" mentionné à cette adresse :
http://support.microsoft.com/kb/288343/fr ne fonctionne pas.
______________________________________________________________________________________________________________
Le HDR = paramètre est fonctionnel et disponible lorsque vous utilisez le
fournisseur Microsoft Jet OLE DB et le pilote ISAM Excel.
Par conséquent, la meilleure solution est d'utiliser le fournisseur Jet plutôt
que le pilote ODBC Excel.

Microsoft a confirmé qu'il s'agit d'un bogue dans les produits Microsoft
répertoriés au début de cet article.
______________________________________________________________________________________________________________

isabelle

Le 2014-05-17 09:23, MichD a écrit :

Bonjour,

Un fichier exemple + explication à l'intérieur : http://cjoint.com/?DErpxhVODo7

Avatar
MichD
Bonjour Isabelle,

Je n'ai rien vu dans la question qui laissait sous-entendre que tu faisais
référence à un pilote ODBC Excel. Je n'ai pas ouvert ton fichier s'il
contenait
l'information, je ne l'ai pas vu!
Avatar
Michel__D
Bonjour,

Le 20/05/2014 19:26, isabelle a écrit :
bonjour Denis,

merci pour ta réponse, mais bon but est surtout de montrer que le supposer "Résolution"
mentionné à cette adresse : http://support.microsoft.com/kb/288343/fr ne fonctionne pas.
Le HDR = paramètre est fonctionnel et disponible lorsque vous utilisez le fournisseur Microsoft Jet OLE DB et le pilote ISAM Excel.
Par conséquent, la meilleure solution est d'utiliser le fournisseur Jet plutôt que le pilote ODBC Excel.

Microsoft a confirmé qu'il s'agit d'un bogue dans les produits Microsoft répertoriés au début de cet article.

isabelle



Hum, je crois plutôt que c'est la méthode .CopyFromRecordset qui en s'appuyant sur un objet Range (donc orienté excel)
provoque ce dysfonctionnement.

En parcourant le recorset j'ai bien le résultat énoncé à savoir avec HDR=NO j'ai la 1ère ligne et
avec HDR=YES je n'ai plus la 1ère ligne.

...
Dim rs As ADODB.Recordset
Dim oFld As ADODB.Field

For i = LBound(named_range) To UBound(named_range)
' rw = Cells(65000, 1).End(xlUp).Row + 1
Set rs = cn.Execute("SELECT * FROM " & named_range(i))

txt = ""
rs.MoveFirst
Do Until rs.Eof
For Each oFld In rs.Fields
txt = txt & oFld.Value & ";"
Next
rs.MoveNext
Loop
Debug.print txt

' Cells(rw + 1, 1) = named_range(i) ' modify destination cell
' Cells(rw + 2, 1).CopyFromRecordset rs ' modify destination cell
Next
...
Avatar
isabelle
le résultat (problème) est le même pour la plage nommée situer en cellule A1:D5
que HDR=NO ou à YES je ne récupère pas la première ligne

isabelle

Le 2014-05-21 13:18, Michel__D a écrit :

Hum, je crois plutôt que c'est la méthode .CopyFromRecordset qui en s'appuyant
sur un objet Range (donc orienté excel)
provoque ce dysfonctionnement.

En parcourant le recorset j'ai bien le résultat énoncé à savoir avec HDR=NO j'ai
la 1ère ligne et
avec HDR=YES je n'ai plus la 1ère ligne.

...
Dim rs As ADODB.Recordset
Dim oFld As ADODB.Field

For i = LBound(named_range) To UBound(named_range)
' rw = Cells(65000, 1).End(xlUp).Row + 1
Set rs = cn.Execute("SELECT * FROM " & named_range(i))

txt = ""
rs.MoveFirst
Do Until rs.Eof
For Each oFld In rs.Fields
txt = txt & oFld.Value & ";"
Next
rs.MoveNext
Loop
Debug.print txt

' Cells(rw + 1, 1) = named_range(i) ' modify destination cell
' Cells(rw + 2, 1).CopyFromRecordset rs ' modify destination cell
Next
...

Avatar
isabelle
oups: la plage nommée située

Le 2014-05-22 10:58, isabelle a écrit :
le résultat (problème) est le même pour la plage nommée situer en cellule A1:D5
que HDR=NO ou à YES je ne récupère pas la première ligne

isabelle