[Résolu] optimisation de macro

Gilles52300

XLDnaute Junior
Bonjour,
j'ai crée ces macros, mais je pense qu'il est possible de les optimiser car je fais beaucoup de répétition.
Aussi j'aurais besoin de vos connaisances pour savoir si c'est possible et surtout comment faire car je n'arrive pas à trouver.
merci pour votre aide.
Les macros sont sur les modules 4 et 6.
je vous joints mon fichier en pièce jointe.
 

Pièces jointes

  • 2013 classeur béton (BETA3).xlsm
    162.6 KB · Affichages: 87
Dernière édition:

Yaloo

XLDnaute Barbatruc
Bonjour Gilles,

Pas sûr d'avoir tout compris, mais ce qu'il me semble :

Pour le module4 :
- Lorsque tu écris
GoTo Epreuve2
Epreuve2:
tu peux déjà supprimer
GoTo Epreuve2

- Lorsque tu mets
VB:
If NbreEprouvette1 > 0 Then
                          
                        'on colle les donnŽes de l'userform dans les cellules concernŽes
                        
                        .Range("B" & ii) = UserForm3.ComboBox7.Text                 'Client
                        .Range("I" & ii) = UserForm3.TextBox3.Text                      'RealisePar
                        .Range("J" & ii) = UserForm3.ComboBox10.Text                'LieuFabriq
                        .Range("AC" & ii) = UserForm3.ComboBox11.Text             'Fabriquant
                        .Range("H" & ii) = UserForm3.ComboBox9.Text                 'Serrage
                        .Range("G" & ii) = Eprouvette                                               'Eprouvette
                        .Range("S" & ii) = UserForm3.ComboBox12.Text                'Dosage
                        .Range("T" & ii) = UserForm3.TextBox9.Text                      'Lieu
                        .Range("U" & ii) = UserForm3.TextBox10.Text                    'Projet
                        .Range("V" & ii) = UserForm3.TextBox11.Text                   'Partie
                        .Range("C" & ii) = DateReception                                      'DateReception
                        .Range("F" & ii) = DatePrelevement - 0                                    'DatePrelevement
                        .Range("W" & ii) = Affaissement1                                      'Affaissement
                        .Range("K" & ii) = UserForm3.TextBox12.Text                   'N¡Eprouvette
                        .Range("L" & ii) = AgeEprouvette1                                       'AgeEprouvette
                            'dŽfinition de la rŽfŽrence
                             If Range("C" & ii - 1).Value = Range("C" & ii).Value Then
                                 .Range("A" & ii) = Range("A" & ii - 1) + "1"
                             End If
                             If Range("C" & ii - 1).Value <> Range("C" & ii).Value Then
                                 .Range("A" & ii) = Format(Range("C" & ii), "yymmdd" & "01")
                            End If
                    
                        If NbreEprouvette1 > 1 Then
                            'on colle les donnŽes de l'userform dans les cellules concernŽes
                            ii = ii + 1
                            .Range("B" & ii) = UserForm3.ComboBox7.Text                 'Client
                            .Range("I" & ii) = UserForm3.TextBox3.Text                      'RealisePar
                            .Range("J" & ii) = UserForm3.ComboBox10.Text                'LieuFabriq
                            .Range("AC" & ii) = UserForm3.ComboBox11.Text             'Fabriquant
                            .Range("H" & ii) = UserForm3.ComboBox9.Text                 'Serrage
                            .Range("G" & ii) = Eprouvette                                               'Eprouvette
                            .Range("S" & ii) = UserForm3.ComboBox12.Text                'Dosage
                            .Range("T" & ii) = UserForm3.TextBox9.Text                      'Lieu
                            .Range("U" & ii) = UserForm3.TextBox10.Text                    'Projet
                            .Range("V" & ii) = UserForm3.TextBox11.Text                   'Partie
                            .Range("C" & ii) = DateReception                                     'DateReception
                            .Range("F" & ii) = DatePrelevement - 0                                     'DatePrelevement
                            .Range("W" & ii) = Affaissement2                                     'Affaissement
                            .Range("K" & ii) = UserForm3.TextBox13.Text                 'N¡Eprouvette
                            .Range("L" & ii) = AgeEprouvette1                                       'AgeEprouvette
                                'dŽfinition de la rŽfŽrence
                                 If Range("C" & ii - 1).Value = Range("C" & ii).Value Then
                                     .Range("A" & ii) = Range("A" & ii - 1) + 1
                                 End If
                                 If Range("C" & ii - 1).Value <> Range("C" & ii).Value Then
                                     .Range("A" & ii) = Format(Range("C" & ii), "yymmdd" & "01")
                                End If
                                
                            If NbreEprouvette1 > 2 Then
                            ii = ii + 1
