Lancer toutes les connexions "ActiveWorkbook.Connections"

Résolu/Fermé
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022 - 21 nov. 2017 à 19:16
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022 - 30 nov. 2017 à 09:12
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

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 21 nov. 2017 à 19:36
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
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
21 nov. 2017 à 20:39
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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
21 nov. 2017 à 21:06
"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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
21 nov. 2017 à 21:12
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
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
21 nov. 2017 à 21:49
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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
21 nov. 2017 à 22:25
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

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

Posez votre question
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
22 nov. 2017 à 08:41
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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
22 nov. 2017 à 09:28
peux-tu partager ton fichier?
0
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
22 nov. 2017 à 10:50
Tu vas encore prendre peur ...

Merci pour ton aide.

https://www.cjoint.com/c/GKwjWS4mrFX
0
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
22 nov. 2017 à 11:12
Fichier avec les modules que je souhaite mettre avant ma boucle, tout comme module1.creerlien

https://www.cjoint.com/c/GKwkj1BMiSX
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
22 nov. 2017 à 21:25
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
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
23 nov. 2017 à 19:54
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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
23 nov. 2017 à 20:04
hier matin, tu écrivais "l'actualisation ne se fait pas".
l'actualisation se fait-elle maintenant?
0
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
23 nov. 2017 à 20:18
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
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
23 nov. 2017 à 20:29
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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
23 nov. 2017 à 21:44
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
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
23 nov. 2017 à 21:53
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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
23 nov. 2017 à 21:55
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
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
23 nov. 2017 à 21:57
heu je ne comprends pas ta question ?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
25 nov. 2017 à 10:24
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
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié le 24 nov. 2017 à 09:38
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
pascalou83400 Messages postés 273 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 24 janvier 2022
30 nov. 2017 à 09:12
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