Sélection d'enregistrements dans une plage nommée d'un fichier excel fermé

lucemm2004 Messages postés 6 Date d'inscription dimanche 4 mars 2007 Statut Membre Dernière intervention 5 décembre 2010 - 20 juil. 2009 à 08:50
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 21 juil. 2009 à 02:56
Bonjour à tous,

Je souhaite sélectionner des enregistrements spécifiques dans une plage d'un fichier excel fermé à partir d'une application écrite en vb6.
Cette plage est nommée (PgErr) dans mon code. Il s'agit d'un tableau de 8 colonnes sur plusieurs centaines de lignes.
A l'aide du code ci-dessous, quand le fichier excel est ouvert, tout fonctionne correctement, c'est à dire le sql avec la clause Where.
Quand le fichier excel est fermé, s'il n'y pas de clause Where dans le sql, je sais boucler sur tous les enregistrements.
Quand le fichier excel est fermé et que j'ai la clause Where dans le sql, le recordset est vide !!! alors que quand l'excel est ouvert, le meme sql me renvoie un jeu d'enregistrements.

Quelqu'un peut il me dire si c'est normal ou ce que je dois faire pour que ce sql avec le Where fonctionne aussi bien quand l'excel est ouvert ou fermé.

Merci pour votre éclairage.

Voici mon code :

Dim myConn As ADODB.Connection, myCmd As ADODB.Command
Dim HDR As String, myRS As ADODB.Recordset
Dim strConnectionString$, strPlage_Admin$, strPath$, strXls_Filename$, strSql$

strPath = "G:\work\excel\rapports"
strXls_Filename = "G:\work\excel\rapports\pg-inc.xls"

