Lancer toutes les connexions "ActiveWorkbook.Connections"

Résolu
pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention   -  
pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je cherche à lancer toutes les connexions d'un classeur automatiquement, ce code fonctionnera sur plusieurs classeurs indépendant, mais pas avec les mêmes noms de requête.
Donc j'imagine qu'il y a possibilité de lancer les requêtes sans préciser le nom ?

Merci.

Pascal

la macro ressemble à ça :

Sub donneeslgi()
'
' donneeslgi Macro
'

'
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA232").Refresh
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA2321"). _
Refresh
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA2321111"). _
Refresh
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA23211111"). _
Refresh
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA232111111"). _
Refresh
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA2321111111"). _
Refresh
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA23211111111") _
.Refresh
ActiveWorkbook.Connections("Lancer la requête à partir de PALMACEA232111111111" _
).Refresh
ActiveWorkbook.Connections( _
"Lancer la requête à partir de PALMACEA2321111111111").Refresh
End Sub

15 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    je pense que ceci va le faire pour tout le classeur dans lequel se trouve le code:
    Dim ws As Worksheet
    Dim qt As QueryTable
    For Each ws In ThisWorkbook.Worksheets
        For Each qt In ws.QueryTables
            qt.Refresh
        Next qt
    Next ws

    il est possible de l'adapter si cela doit être fait sur d'autres classeurs.
    0
  2. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonsoir yg_be,

    Merci pour ton aide, j'ai mis le code dans un module et celui ne fonctionne pas.

    j'ai rajouté
    Sub
    end sub

    j'ai oublié qq chose ?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      "ne fonctionne pas" = ?
      et ainsi?
      Sub refreshallqt()
      Dim wb As Workbook
      Dim ws As Worksheet
      Dim qt As QueryTable
      Dim nqt As Integer, tnqt As Integer
      
      Set wb = ThisWorkbook
      MsgBox "Il y a " & CStr(wb.Connections.Count) & " connection(s) dans le fichier " & wb.Path
      tnqt = 0
      For Each ws In wb.Worksheets
          nqt = 0
          For Each qt In ws.QueryTables
              qt.Refresh
              nqt = nqt + 1
          Next qt
          If nqt > 0 Then
              MsgBox CStr(nqt) & " refresh dans " & ws.Name
          End If
          tnqt = tnqt + nqt
      Next ws
      MsgBox "On a fait " & CStr(tnqt) & " refresh dans le fichier " & wb.Path
      End Sub
      0
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    ou ainsi?
    Sub refreshallcn()
    Dim wb As Workbook
    Dim cns As Connections
    Dim cn As WorkbookConnection
    
    Set wb = ThisWorkbook
    Set cns = wb.Connections
    For Each cn In cns
        cn.Refresh
    Next cn
    End Sub
    

     
    0
  4. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci yg_be

    Le 2eme code fonctionne, mais comment je peux mettre une temporisation de 3 minutes le temps que le connexion finisse, car j'ai mis cette macro dans ma boucle avec appel du module avant ma boucle.

    Hum je ne sais pas si c'est bien clair...
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      et ainsi?
      Dim ws As Worksheet
      Dim qt As QueryTable
      For Each ws In ThisWorkbook.Worksheets
          For Each qt In ws.QueryTables
              qt.BackgroundQuery = False
              qt.Refresh
          Next qt
      Next ws
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour yg_be,

    Merci pour ton code.

    BackgroundQuery = False

    permet d'attendre l'actualisation et après la boucle va démarrer, si j'ai bien compris ?

    Je viens de faire un essai, mais l'actualisation ne se fait pas.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      peux-tu partager ton fichier?
      0
  7. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Fichier avec les modules que je souhaite mettre avant ma boucle, tout comme module1.creerlien

    https://www.cjoint.com/c/GKwkj1BMiSX
    0
  8. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    je propose ceci (pas vraiment testé):
    Sub refreshallcn()
    Dim wb As Workbook
    Dim cns As Connections
    Dim cn As WorkbookConnection
    
    Set wb = ThisWorkbook
    Set cns = wb.Connections
    For Each cn In cns
        If Not IsEmpty(cn.ODBCConnection) Then
            cn.ODBCConnection.BackgroundQuery = False
            cn.ODBCConnection.Refresh
        Else
            cn.Refresh
        End If
    Next cn
    End Sub
    0
  9. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonsoir yg_be,

    J'ai fait des essais, mais je ne sais pas si le code démarre pendant l'actualisation, je ne sais pas comment le voir ?

    Bonne soirée.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      hier matin, tu écrivais "l'actualisation ne se fait pas".
      l'actualisation se fait-elle maintenant?
      0
  10. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonsoir yg_be,

    Oui le dernier fais bien l'actualisation, mais je ne sais pas comment être sur qu'il soit bien fini avant le démarrage de la boucle et je ne sais pas comment je peux le contrôler.
    0
  11. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Comment je peux mettre un Msgbox pour me dire module5.actualisation fini et un autre pour me dire module2.effaceleslignes commence, comme ça je vois si cela se fait l'un après l'autre.

    Ça vaut quoi cette idée ?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je ne vois pas trop comment deux sub pourraient tourner en même temps.
      je pense que tu veux vérifier que l'actualisation ne se fait pas en arrière-plan, en parallèle avec l'exécution des sub.
      ne peux-tu pas te convaincre sur base du temps pris par l'exécution de la sub d'actualisation? ou bien elle va très vite, car elle ne fait presque rine, ou bien elle est ralentie par chaque refresh.
      0
  12. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    oui c'est ça :

    je veux vérifier que l'actualisation ne se fait pas en arrière-plan, en parallèle avec l'exécution des sub.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      ne peux-tu pas te convaincre sur base du temps pris par l'exécution de la sub d'actualisation? ou bien elle va très vite, car elle ne fait presque rien, ou bien elle est ralentie par chaque refresh.
      0
  13. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    heu je ne comprends pas ta question ?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      tu te demandes en fait si chaque commande refresh attend que l'actualisation soit finie, ou bien si le code continue et que l'actualisation se fait en parallèle avec l'exécution du code. c'est bien cela?
      ne peux-tu pas vérifier cela simplement en regardant si le code s'exécute très vite, ou bien si il prend beaucoup de temps?
      0
  14. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724
     
    Bonjour Pascalou93400,

    je pense que tu devrais insérer l'instruction "Doevents" après le lancement de l'actualisation. Cette instruction devrait suspendre l'exécution du code tant que l'actualisation n'est pas terminée.

    0
  15. pascalou83400 Messages postés 285 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour yg_be,

    Merci pour ton code, j'ai fini par le mettre à part pour le faire tourner, car je pense qu'il empiétait sur le code.

    Bonne journée.

    Pascal
    0