Maintenir connexion ODBC (vba)

Utilisateur anonyme -  
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,

3 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    0
  2. Utilisateur anonyme
     
    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)
    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    cela parait difficile d'améliorer la vitesse
    on peut quand m^me ajouter cette ligne en début de macro
    Application.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
    0