Useform à maintenir au premier plan
Bonjour à toutes et à tous,
Je vous explique le contexte de mon problème :
- J'ai fait une macro sur un classeur Excel qui me permet d'ouvrir un classeur remplie de données, sélectionner des valeurs suivant plusieurs critères puis de les copier/coller dans mon classeur avant de fermer le classeur de données. La macro fait donc plusieurs aller/retours entre les 2 classeurs et l'affichage à l'écran est un peu chaotique ! J'ai donc figer l'affichage avec application.screenUpdating = False pour gagner en temps d'exécution.
J'ai voulu améliorer un peu ma macro et permettre l'affichage d'une barre de chargement (la macro prend un peu de temps à être exécutée).
J'ai donc créé une useform évoluant en fonction de l'avancement de la macro.
Cependant, et mon problème arrive ici, la useform ne cesse de passer du premier à l'arrière plan malgré le screenUpdating mis sur False.
Existe t'il une solution pour maintenir ma useform au premier plan durant le processus ?
Merci à vous,
Bonjour Clacla et bienvenu, bonjour le forum,
Il serait bon de voir, au pire, ton code, au mieux, les deux fichiers et le code pour voir si on peut optimiser et éviter ton problème...
Bonjour ThauThème,
Bien sur, l'idée est donc de faire apparaitre la useform suivante (reprise sur un tuto) :
Dans la quelle j'ai rentré le code suivant :
Le principe étant de faire varier la taille de barreChargement en fonction d'une variable, la dite variable étant l'avancé de 0 à 100 taux. La valeur du label évolue également selon la même variable.
J'ai ensuite "fait grandir" taux dans ma macro de copié/coller afin de simuler la progression tout en appelant actualiser(nouveauxTaux) à certains points du code.
Quelques exemples de ma macro :
- On a ici mon classeur que je renomme result et le classeur contenant les données à aller chercher dont le chemin d'accès est contenu dans ma liste nommée FichierBAO.
Charg est la variable qui va représenter l'avancé du chargement en %
J'appelle ensuite ma une forme pour l'afficher et actualiser
- Par la suite le code évolue de cette façon :
Puis je finis mon code par :
A 100 ma useform se ferme toute seule.
Seulement voila, pendant la boucle, j'aimerai que la useform reste visible tout du long, ce qui n'est pas le cas puisqu'elle ne cesse de passer en arrière plan et se fait donc cacher pas la feuille excel.
J'espère être clair, n'hésitez pas à demander plus de précisions le cas échéant
Re,
Désolé, je ne travaille pas sur PhotoChope je peux donc rien faire de tes captures d'écran. Le site te permet de copier/coller le code formaté grâce aux balise </>...
Re, autant pour moi, je reprend le message précédant :
Bien sur, l'idée est donc de faire apparaitre la useform suivante (reprise sur un tuto) :
Dans la quelle j'ai rentré le code suivant :
Sub afficher()
Me.Show 0
End Sub
Sub actualiser(taux As Integer)
barreChargement.Width = barreTexte.Width * taux / 100
barreTexte = taux & "%"
If taux = 100 Then Unload Me
End SubLe principe étant de faire varier la taille de barreChargement en fonction d'une variable, la dite variable étant l'avancé de 0 à 100 taux. La valeur du label évolue également selon la même variable.
J'ai ensuite "fait grandir" taux dans ma macro de copié/coller afin de simuler la progression tout en appelant actualiser(nouveauxTaux) à certains points du code.
Quelques exemples de ma macro :
- On a ici mon classeur que je renomme result et le classeur contenant les données à aller chercher dont le chemin d'accès est contenu dans ma liste nommée FichierBAO.
Charg est la variable qui va représenter l'avancé du chargement en %
J'appelle ensuite ma une forme pour l'afficher et actualiser
Private Sub Import1_Click()
Formulaire_import_BAO.Hide
Application.ScreenUpdating = False
Dim i As Byte, c As Byte
Dim charg As Integer
Dim BAO As Workbook, result As Workbook
Dim m() As Range
Dim Charlie As String
Set result = ThisWorkbook
Set BAO = Workbooks.Open(Filename:=FichierBao.List(0), local:=True)
c = 0
charg = 1
barreProgression.afficher
barreProgression.actualiser (charg)- Par la suite le code évolue de cette façon :
i = 1
préco:
For i = i To UBound(m) 'm contenant les limites des ranges que je veux copier, les ranges ont été rentrées plus tot
BAO.Activate
If Left(m(i).Offset(1, 0), 17) = "Modification : Sc" Then GoTo Scénario 'une vérification me permettant de passer à létapes suivante
BAO.Sheets(1).Range(m(i), m(i + 1).Offset(-1, 8)).Select 'je sélectionne la range
Selection.Copy
Windows(result.Name).Activate
Workbooks(result.Name).Worksheets("P" & i).Visible = True 'j'affiche la sheet "P" & i
Workbooks(result.Name).Worksheets("P" & i).Activate
Range("BD101").Select '
ActiveSheet.Paste 'Je colle les valeurs
Application.CutCopyMode = False 'je vide le cache
charg = 50 + CInt(i) 'Ici, je vais simuler l'avancé de la barre de chargement (de façon douteuse et pas préçise, l'objectif est visuel)
barreProgression.actualiser (charg) 'je réactualise
Next i
Scénario:
For i = i To UBound(m) 'meme chose que l'étape d'avantPuis je finis mon code par :
Workbooks(BAO.Name).Close
barreProgression.actualiser (90)
Windows(result.Name).Activate
Workbooks(result.Name).Worksheets("Start").Activate 'je me replace sur la feuille d'où l'utilisateur a lancé la macro
barreProgression.actualiser (100)
Application.ScreenUpdating = True
End SubA 100 ma useform se ferme toute seule.
Seulement voila, pendant la boucle, j'aimerai que la useform reste visible tout du long, ce qui n'est pas le cas puisqu'elle ne cesse de passer en arrière plan et se fait donc cacher pas la feuille excel.
J'espère être clair, n'hésitez pas à demander plus de précisions le cas échéant
Re,
Génial ! je vient tout juste de recevoir ma commande sur AmasdeZone ! Un tireur des vers du nez dernier cri... Ça va m'être bien pratique...
Bon, tout ça pour dire :
Le code complet et en une seule fois de la macro Import, c'est possible ?!... Mieux ! Le fichier pour éviter de perdre du temps, de l'énergie et d'étrenner ma commande...