'etc...

Tu peux peut-être définir ton ii une bonne fois pour toute et n'avoir qu'une seule procédure.

Soit utiliser :
VB:
Select Case nbreeprouvette1
                      Case Is > 0: ii = ii
                      Case Else: ii = ii + 1
                    End Select
                        'on colle les donnŽes de l'userform dans les cellules concernŽes
                        
                        .Range("B" & ii) = UserForm3.ComboBox7.Text                 'Client
                        .Range("I" & ii) = UserForm3.TextBox3.Text                      'RealisePar
                        .Range("J" & ii) = UserForm3.ComboBox10.Text                'LieuFabriq
                        .Range("AC" & ii) = UserForm3.ComboBox11.Text             'Fabriquant
                        .Range("H" & ii) = UserForm3.ComboBox9.Text                 'Serrage
                        .Range("G" & ii) = Eprouvette                                               'Eprouvette
                        .Range("S" & ii) = UserForm3.ComboBox12.Text                'Dosage
                        .Range("T" & ii) = UserForm3.TextBox9.Text                      'Lieu
                        .Range("U" & ii) = UserForm3.TextBox10.Text                    'Projet
                        .Range("V" & ii) = UserForm3.TextBox11.Text                   'Partie
                        .Range("C" & ii) = DateReception                                      'DateReception
                        .Range("F" & ii) = DatePrelevement - 0                                    'DatePrelevement
                        .Range("W" & ii) = Affaissement1                                      'Affaissement
                        .Range("K" & ii) = UserForm3.TextBox12.Text                   'N¡Eprouvette
                        .Range("L" & ii) = AgeEprouvette1                                       'AgeEprouvette
                            'dŽfinition de la rŽfŽrence
                             If Range("C" & ii - 1).Value = Range("C" & ii).Value Then
                                 .Range("A" & ii) = Range("A" & ii - 1) + "1"
                             End If
                             If Range("C" & ii - 1).Value <> Range("C" & ii).Value Then
                                 .Range("A" & ii) = Format(Range("C" & ii), "yymmdd" & "01")
                            End If

Soit utiliser :
VB:
If nbreeprouvette1 > 1 Then ii = ii + 1
                            'on colle les donnŽes de l'userform dans les cellules concernŽes
                            .Range("B" & ii) = UserForm3.ComboBox7.Text                 'Client
                            .Range("I" & ii) = UserForm3.TextBox3.Text                      'RealisePar
                            .Range("J" & ii) = UserForm3.ComboBox10.Text                'LieuFabriq
                            .Range("AC" & ii) = UserForm3.ComboBox11.Text             'Fabriquant
                            .Range("H" & ii) = UserForm3.ComboBox9.Text                 'Serrage
                            .Range("G" & ii) = Eprouvette                                               'Eprouvette
                            .Range("S" & ii) = UserForm3.ComboBox12.Text                'Dosage

Pour le module 6 je n'ai rien vu de particulier

A te relire

Martial
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Bonjour Martial,

Je te remercie de t'être penché sur mon cas en plus un dimanche. Je ne pensais pas avoir une réponse si tôt.
Je fais les corrections que tu me conseils.

