OVH Cloud OVH Cloud

Lecturre ds classeur fermé et ADO

7 réponses
Avatar
JohnFuss
Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un classeur
fermé, par contre je veux lire dans une feuille comportant des espaces,
est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.

7 réponses

Avatar
michdenis
Bonjour John,

Oui c'est possible, voici une façon de faire :

' la requête : observe la plage des guillements simples
entre les crochets.

dim Feuille as string, Sql as String
Feuille = "Nom De La Feuille"

Sql = "SELECT * FROM ['" & Feuille & "$'];"


Salutations!



"JohnFuss" a écrit dans le message de news: dr5kgo$nuu$
Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un classeur
fermé, par contre je veux lire dans une feuille comportant des espaces,
est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.
Avatar
JohnFuss
Je ne m'en sors pas, il me fait une erreur de syntaxe avec les "'" en plus,
mon code marche bien avec des noms de feuilles sans espaces, je n'arrive pas
à faire fonctionner le tiens qu'il y ai des espaces ou non.

si tu as un exemple complet (les miens proviennent de chez Frederic
Sigonneau) je suis preneur.

John

"michdenis" a écrit dans le message de
news:u%
Bonjour John,

Oui c'est possible, voici une façon de faire :

' la requête : observe la plage des guillements simples
entre les crochets.

dim Feuille as string, Sql as String
Feuille = "Nom De La Feuille"

Sql = "SELECT * FROM ['" & Feuille & "$'];"


Salutations!



"JohnFuss" a écrit dans le message de news:
dr5kgo$nuu$

Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un
classeur

fermé, par contre je veux lire dans une feuille comportant des espaces,
est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.





Avatar
Michel Pierron
Bonjour John;

Function ReadRange(sFile$, sRng$, Optional shName$, Optional bHeaders As
Boolean)
Dim wCon As ADODB.Connection, rsW As ADODB.Recordset
Dim lField&, Result, Headers, sCon$
On Error GoTo 1
sCon = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sFile
Set wCon = New ADODB.Connection
wCon.Open sCon
If Len(shName) Then
Set rsW = wCon.Execute("Select * from " & Chr(34) _
& shName & "$" & sRng & Chr$(34))
Else
Set rsW = wCon.Execute("Select * from " & sRng)
End If
If rsW.EOF Then
ReDim Headers(0 To 0, 0 To rsW.Fields.Count - 1)
For lField = 0 To rsW.Fields.Count - 1
Headers(0, lField) = rsW.Fields(lField).Name
Next
ReadRange = Headers
Else
If bHeaders Then
Result = rsW.GetRows
ReDim Headers(0 To rsW.Fields.Count - 1, 0 To 0)
For lField = 0 To rsW.Fields.Count - 1
Headers(lField, 0) = rsW.Fields(lField).Name
Next
ReadRange = Array(Headers, Result)
Else
ReadRange = rsW.GetRows
End If
End If
1: rsW.Close: wCon.Close
Set rsW = Nothing: Set wCon = Nothing
If Err Then ReadRange = Err.Description
End Function

Sub TestExemple()
Dim CellValues, vCell
CellValues = ReadRange("C:book1.xls", "A1:B2", "Feuille 1")
If IsArray(CellValues) Then
For Each vCell In CellValues
Debug.Print vCell
Next
End If
End Sub

MP

"JohnFuss" a écrit dans le message de news:
dr5kgo$nuu$
Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un
classeur

fermé, par contre je veux lire dans une feuille comportant des espaces,
est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.




Avatar
michdenis
Bonjour John,

voici un exemple, la feuille d'où les données sont importée
s'appelle "Nom Feuille".

En fait, il y a diverses situations qui peuvent se présenter
et selon ta requête, la syntaxe est différente et ce même
si la feuille d'origine des données possède un espace :

Voici différente syntaxe de la requête possible :

La Syntaxe d'hier : Tu importes tout le contenu de la feuille
Dim Feuille As String
Feuille = "Nom Feuille"
'Observe les guillemets simples à l'intérieur des crochets
Sql = "SELECT * FROM ['" & Feuille & "$'];"

L'exemple complet utilise une syntaxe où la requête doit
importer une étendue bien définie de la feuille source des
données. Et dans la syntaxe de la requête, il n'y a pas
de guillemets simples.

'------------------------------------
Sub MaRequêteAvecADO()

'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 et sont placées sur la même feuille.

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, Feuille As String, Rg As Range
Dim File As String, C As Integer, Ok As Integer
Dim Chemin As String, Plage As Range

