Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 11/03/2010, 16h15   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 50
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 50
Points : 11
Points : 11
Par défaut Contrôle d'état d'une requête Web

Bonjour à tous. Je viens vers vous pour savoir s'il est possible de contrôler l'achèvement ou non de la mise à jour d'une requête web.

J'explique mon problème. J'ai un classeur dynamique qui actualise les données en provenance du web. Ensuite j'ai une macro qui met en forme ces données. Mon problème, c'est que si l'utilisateur clique sur le bouton avant l'achèvement de l'actualisation, ben il se trouve avec une erreur...

J'ai essayé sans succès un if sur un refresh all du genre :

Code :
If ActiveWorkbook.RefreshAll = OK Then
mais je me doutais du résultat ! Avez-vous des idées ? Merci d'avance.
willyol3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 18h41   #2
Membre expérimenté
 
Inscription : décembre 2006
Messages : 610
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 610
Points : 556
Points : 556
Envoyer un message via Skype™ à ESVBA
Par défaut bonsoir willyol3,

je ne comprends pas le but de ton code...


Je ne sais pas comment tester la fin de la requête Web mais :
  • Comment se fait la mise à jour des cellules ?
  • Connait-on la dernière cellule remplie ?
Si oui, un code du genre :

Code :
1
2
3
4
5
6
7
8
'Si une cellule de la feuille change exécute le code suivant 
Private Sub Worksheet_Change(ByVal Target As Range)
            'Si la dernière cellule changée est "AV123", la dernière mise à jour par le Web alors
            If Target = "$AV:$123" Then 
                  'Active le bouton pour lancer la mise en forme
                  CmdButtonMiseEnForme.Enabled = True
            End If
End Sub
Et il faudra placer au départ de la requête Web un code désactivant le bouton de mise en forme.

Non testé car je m'avance sans connaitre le problème.

ESVBA
ESVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 21h07   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 50
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 50
Points : 11
Points : 11
Salut ESVBA, merci de t'intéresser à mon problème.

Je t'explique plus précisément le problème. En fait mon classeur est composé de trois feuilles. Deux feuilles en dynamique (l'intégralité des données sont récupérées par une requête web sur serveur). Ensuite j'ai une macro de traitement et mise en forme de ces données sur la dernière feuille.

J'ai laissé l'activation automatique de l'actualisation des données à chaque ouverture du fichier. Ca prend environ 5-10 secondes, ca dépend.

Le problème, c'est que si tu n'y penses plus (ce qui arrive malheureusement souvent) et que tu cliques sur le bouton avant que le rafraichissement ait lieu, ben la macro fait le travail pour rien. Et t'es obligé de recommencer. Pour éviter ce problème et tu l'as bien compris, ce serait d'activer le bouton uniquement quand l'actualisation est terminée.

Ton idée est remarquable, je n'y avais pas songé. Mais je ne connais malheureusement jamais la dernière ligne des deux feuilles en dynamique. Donc difficile à effectuer.

Concernant le code (bidon je te l'avoue) c'était de savoir s'il existe une possibilité de tester la fin de l'actualisation. Comme l'actualisation fonctionne par un bon vieux ActiveWorkbook.RefreshAll, je me disais qu'il y'avait possibilité de tester cette fonction, mais je confirme que non.

Je testerai cependant un truc auquel je viens de penser. A la limite, je désactive l'actualisation automatique au démarrage. Je la lance dans ma macro en faisant ActiveWorkbook.RefreshAll en début de code et après seulement je call ma macro de mise en forme. En espérant que ma macro de mise en forme attende la fin de l'actualisation...
willyol3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2010, 21h34   #4
Membre expérimenté
 
Inscription : décembre 2006
Messages : 610
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 610
Points : 556
Points : 556
Envoyer un message via Skype™ à ESVBA
Par défaut bonsoir willyol3 et le forum,

question certainement idiode :

Citation:
je présume que la mise en forme ne peut pas se faire avec la mise en forme conditionnelle ?

Il faudrait un évènement du type "Ne fait plus de calcul" ou "ne change plus".

Une solution pour réaliser une machine à gaz :
  • tout bloquer (boutons, menus...),
  • affecter un boolean sur ON pour mise à jour au chargement de la feuille
  • lancer minuterie sur un userform (invisible) avec timer
  • lancer le "refreshall"
  • si toutes les secondes la cellule cible n'est plus la même c'est encore la mise à jour
  • sinon mettre boolean de mise à jour sur Off pour enfin gérer l'évènement "_change".

ESVBA

Dernière modification par ESVBA ; 15/03/2010 à 21h46.
ESVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 03h16.


 
 
 
 
Partenaires

Hébergement Web