sinon je pensais, comme dans chaque conditions je répète tout sauf deux données, qu'il était possible de faire une donnée principale que l'on va chercher et que l'on colle sur toutes les lignes concernées et seulement modifier à chaque ligne les deux valeurs différentes.
J'ai surligné en bleu les seules parties qui diffèrent tout au long de la macro.
If NbreEprouvette1 > 0 Then

'on colle les donnŽes de l'userform dans les cellules concernŽes

.Range("B" & ii) = UserForm3.ComboBox7.Text 'Client
.Range("I" & ii) = UserForm3.TextBox3.Text 'RealisePar
.Range("J" & ii) = UserForm3.ComboBox10.Text 'LieuFabriq
.Range("AC" & ii) = UserForm3.ComboBox11.Text 'Fabriquant
.Range("H" & ii) = UserForm3.ComboBox9.Text 'Serrage
.Range("G" & ii) = Eprouvette 'Eprouvette
.Range("S" & ii) = UserForm3.ComboBox12.Text 'Dosage
.Range("T" & ii) = UserForm3.TextBox9.Text 'Lieu
.Range("U" & ii) = UserForm3.TextBox10.Text 'Projet
.Range("V" & ii) = UserForm3.TextBox11.Text 'Partie
.Range("C" & ii) = DateReception 'DateReception
.Range("F" & ii) = DatePrelevement - 0 'DatePrelevement
.Range("L" & ii) = AgeEprouvette1 'AgeEprouvette
.Range("W" & ii) = Affaissement1 'Affaissement
.Range("K" & ii) = UserForm3.TextBox12.Text 'N¡Eprouvette
'dŽfinition de la rŽfŽrence
If Range("C" & ii - 1).Value = Range("C" & ii).Value Then
.Range("A" & ii) = Range("A" & ii - 1) + "1"
End If
If Range("C" & ii - 1).Value <> Range("C" & ii).Value Then
.Range("A" & ii) = Format(Range("C" & ii), "yymmdd" & "01")
End If


If NbreEprouvette1 > 1 Then
'on colle les donnŽes de l'userform dans les cellules concernŽes
ii = ii + 1
.Range("B" & ii) = UserForm3.ComboBox7.Text 'Client
.Range("I" & ii) = UserForm3.TextBox3.Text 'RealisePar
.Range("J" & ii) = UserForm3.ComboBox10.Text 'LieuFabriq
.Range("AC" & ii) = UserForm3.ComboBox11.Text 'Fabriquant
.Range("H" & ii) = UserForm3.ComboBox9.Text 'Serrage
.Range("G" & ii) = Eprouvette 'Eprouvette
.Range("S" & ii) = UserForm3.ComboBox12.Text 'Dosage
.Range("T" & ii) = UserForm3.TextBox9.Text 'Lieu
.Range("U" & ii) = UserForm3.TextBox10.Text 'Projet
.Range("V" & ii) = UserForm3.TextBox11.Text 'Partie
.Range("C" & ii) = DateReception 'DateReception
.Range("F" & ii) = DatePrelevement - 0 'DatePrelevement
.Range("L" & ii) = AgeEprouvette1 'AgeEprouvette
.Range("W" & ii) = Affaissement2 'Affaissement
.Range("K" & ii) = UserForm3.TextBox13.Text 'N¡Eprouvette
'dŽfinition de la rŽfŽrence
If Range("C" & ii - 1).Value = Range("C" & ii).Value Then
.Range("A" & ii) = Range("A" & ii - 1) + 1
End If
If Range("C" & ii - 1).Value <> Range("C" & ii).Value Then
.Range("A" & ii) = Format(Range("C" & ii), "yymmdd" & "01")
End If
 

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

Re,

Voici ton fichier modifié, il y a sûrement des problèmes, mais c'est difficile de les voir lorsque l'on ne connait pas le fichier dans ses moindres recoins.

La macro se trouve dans l'UserForm3, c'est plus facile, comme ça il n'y a pas besoin de faire des rappels d'UserForm.

