Form avec fonction en background

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!
 

klm1234

XLDnaute Nouveau
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!
 
G

Guest

Guest
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+
 

klm1234

XLDnaute Nouveau
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:

Discussions similaires

Statistiques des forums

Discussions
312 736
Messages
2 091 491
Membres
104 959
dernier inscrit
coché