Lancer toutes les connexions "ActiveWorkbook.Connections" [Résolu]

pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 21 nov. 2017 à 19:16 - Dernière réponse : pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention
- 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


Afficher la suite 
218Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention

22 réponses

Répondre au sujet
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - Modifié par yg_be le 21/11/2017 à 19:36
0
Utile
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.
Commenter la réponse de yg_be
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 21 nov. 2017 à 20:39
0
Utile
1
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 ?
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 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
Commenter la réponse de pascalou83400
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 21 nov. 2017 à 21:12
0
Utile
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

 
Commenter la réponse de yg_be
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 21 nov. 2017 à 21:49
0
Utile
1
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...
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 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
Commenter la réponse de pascalou83400
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 22 nov. 2017 à 08:41
0
Utile
1
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.
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 22 nov. 2017 à 09:28
peux-tu partager ton fichier?
Commenter la réponse de pascalou83400
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 22 nov. 2017 à 10:50
0
Utile
Tu vas encore prendre peur ...

Merci pour ton aide.

http://www.cjoint.com/c/GKwjWS4mrFX
Commenter la réponse de pascalou83400
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 22 nov. 2017 à 11:12
0
Utile
Fichier avec les modules que je souhaite mettre avant ma boucle, tout comme module1.creerlien

http://www.cjoint.com/c/GKwkj1BMiSX
Commenter la réponse de pascalou83400
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 22 nov. 2017 à 21:25
0
Utile
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
Commenter la réponse de yg_be
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 23 nov. 2017 à 19:54
0
Utile
1
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.
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 23 nov. 2017 à 20:04
hier matin, tu écrivais "l'actualisation ne se fait pas".
l'actualisation se fait-elle maintenant?
Commenter la réponse de pascalou83400
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 23 nov. 2017 à 20:18
0
Utile
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.
Commenter la réponse de pascalou83400
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 23 nov. 2017 à 20:29
0
Utile
1
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 ?
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 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.
Commenter la réponse de pascalou83400
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 23 nov. 2017 à 21:53
0
Utile
1
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.
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 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.
Commenter la réponse de pascalou83400
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 23 nov. 2017 à 21:57
0
Utile
1
heu je ne comprends pas ta question ?
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 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?
Commenter la réponse de pascalou83400
thev 1689 Messages postés lundi 7 avril 2008Date d'inscription 11 décembre 2017 Dernière intervention - Modifié par thev le 24/11/2017 à 09:38
0
Utile
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.

 
Commenter la réponse de thev
pascalou83400 218 Messages postés dimanche 20 juillet 2014Date d'inscription 3 décembre 2017 Dernière intervention - 30 nov. 2017 à 09:12
0
Utile
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
Commenter la réponse de pascalou83400