Feuille = "Nom Feuille" 'A déterminer
Chemin = "C:" 'Chemin du fichier
File = "Classeur1.xls" 'à déterminer"
'exemple de plage que tu veux importer du classeur fermé.
Set Plage = Range("A1:B10")

'La requête qui sera exécutée ' `a déterminer
Requete = "SELECT * FROM [" & Feuille & "$" & Plage.Address(0, 0) & "]"

'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Quote")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)

End If
End With

'é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;"""

Rst.Open Requete, Conn, adOpenStatic, adLockReadOnly

'Copie les étiquettes du recordset vers Excel
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count

'Copie les data du recordset vers la feuille résultat
Rg.Offset(1).CopyFromRecordset Rst

'Ferme le recordset et la connexion
Rst.Close: Conn.Close
'LIbère la mémoire des objets
Set Rst = Nothing: Set Conn = Nothing
Set Rg = Nothing
End Sub
'------------------------------------


Salutations!







"JohnFuss" a écrit dans le message de news: dr7g3q$l6u$
Je ne m'en sors pas, il me fait une erreur de syntaxe avec les "'" en plus,
mon code marche bien avec des noms de feuilles sans espaces, je n'arrive pas
à faire fonctionner le tiens qu'il y ai des espaces ou non.

si tu as un exemple complet (les miens proviennent de chez Frederic
Sigonneau) je suis preneur.

John

"michdenis" a écrit dans le message de
news:u%
Bonjour John,

Oui c'est possible, voici une façon de faire :

' la requête : observe la plage des guillements simples
entre les crochets.

dim Feuille as string, Sql as String
Feuille = "Nom De La Feuille"

Sql = "SELECT * FROM ['" & Feuille & "$'];"


Salutations!



"JohnFuss" a écrit dans le message de news:
dr5kgo$nuu$

Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un
classeur

fermé, par contre je veux lire dans une feuille comportant des espaces,
est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.





Avatar
JohnFuss
bonjour Michel,

décidement je ne m'en sors pas, le Select ne passe pas, pourrais-je abuser
en envoyant par mail 2 classeurs pour me dire ce qui ne va pas ?

Merci d'avance.

John


"Michel Pierron" a écrit dans le message de
news:
Bonjour John;

Function ReadRange(sFile$, sRng$, Optional shName$, Optional bHeaders As
Boolean)
Dim wCon As ADODB.Connection, rsW As ADODB.Recordset
Dim lField&, Result, Headers, sCon$
On Error GoTo 1
sCon = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sFile
Set wCon = New ADODB.Connection
wCon.Open sCon
If Len(shName) Then
Set rsW = wCon.Execute("Select * from " & Chr(34) _
& shName & "$" & sRng & Chr$(34))
Else
Set rsW = wCon.Execute("Select * from " & sRng)
End If
If rsW.EOF Then
ReDim Headers(0 To 0, 0 To rsW.Fields.Count - 1)
For lField = 0 To rsW.Fields.Count - 1
Headers(0, lField) = rsW.Fields(lField).Name
Next
ReadRange = Headers
Else
If bHeaders Then
Result = rsW.GetRows
ReDim Headers(0 To rsW.Fields.Count - 1, 0 To 0)
For lField = 0 To rsW.Fields.Count - 1
Headers(lField, 0) = rsW.Fields(lField).Name
Next
ReadRange = Array(Headers, Result)
Else
ReadRange = rsW.GetRows
End If
End If
1: rsW.Close: wCon.Close
Set rsW = Nothing: Set wCon = Nothing
If Err Then ReadRange = Err.Description
End Function

Sub TestExemple()
Dim CellValues, vCell
CellValues = ReadRange("C:book1.xls", "A1:B2", "Feuille 1")
If IsArray(CellValues) Then
For Each vCell In CellValues
Debug.Print vCell
Next
End If
End Sub

MP

"JohnFuss" a écrit dans le message de news:
dr5kgo$nuu$
Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un
classeur

fermé, par contre je veux lire dans une feuille comportant des espaces,
est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.








Avatar
Michel Pierron
Bonsoir John;
Pas de soucis, fais péter dans ma boîte e-mail.
A+
MP

"JohnFuss" a écrit dans le message de news:
drauh4$h3u$
bonjour Michel,

décidement je ne m'en sors pas, le Select ne passe pas, pourrais-je abuser
en envoyant par mail 2 classeurs pour me dire ce qui ne va pas ?

Merci d'avance.

John


"Michel Pierron" a écrit dans le message de
news:
Bonjour John;

Function ReadRange(sFile$, sRng$, Optional shName$, Optional bHeaders As
Boolean)
Dim wCon As ADODB.Connection, rsW As ADODB.Recordset
Dim lField&, Result, Headers, sCon$
On Error GoTo 1
sCon = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sFile
Set wCon = New ADODB.Connection
wCon.Open sCon
If Len(shName) Then
Set rsW = wCon.Execute("Select * from " & Chr(34) _
& shName & "$" & sRng & Chr$(34))
Else
Set rsW = wCon.Execute("Select * from " & sRng)
End If
If rsW.EOF Then
ReDim Headers(0 To 0, 0 To rsW.Fields.Count - 1)
For lField = 0 To rsW.Fields.Count - 1
Headers(0, lField) = rsW.Fields(lField).Name
Next
ReadRange = Headers
Else
If bHeaders Then
Result = rsW.GetRows
ReDim Headers(0 To rsW.Fields.Count - 1, 0 To 0)
For lField = 0 To rsW.Fields.Count - 1
Headers(lField, 0) = rsW.Fields(lField).Name
Next
ReadRange = Array(Headers, Result)
Else
ReadRange = rsW.GetRows
End If
End If
1: rsW.Close: wCon.Close
Set rsW = Nothing: Set wCon = Nothing
If Err Then ReadRange = Err.Description
End Function

Sub TestExemple()
Dim CellValues, vCell
CellValues = ReadRange("C:book1.xls", "A1:B2", "Feuille 1")
If IsArray(CellValues) Then
For Each vCell In CellValues
Debug.Print vCell
Next
End If
End Sub

MP

"JohnFuss" a écrit dans le message de news:
dr5kgo$nuu$
Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un
classeur

fermé, par contre je veux lire dans une feuille comportant des
espaces,



est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.












Avatar
JohnFuss
Le problème provennait d'un caractère 'interdit' pour ce genre de manip,
dans mon cas 1 "."

Merci beaucoup Michel.

John

"Michel Pierron" a écrit dans le message de
news:
Bonsoir John;
Pas de soucis, fais péter dans ma boîte e-mail.
A+
MP

"JohnFuss" a écrit dans le message de news:
drauh4$h3u$
bonjour Michel,

décidement je ne m'en sors pas, le Select ne passe pas, pourrais-je
abuser


en envoyant par mail 2 classeurs pour me dire ce qui ne va pas ?

Merci d'avance.

John


"Michel Pierron" a écrit dans le message de
news:
Bonjour John;

Function ReadRange(sFile$, sRng$, Optional shName$, Optional bHeaders
As



Boolean)
Dim wCon As ADODB.Connection, rsW As ADODB.Recordset
Dim lField&, Result, Headers, sCon$
On Error GoTo 1
sCon = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" &
sFile



Set wCon = New ADODB.Connection
wCon.Open sCon
If Len(shName) Then
Set rsW = wCon.Execute("Select * from " & Chr(34) _
& shName & "$" & sRng & Chr$(34))
Else
Set rsW = wCon.Execute("Select * from " & sRng)
End If
If rsW.EOF Then
ReDim Headers(0 To 0, 0 To rsW.Fields.Count - 1)
For lField = 0 To rsW.Fields.Count - 1
Headers(0, lField) = rsW.Fields(lField).Name
Next
ReadRange = Headers
Else
If bHeaders Then
Result = rsW.GetRows
ReDim Headers(0 To rsW.Fields.Count - 1, 0 To 0)
For lField = 0 To rsW.Fields.Count - 1
Headers(lField, 0) = rsW.Fields(lField).Name
Next
ReadRange = Array(Headers, Result)
Else
ReadRange = rsW.GetRows
End If
End If
1: rsW.Close: wCon.Close
Set rsW = Nothing: Set wCon = Nothing
If Err Then ReadRange = Err.Description
End Function

Sub TestExemple()
Dim CellValues, vCell
CellValues = ReadRange("C:book1.xls", "A1:B2", "Feuille 1")
If IsArray(CellValues) Then
For Each vCell In CellValues
Debug.Print vCell
Next
End If
End Sub

MP

"JohnFuss" a écrit dans le message de news:
dr5kgo$nuu$
Bonjour à tous,

les exemples de codes ne manquent pas pour lire des données dans un
classeur

fermé, par contre je veux lire dans une feuille comportant des
espaces,



est-ce possible (j'y arrive pas) ?

Merci d'avance.

John.