Maintenir connexion ODBC (vba)
Utilisateur anonyme
-
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis un novice en VBA, j'aimerais savoir si on peut maintenir une connexion ODBC (vers un serveur à distance) lorsque le Workbook est ouvert, envoyer des requêtes et a la fermeture seulement (du workbook ou d'Excel), se déconnecter de la base de données.
Je voudrais faire ça car j'ai deux requêtes à la suite à faire, le temps d'exécution doit être inférieur (ou égal) à une seconde (pour des questions de confort).
Celles ci sont très légères mais chaque requête prend en moyenne 4 secondes, l'affichage est donc bien lent.
J'ai par la suite vu que la cause de ce ralentissement résultait du fait qu'on se connectait à la base de données avant chaque requête (puis on se déconnectait).
Si quelqu'un à la réponse, je le remercie d'avance :)
Cordialement,
Je suis un novice en VBA, j'aimerais savoir si on peut maintenir une connexion ODBC (vers un serveur à distance) lorsque le Workbook est ouvert, envoyer des requêtes et a la fermeture seulement (du workbook ou d'Excel), se déconnecter de la base de données.
Je voudrais faire ça car j'ai deux requêtes à la suite à faire, le temps d'exécution doit être inférieur (ou égal) à une seconde (pour des questions de confort).
Celles ci sont très légères mais chaque requête prend en moyenne 4 secondes, l'affichage est donc bien lent.
J'ai par la suite vu que la cause de ce ralentissement résultait du fait qu'on se connectait à la base de données avant chaque requête (puis on se déconnectait).
Si quelqu'un à la réponse, je le remercie d'avance :)
Cordialement,
3 réponses
-
Bonjour,
Sans voir le code et sans connaitre le contexte (nombre et caractéristiques des données importées, des champs de données, du nombre de lignes...), il parait difficile de formuler une réponse
-
Hum, je vous l'accorde.
Sub Macro1() ' ' Macro1 Macro ' Application.DisplayAlerts = False With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _ "ODBC;DATABASE=BDD;DSN=TEST;UID=TEST;;", Destination:=Range( _ "$A$1")).QueryTable .CommandText = Array( _ "SELECT Reference, EnStock, Stockage, Qutite, PieceNo, QteReserve" & Chr(13) & "" & Chr(10) & "FROM STOCK STOCK" & Chr(13) & "" & Chr(10) & "WHERE (Reference='012345" _ , "0')") .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .ListObject.DisplayName = _ "Tableau_Lancer_la_requête_à_partir_de_BDD" .Refresh BackgroundQuery:=False End With End Sub
Voila, macro générée par Excel, si on ne peut pas parvenir à maintenir la connexion de cette manière, c'est pas grave, je veux juste que le résultat final soit affiché dans un tableau sur une feuille (comme ici) -
cela parait difficile d'améliorer la vitesse
on peut quand m^me ajouter cette ligne en début de macroApplication.screnupdating=False
mais ce sera minime
Si tu emploies displayalert, il faut fermer à la fin
application.displaualerts=True
bien que je ne vois pas l'utilité de displayalerts dans ce code, non le supprimer
quant à la déconnexion, la base étant sur le serveur, cela permet l'accès à d'autres si la database du type fichier (et non client serveur) comme par exemple Access
Michel