Modification de la recherche de la dernière ligne, avec une ligne de code on trouve la dernière cellule vide de la colonne A, plutôt que d'utiliser 5 ou 6 lignes avec la méthode Find.

Attention : j'ai modifié, dans l'UserForm3, les N° des ComboBox "Nbre Eprouvette" et "Age Eprouvette"

A te relire

Martial

PS : Il y a sûrement à faire avec la macro du module6
 

Pièces jointes

  • 2013 classeur béton (BETA3) V1.xlsm
    121.8 KB · Affichages: 48

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

Re,

En reprenant le fichier, je viens de m'apercevoir qu'il faut peut-être modifié comme ceci :

VB:
Select Case Controls("Combobox" & i)
            Case Is = 1
              ii = ii
              Aff = Controls("TextBox" & (20 + (i * 4)))
              ColK = Controls("TextBox" & (8 + (i * 4)))
            Case Is = 2
              ii = ii + 1
              'MsgBox (21 + (i * 4))
              Aff = Controls("TextBox" & (21 + (i * 4)))
              ColK = Controls("TextBox" & (9 + (i * 4)))
            Case Is = 3
              ii = ii + 1
              Aff = Controls("TextBox" & (22 + (i * 4)))
              ColK = Controls("TextBox" & (10 + (i * 4)))
            Case Is = 4
              ii = ii + 1
              Aff = Controls("TextBox" & (23 + (i * 4)))
              ColK = Controls("TextBox" & (11 + (i * 4)))
            End Select

Mais ce n'est pas sûr.

A+
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Je regarde, j'étais en train d'essayer de comprendre ce que tu as fais. et d'essayer.
en fait quand je test sur trois entrées, cela ne me colle que la dernière.
je vérifie avec tes nouvelles données.
merci.
A plus.
 

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

Re,

Voici ton fichier pour le module6, j'ai fais la même chose que précédemment, la macro est dans "saisiecrasement".

A+

Martial
 

Pièces jointes

  • 2013 classeur béton (BETA3) V1.1.xlsm
    115.8 KB · Affichages: 53

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

Re,

Tu es sûr d'avoir rempli le TextBox29, correspondant à l'affaissement de la 2ème ligne d'éprouvette 2ème TextBox ?

Chez moi, j'ai bien ce message si le TextBox29 n'est pas rempli sinon ça passe.

A+
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Je viens de tester le module 6.
premièrement quand je vois à combien de ligne tu l'as réduit.... ça me laisse rêveur.
deuxièmement il fonctionne parfaitement et cela me laisse encore plus pantois!

bon maintenant reste plus qu'a me lancer dans le module 4 et le comprendre pour essayer d'avancer ensemble.
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

effectivement il n'étais pas rempli. j'ai voulu faire le test trop vite. je recommence en complet.
il n'y a pas un moyen pour éviter ce genre d'erreur?
que tout n'est pas rempli et refuser de lancer l'appli ou alors ignorer?
 

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

Si c'est possible, mais il faut bien définir ce que l'on veut.

Par exemple, si sur la première ligne, tu choisis nb Eprouvette = 2, est-ce que tous les TextBox de la première ligne doivent être remplis ou seulement le 2ème TextBox du N° d'Eprouvette et le 2ème TextBox de l'affaissement ?

Si tu veux, je peux te mettre des lignes de commentaire, si ça peut t'aider.

A+
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Tu as raison, toutes les cases doivent "normalement" être remplie. Mais je doute que tout le temps elles soient remplies. Je connais les guss qui vont travailler avec. C'est pour ça que je me disais que si il avait une possibilité, une alerte disant "attention tout n'est pas rempli" ou mieux mais plus dure de surligner les cases non remplie et qui devraient l'être.

en ce qui concerne les commentaires, je veux bien sur le module 4 oui. car autant sur le module 6 j'ai bien compris que là......
 

Discussions similaires

Réponses
26
Affichages
378

Statistiques des forums

Discussions
312 196
Messages
2 086 094
Membres
103 116
dernier inscrit
kutobi87