Form avec fonction en background

  • Initiateur de la discussion Initiateur de la discussion klm1234
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

klm1234

XLDnaute Nouveau
Bonjour tout le monde!

J'ai développé une macro qui permet de vérifier plusieurs critères sur une ligne cependant cette macro est relativement longue (1 a 2 minutes). J'ai donc intégrer (du moins j'essaye) un form avec une barre de progression (progressbar) qui évolue au fur et a mesure que les critères sont vérifiés.

La structure de mon programme va comme suit :
-Routine d'approbation de la ligne qui fait appelle a une fonction "ValidateForm" (ou "form" veut dire "la ligne du code produit sélectionné", à ne pas confondre avec les Forms de excel)
-Fonction "ValidateForm" qui fait appelle a "ValidationProgress" (fenetre avec une barre de progression toute bête).

Le problème est que je voudrais faire tourner ma fonction "ValidateForm" en arrière pendant que la fenetre "ValidationProgress" est affichée et que celle-ci se mette à jour suite aux actions de la fonction...

Je joindrai bien un fichier d'exemple mais étant donné que ce code inclut beaucoup de fonction personnalisé, le fichier serait trop gros... Je vais donc tenter d'inclure les bouts de code que j'ai fait qui pourrait être utile au débogage de ma macro!

Code de la fenetre "ValidationProgress" :
Code:
Option Explicit

Private Sub UserForm_Initialize()
    With Me.ProgressBar1
        .Min = 0
        .Max = 60
        .Value = 0
    End With
End Sub

Exemple du code de la fonction "ValidateForm":
Code:
Public Function ValidateForm(ByVal prcode$) As Boolean

    Dim i As Integer
    Dim ValidationProgress As New ValidattionProgress
    
    Application.ScreenUpdating = True
    
    On Error GoTo ErrorHandle
    ValidationProgress.Show

        'Check Customer
    If Range(Finder(prcode)).Offset(0, -3).Value = "" Then
        Range(Finder(prcode)).Offset(0, -3).Select
        MsgBox "No customer name specified.", vbExclamation, "Error - Unvalid form"
           ValidateForm = False
        Exit Function
    Else ValidationProgress.ProgressBar1.Value = 1
    End If
    
        'Check CNumber
    If Range(Finder(prcode)).Offset(0, -2).Value = "" Then
        Range(Finder(prcode)).Offset(0, -2).Select
        MsgBox "No customer number specified.", vbExclamation, "Error - Unvalid form"
            ValidateForm = False
        Exit Function
    Else: ValidationProgress.ProgressBar1.Value = 2
    End If

'Une soixantaine de tests similaire s'exécutent ensuite...

    ValidateForm = True
    ValidationProgress.Hide
    Exit Function

ErrorHandle:
    MsgBox "An unhandled error occured in ValidateForm().", vbCritical, "Error"

End Function

Voilà si quelqu'un pouvait m'aider ce serait très apprecié 🙂
J'ai vu des exemples où il y avait une routine qui roulait en arrière de l'USF de progression en utilisant la commande Call "sous-routine", seulement moi déjà c'est pas une routine c'est une fonction, et si j'appelle une fonction qui fait apparaitre l'USF qui appelle la fonction qui... Vous avez compris. J'espère que je n'ai pas été trop vague, desfois quand on veut mettre trop de détails c'est comme en mettre pas assez...

Merci beaucoup!
 
Re : Form avec fonction en background

Je me demande également pourquoi c'est aussi long mais bon, desfois les critères sont assez complexes, dans le genre :

Code:
    If ((Range("AB" & Range(Finder(prcode)).Row).Value = "" And Range("AC" & Range(Finder(prcode)).Row).Value = "" And Range("AD" & Range(Finder(prcode)).Row).Value = "") And (Range("AG" & Range(Finder(prcode)).Offset(0, 29).Row).Value = "" And Range("AH" & Range(Finder(prcode)).Offset(0, 29).Row).Value = "" And Range("AI" & Range(Finder(prcode)).Offset(0, 29).Row).Value = "")) Then
        Range(Finder(prcode)).Offset(0, 24).Select
        MsgBox "Error : At least one FWHM or FBG Length specification must be filled.", vbExclamation, "Error - Unvalid form"
            ValidateForm = False
        Exit Function
    ElseIf ((Range("AB" & Range(Finder(prcode)).Row).Value <> "" And Range("AC" & Range(Finder(prcode)).Row).Value <> "") Or (Range("AB" & Range(Finder(prcode)).Row).Value <> "" And Range("AD" & Range(Finder(prcode)).Row).Value <> "") Or (Range("AC" & Range(Finder(prcode)).Row).Value <> "" And Range("AD" & Range(Finder(prcode)).Row).Value <> "")) And ((Range("AG" & Range(Finder(prcode)).Row).Value <> "" And Range("AH" & Range(Finder(prcode)).Row).Value <> "") Or (Range("AG" & Range(Finder(prcode)).Row).Value <> "" And Range("AI" & Range(Finder(prcode)).Row).Value <> "") Or (Range("AH" & Range(Finder(prcode)).Row).Value <> "" And Range("AI" & Range(Finder(prcode)).Row).Value <> "")) Then
        Range(Finder(prcode)).Offset(0, 24).Select
        MsgBox "Error : Too much parameters specified. You can't specify two parameters for the FWHM and two parameters for the FBG length. You will be able to specify only one parameter for a category when two or more parameters are specified for the other one.", vbExclamation, "Error - Unvalid form"
            ValidateForm = False
        Exit Function
    End If

... du coup je me dit que c'est peut-être normal?
Je ne suis pas un expert en VBA, mais un mec qui s'y connait pas mal avait fait un projet dans le même genre et sa vérification prenait également du temps, du coup je me dis que mon code n'est peut-être pas si mal que sa.

PS : Pour mon premier problème je l'ai réglé, il suffit de déclarer l'USF non-modal, tout bêtement avec "ValidationProgress.Show False",
Cependant maintenant mon USF est tout bizarre, la barre de progression évolue mais tout le reste est blanc, à part la barre de titre, des idées de la provenance du problème??

Merci encore!
 
Re : Form avec fonction en background

Re,

je me dis que mon code n'est peut-être pas si mal que sa.

Oui c'est même assez rare ici de voir un code bien ecrit comme le tient. Il ne s'agissait pas du tout de cela mais plus du choix de la forme de contrôle à mettre en place qui pourrait prendre moins longtemps.

Quant à ta deuxième question. Avec vbModeLess, le Userform n'a pas le temps de s'afficher complètement qu'excel est occupé ailleurs.

Essaie dans la procédure UserForm_Activate de mettre:

Code:
Me.Repaint

Ou juste après l'appel au UserForm:

Code:
ValidationProgress.Show VbModeLess
ValidationProgress.Repaint

Sans garantie.

A+
 
Re : Form avec fonction en background

Bonjour tout le monde!

Pu...nèse mromain, tu as réglé tout mes problèmes de délai! Moi qui croyait que sa allait jouer "un peu"... Maintenant la macro s'exécute en un clignement de cil! Je vais pouvoir me la péter devant le programmeur de la compagnie 😉

Du coup je n'ai plus trop besoin de cet USF avec la barre de progression, mais je me suis quand même penché sur le sujet et j'ai reglé tout les problèmes, donc pour ceux que sa intéresse :

Pour ouvrir un USF tout en continuant d'éxecuter une macro en arrière :
Code:
"Nom de l'USF".Show vbModeless

Pour que l'USF se mette à jour (sinon il est tout blanc et c'est moche), rajouter juste après la commande précédente :
Code:
DoEvents

Voilà!
Merci encore tout le monde 🙂


Edit : @Hasco, je n'avais pas vue ton message, effectivement ".repaint" marche également, je viens d'essayer, même comportement qu'avec "DoEvents"! 😉
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
157
Réponses
5
Affichages
237
Réponses
4
Affichages
464
Retour