Set myConn = New ADODB.Connection
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strXls_Filename & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1;"""
myConn.Open strConnectionString

Set myCmd = New ADODB.Command
myCmd.ActiveConnection = myConn

strPlage_Admin = "PgErr"

myCmd.CommandText "SELECT * from `" & strPlage_Admin & "` Where Etalon '9201' and Appareil = '8300011471' order by De, à"

Set myRS = New ADODB.Recordset
myRS.Open myCmd, , adOpenKeyset, adLockOptimistic

Do While Not myRS.EOF
Debug.Print myRS!De & " - " & myRS!à
myRS.MoveNext
Loop
...

luc-emm

8 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 juil. 2009 à 10:28
Salut
Je ne suis pas habitué à cette technique sous Excel, mais une chose me titille : Les caractères ` que tu as utilisé pour encadrer le nom de ta table/range.
Essaye sans ce caractère
"SELECT * from " & strPlage_Admin & " Where ..."

Deuxième chose : Es-tu obligé de passer par un "Command" ?
Normalement, la fonction Open d'un RecordSet accepte une simple chaine en guise de commande (premier paramètre), exemple :
myRS.Open "Select * From Toto", myConn, adOpenKeyset, adLockOptimistic

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
lucemm2004 Messages postés 6 Date d'inscription dimanche 4 mars 2007 Statut Membre Dernière intervention 5 décembre 2010
20 juil. 2009 à 12:19
les caractères utilisés peuvent effectivement être supprimés.
cela ne change rien: avec excel fermé, sans la clause where, je sais boucler sur tous les records, avec le Where mon recordset est vide.
Si l'excel est ouvert, le sql avec le where me retourne bien les records souhaités.

en ADO, le commandtext est obligatoire.
le code que tu proposes génère une erreur.

merci de t'être penché sur mon problème.

luc-emm
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 juil. 2009 à 17:45
Si si, je viens de faire l'essai, ma syntaxe sans CMD fonctionne très bien, y compris avec un Where, que le fichier Excel soit ouvert ou fermé.
[*]Tu es bien sous VB6 ? (et pas dans le VBA d'un programme de Office)
[*]Aurais-tu un vilain "On Error Resume Next" dans cette Sub ?
[*]Si tu as une erreur, dis laquelle.
[*]Il y a bien un range nommé "PgErr" dans ta feuille ?
[*]As-tu plusieurs feuille dans ton classeur ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 juil. 2009 à 17:48
Essaye aussi d'encadrer le "à" par des crochets [ et ] car cette lettre avec accent n'existe pas dans toutes les pages de code :
and Appareil = '8300011471' order by De, [à]"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lucemm2004 Messages postés 6 Date d'inscription dimanche 4 mars 2007 Statut Membre Dernière intervention 5 décembre 2010
20 juil. 2009 à 18:28
- tu travailles en ADO ?
si je mets le sql simplement ds l'instruction Open, je reçois un message d'erreur.
- oui, je suis ds un pgm en vb6.
- j'ai une gestion d'erreur mais il ne passe pas par là. Mon code ne genere pas de message d'erreur, le probleme est qu'il retourne un recordset vide si l'excel est fermé.
-le range PgErr est bien present puisque qd l'excel est ouvert, mon recordset est bien implementé.
-j'ai pls feuilles ds l'excel. Le nom de la plage est unique. De nouveau pq aurais le bon resultat qd l'excel est ouvert et pas qd il est fermé.
- le <à> ne doit pas causer de soucis vu de nouveau que cela marche qd excel est ouvert.

- pourrais je voir le code complet que tu utilises pour realiser ce que je cherche à faire, merci. Cela m'intrigue.


luc-emm
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 juil. 2009 à 19:10
Le code que j'ai utilisé sous VB6 auquel j'ai ajouté la référence à "Microsoft ActiveX Data Objects 2.8 Library" (fichier Program files\Fichiers communs\System\ado\msado15.dll ) est le même que le tien, que j'ai adapté aux noms de mon Range (maBase) et des noms de mes colonnes (Nom et Prénom) dans le fichier Excel :
    Dim myConn As ADODB.Connection, myCmd As ADODB.Command
    Dim HDR As String, myRS As ADODB.Recordset
    Dim strConnectionString$, strPlage_Admin$, strPath$, strXls_Filename$, strSql$
    
    strPath = "C:"
    strXls_Filename = strPath & "Classeur1.xls"
    
    Set myConn = New ADODB.Connection
    strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strXls_Filename & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1;"""
    myConn.Open strConnectionString
    
    strPlage_Admin = "maBase"
    
    Set myRS = New ADODB.Recordset
    myRS.Open "SELECT * from " & strPlage_Admin & " Where Nom = 'b'", myConn, adOpenKeyset, adLockOptimistic
    
    Do While Not myRS.EOF
        Debug.Print myRS!Nom & " - " & myRS!Prénom
        myRS.MoveNext
    Loop

et je t'assure qu'il n'y a pas d'erreur.

[*] Quelle version de ADODB utilises-tu ?
[*] As-tu bien chargé le dernier correctif SP6 à VB6 ?

Si tes colonnes Etalon et Appareil ne comportent QUE des chiffres, tu peux aussi essayer de supprimer les ' qui encadrent les valeurs '9201' et '8300011471' donnés dans ton exemple :
Where Etalon 9201 and Appareil 8300011471

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
lucemm2004 Messages postés 6 Date d'inscription dimanche 4 mars 2007 Statut Membre Dernière intervention 5 décembre 2010
20 juil. 2009 à 19:25
merci Jack pour le détail de ta réponse.
entre temps, j'ai recréé un petit fichier excel, j'ai relancé mon code et tout a fonctionné correctement meme fichier excel fermé.
je dois investiguer de mon coté.

si cela t'interesse, j'ai qlqs fichiers textes presentant différentes manières de lire et d'écrire ds excel avec la méthode ado. qd on a bcp de fichiers ds lesquels on doit piocher, je trouve l'ado nettement plus rapide que getobject et createobject.
si tu me communiques ton email, je ne vois pas d'autres techniques, je te les enverrai.

un tout grand merci du temps que tu m'as accordé.

luc-emm
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 juil. 2009 à 02:56
Mais de rien, Luc
Cet échange m'a fait découvrir une méthode à laquelle je n'aurai pas pensé.
Aider les autres, c'est aussi s'instruire, la preuve
0
Rejoignez-nous