Bonjour,
suite à un problème récent de la même veine, je complète ce sujet en clarifiant la connexion ADO (ActiveX Data Objects)
étant quelque peu fautif et pourrait aussi servir de sujet référence pour des questions similaires …
Deux méthodes possibles de déclaration de variable objet : la liaison anticipée et la liaison tardive.
La liaison anticipée (Early Binding), avant toute intervention sur un objet au moyen d'une variable objet,
associe le type exact de l'objet en question à la variable objet s'y référant via l'instruction Dim
encore faut-il ajouter une librairie aux Références du projet (via le menu Outils) …
Avantages : exécution un peu plus rapide car pas d'ambiguïté vis à vis d'une variable objet générique,
le pré-compilateur sachant d'avance à quoi s'attendre, tout est prêt au moment de l'exécution;
conservation de l'IntelliSense au cours de la rédaction du code (Complément automatique des instructions des Options Éditeur),
dès le point tapé contre le nom d'un objet, la liste de ses méthodes & propriétés associées s'affichant automatiquement …
Mais si le nom exact de la librairie à activer est inconnu, impossible donc de déclarer la variable objet en liaison anticipée !
Qui plus est selon la version d'Excel ou du système d'exploitation, les librairies peuvent changer, nuisant ainsi à la portabilité du projet.
Dans ces cas, la liaison tardive (Late Binding) s'impose de facto …
Mea Culpa F22Raptor car dans mon code du 26/7 j'ai réussi à effectuer un pont entre ces deux méthodes
avec une liaison tardive tout en ayant l'obligation d'activer la référence d'une librairie !
Certainement par trop pressé, cela arrive quand on veut boucler la semaine en menant plusieurs fronts à la fois …
Conservant la problématique de ce sujet, les codes à suivre sont en liaison anticipée car la référence à activer
reste la même en version 2003 comme en 2007 d'Excel. La liaison tardive va aussi être abordée …
◙ Premier cas : connexion ADO pour accéder à un fichier fermé .xls (format antérieur à la version 2007)
indifféremment en version 2003 ou 2007 d'Excel (version remaniée du 26/7) :
Code :
- ' Référence à cocher : Microsoft ActiveX Data Objects 6.1 Library
-
- Function Actions(Rg As Range) As Currency
- Dim Cnx As New ADODB.Connection, Rst As New ADODB.Recordset
- Application.Volatile
-
- F$ = "D:\Tests\Test2 .xls": If Dir(F) = "" Then Exit Function
- D$ = IIf(Rg.Count > 1, Rg, Range(Rg, Cells(Rows.Count, Rg.Column))).Address(0, 0)
-
- Cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & F & _
- ";Extended Properties=""Excel 8.0;HDR=No;"";"
-
- Set Rst = Cnx.Execute("SELECT * FROM [Feuil1$" & D & "]" )
- Actions = Application.Sum(Application.Index(Rst.GetRows, 0))
- Rst.Close: Set Rst = Nothing
- Cnx.Close: Set Cnx = Nothing
- End Function
-
-
- Private Sub TestADO()
- Debug.Print Actions([G11])
- End Sub
|
En ligne n°13, Feuil1 représente le nom de la feuille de calcul du classeur fermé, le $ le séparant de la plage de cellules …
◙ Voici comment passer en liaison tardive quelle que soit la version d'Excel, en cas de souci par exemple pour activer la référence :
→ Insérer avant la ligne n°10 cette ligne : Set Cnx = CreateObject("ADODB.Connection" )
→ Supprimer la ligne n°4 Dim puis les lignes n°1 & 2 …
◙ Second cas : connexion ADO pour accéder à un classeur fermé .xlsx à partir d'Excel 2007 :
Code :
- ' Référence à cocher : Microsoft ActiveX Data Objects 6.1 Library
-
- Function Actions(Rg As Range) As Currency
- Dim Cnx As New ADODB.Connection, Rst As New ADODB.Recordset
- Application.Volatile
-
- F$ = "D:\Tests\Test2 .xlsx": If Dir(F) = "" Then Exit Function
- D$ = IIf(Rg.Count > 1, Rg, Range(Rg, Cells(Rows.Count, Rg.Column))).Address(0, 0)
-
- Cnx.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & F & _
- ";Extended Properties=""Excel 12.0;HDR=No;"";"
-
- Set Rst = Cnx.Execute("SELECT * FROM [Feuil1$" & D & "]" )
- Actions = Application.Sum(Application.Index(Rst.GetRows, 0))
- Rst.Close: Set Rst = Nothing
- Cnx.Close: Set Cnx = Nothing
- End Function
-
-
- Private Sub TestADO()
- Debug.Print Actions([G11])
- End Sub
|
Seule la commande de connexion change par rapport au cas précédent (lignes n°10-11) …
Je ne sais pourquoi fin juillet j'ai essuyé un échec lors de mon test en liaison anticipée sur Excel 2007,
je croyais ne pas utiliser la bonne référence mais, comme déjà évoqué, je n'avais guère le temps …
Bonus : cette connexion fonctionne aussi avec les classeurs .xls antérieurs à Excel 2007,
la préférer donc sous Excel 2007, une seule connexion quel que soit le type de classeur !
◙ Astuce : par défaut, Excel 2003 ne peut ouvrir les classeurs .xlsx de la version 2007.
C'est devenu possible grâce au Pack de compatibilité Microsoft Office 2007 !
Et pour le second cas ci-dessus de la connexion ADO, c'est aussi possible grâce
au Pilote d'Office System 2007 des composants de connectivité des données !
(lien déjà donné fin juillet mais cette fois-ci en version française)
Excel 2003, ainsi mis à jour, un message prévient de la conversion en cours lors de l'ouverture d'un classeur .xlsx …
Il n'y a pas de message lors de la connexion ADO avec un tel classeur,
elle est juste quelque peu ralentie le temps de la conversion mais cela fonctionne !
Toutefois certainement dans les limites du nombre de lignes et de colonnes d'une feuille d'un classeur d'Excel 2003 …
Message édité par Marc L le 23-09-2013 à 09:55:29