[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
Re : optimisation de macro

Re,

Voici le dernier fichier pour ce soir.

Modification de la couleur pour les ComboBox 4, 5 et 6 traitement identique que pour les TextBox.

Pour les ComboBox et la saisie d'éventuelles erreurs :
- Modification de la propriétés Style des ComboBox au lieu de mettre 0-fmStyleDropDownCombo permettant la saisie dans le ComboBox, il vaut mieux mettre 2-fmStyleDropDownList ne permettant pas la saisie dans le ComboBox, ça a aussi l'intérêt d'ouvrir le ComboBox dès que tu cliques dessus.

A demain

Martial
 

Pièces jointes

  • 2013 classeur béton (BETA3) V2.3.xlsm
    99.6 KB · Affichages: 50

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Bonjour Martial,

Merci pour tes explications très claires. Il faudra que j'y pense, mais j'ai déjà du mal à me rappeler les variables alors en raccourci, je te dis pas..........

Pour les dates, tu peux utiliser (si ça passe sous Mac, c'est pas sûr du tout) le Date and Time Picker, pour ça il faut activer la référence Microsoft Windows Common Controls-2 6.0. Je te mets un fichier juste pour ça. Si ça fonctionne, tu pourras le mettre dans ton fichier.

la références est manquante chez moi. Le truc c'est que je développe sous mac et que c'est windows qui va être utilisé pour recevoir ce fichier et le faire fonctionner.

Pour la dernière ligne, l'instruction ii = Cells.... est vraiment très rapide, il n'y a pas besoin de stocker ce N°.

en fait je ne comptais pas le stocker, mais simplement le noter sur la feuille "Ecrasement" qui va être imprimé, je reprend les infos des écrasement à réaliser avant telle date.
Ensuite une fois que les gars ont noté sur cette feuille les résultats, ils viennent rentrer les infos. D'ou ma reflexion qu'il est peut être plus judicieux de leur faire rentrer 2 voir 4 chiffres plutôt qu'une référence à 8 chiffres.
Si je rentre le N° de ligne directement c'est sans doute plus rapide que de faire chercher une référence dans une liste qui en fin d'année va en comporter environ 2000. (je viens de faire la manip pour coller le N° de la ligne dans la feuille "Ecrasement". Ce N° de ligne remplace le N° de référence dans l'userform "saisiecrasement")

Par contre en faisant mes essais, j'ai pensé à une autre erreur possible, c'est celle de ne pas rentrer les données dans l'ordre des arrivées, bien que celle-ci doivent être noté au jours le jours. Alors est-ce qu'il est possible, pour éviter une même référence de regarder si la date n'a pas déjà été utilisé avant dans des cellules non juxtaposé et de reprendre la numérotation de la dernière référence qui a été faite à cette date? Une recherche sur 50/100 lignes supérieurs environs. Je pense toujours au 2000 références en fin d'année.
Je vais essayer de faire ça et je te montrerais pour que tu me dises si c'est bon ou pas. Je me doute déjà du Nbre de ligne de différence entre ta proposition et la mienne (si j'y arrive)
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Bonjour Martial,
les résultats des courses n'est pas bien brillant en soit.
Je viens de passer ma soirée la dessus sans succés. toujours une incompatibilité de type, ou de bloc sans with ou sans end ou..... je ne sais quoi encore. Enfin j'ai présumé de mes compétences pour trouver un truc qui au prime abord me semblait bien compris.
voici ce que j'ai testé et trituré dans tous les sens. 3 solutions plus les autres non interessantes.
En fait j'aurais aimé récupérer le numéro de la colonne pour récupérer la ref. et voir si il existe la même date dans les cellules du dessus de ma ligne actuelle.

Code:
'For yy = 1 To Range("B65356").End(xlUp).Row
'If Range("C" & yy) = datrecep Then
'.Range("A" & ii) = .Range("A" & yy) + "1"
'Else
'.Range("A" & ii) = Format(.Range("C" & ii), "yymmdd" & "01")
'End If
                                            
'yy = Range("C:C").Find(what:="datrecep").Row
'If yy Is Nothing Then
'.Range("A" & ii) = Format(.Range("C" & ii), "yymmdd" & "01")
'Else
'.Range("A" & ii) = .Range("A" & yy) + "1"
'End If
                                                        
'Set yy = .Range("C:C").Find(What:=datrecep).Row
'If Not yy Is Nothing Then
'.Range("A" & ii) = .Range("A" &yy) + "1"
'Else
'.Range("A" & ii) = Format(.Range("C" & ii), "yymmdd" & "01")
'Set yy = Nothing
'End If

j'insite encore un peu! Il y a du progrès mais ce n'est pas encore ça. Je n'ai plus d'erreur de type ou autre.
par contre il ne me trouve pas la cellule avec la date.
Set yy = Range("C:C").Find(what:=datrecep).End(xlUp).Offset(ii, 0)
If yy = datrecep Then
age = yy.Row
.Range("A" & ii) = .Range(("A" & age) + "1")
Set yy = Nothing
Else
Range("A" & ii) = Format(.Range("C" & ii), "yymmdd" & "01")
Set yy = Nothing
End If

merci de ta patience.
 
Dernière édition:

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Bonjour Martial,

c'est pour ma référence, dans le cas ou on intercalerait une date entre deux date identique.

voici le bout de code sur lequel je travaille actuellement pour :
je rentre une date dans la cellule C&ii
je vérifie que cette date ne soit pas déjà rentrée plus haut.
si elle existe déjà alors
je récupère le N° de la row "yy" et copie la cellule ("A"&yy) que j'incremente de 1 et je la colle en ("A"ii) (ça fonctionne)
si elle n'existe pas alors
je récupère la date en ("C"&ii) que je formate et je la colle en ("A"&ii) (là ça foire)

<code>
yy as range, age as integer
Range("C" & ii).Select
Set yy = Cells.Find(What:=datrecep, After:=ActiveCell, _
LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlUp, MatchCase:=False)
age = yy.Row
If yy Is Nothing Then
age = Format(.Range("C" & ii), "yymmdd" & "01")
Range("A" & ii) = age 'Format(.Range("C" & ii), "yymmdd" & "01")
'MsgBox "Not Found"
Else
Range("A" & ii) = Range("A" & age) + "1"
End If
Ï</code>
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Re,

daterecep est une dim Date que j'utilise pour transformer la date du textbox au format date.


Private Sub CommandButton1_Click()
Dim Eprouvette As String, age As Integer
Dim datrecep As Date, datcoul As Date, yy As Range
Dim ii As Integer, c As Range, adr As String, i&, j&
Dim Aff&, ColK
'Si ComboBox1, ComboBox2 ET ComboBox3 vides alors on sort
If ComboBox1 = "" And ComboBox2 = "" And ComboBox3 = "" Then MsgBox "Aucune éprouvette n'est saisie": Exit Sub
'Si l'un des TextBox est vide ET le Tag = C alors on sort
'La propriété Tag est mise dans le module de classe
For i = 12 To 35
If Controls("TextBox" & i).Tag = "C" And Controls("TextBox" & i) = "" Then _
MsgBox "Certaines valeurs ne sont pas renseign_es": Exit Sub
Next
If "15 x 30" = ComboBox8 Then Eprouvette = 1
If "15,8 x 31,8" = ComboBox8 Then Eprouvette = 2
With Sheets("Carnet")
.Unprotect
ii = Cells(Rows.Count, 1).End(xlUp)(2).Row
For i = 1 To 3
If Controls("Combobox" & i) = "" Then GoTo Suite
For j = 1 To Controls("Combobox" & i)
Select Case j
Case Is = 1
Aff = Controls("TextBox" & (20 + (i * 4)))
ColK = Controls("TextBox" & (8 + (i * 4)))
Case Is = 2
Aff = Controls("TextBox" & (21 + (i * 4)))
ColK = Controls("TextBox" & (9 + (i * 4)))
Case Is = 3
Aff = Controls("TextBox" & (22 + (i * 4)))
ColK = Controls("TextBox" & (10 + (i * 4)))
Case Is = 4
Aff = Controls("TextBox" & (23 + (i * 4)))
ColK = Controls("TextBox" & (11 + (i * 4)))
End Select
.Range("B" & ii) = ComboBox7 'Client
.Range("I" & ii) = TextBox3 'RealisePar
.Range("J" & ii) = ComboBox10 'LieuFabriq
.Range("AC" & ii) = ComboBox11 'Fabriquant
.Range("H" & ii) = ComboBox9 'Serrage
.Range("G" & ii) = Eprouvette 'Eprouvette
.Range("S" & ii) = ComboBox12 'Dosage
.Range("T" & ii) = TextBox9 'Lieu
.Range("U" & ii) = TextBox10 'Projet
.Range("V" & ii) = TextBox11 'Partie
datrecep = TextBox1
.Range("C" & ii) = datrecep 'DateReception
datcoul = TextBox2
.Range("F" & ii) = datcoul 'DatePrelevement
.Range("W" & ii) = Aff 'Affaissement
.Range("K" & ii) = ColK 'N¡Eprouvette
age = Controls("ComboBox" & i + 3) 'AgeEprouvette
.Range("L" & ii) = age
.Range("N" & ii) = Range("L" & ii).Value + Range("F" & ii).Value
.Range("D" & ii) = Format(Range("C" & ii), "myyyy")
.Range("Q" & ii) = Format(Range("N" & ii), "myyyy")

Range("C" & ii).Select
Set yy = Cells.Find(What:=datrecep, After:=ActiveCell, _
LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlUp, MatchCase:=True)
age = yy.Row
If yy = datrecep Then
Range("A" & ii) = Format(.Range("C" & ii), "yymmdd" & "01")
Else
Range("A" & ii) = Range("A" & age) + "1"
End If

ii = ii + 1
Next
Suite:
Next
.Protect
End With
Unload Me
End Sub
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

voici le code ce qu'il devrait faire dans ma logique :
Code:
   'selectionne la cellule de départ de la recherche
  Range("C" & ii).Select
  'lance la recherche
    Set zz = Cells.Find(What:=datrecep, After:=ActiveCell, _
    LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
    SearchDirection:=xlUp, MatchCase:=False)
    'j'enregistre le numéro de la ligne dans 'age'
        age = zz.Row
    'si zz est différent de 'datrecept' alors
    If zz <> datrecep Then
    'la cellule ("A"&ii) et égal à la cellule ("C"&ii) au format "yymmdd" et je rajoute le suffixe "01"
    Range("A" & ii) = Format(.Range("C" & ii), "yymmdd" & "01")
    'sinon la cellule ("A"&ii) est égal à la cellule ("A"& le N° de la ligne zz soit 'age')
    Else
    Range("A" & ii) = Range("A" & age) + "1"
    End If
      yy = ""
 

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

Re,

Lors de mes essais, je me suis loupé dans une date, tu devrais mettre les 2 lignes ci-dessous dans ta macro, juste avant For i = 12 to 35

VB:
If Not IsDate(TextBox1) Then MsgBox "La date réception n'est pas correcte": Exit Sub
If Not IsDate(TextBox2) Then MsgBox "La date prélèvement n'est pas correcte": Exit Sub

Bon, sinon, pour ton souci, je ne comprends toujours pas, désolé je suis un peu long à la comprenette ;)

Dans ton code :
- Tu sélectionnes la dernière ligne que tu viens d'écrire
- Tu recherches ta date dans l'onglet à partir de cette cellule, donc il te trouve cette cellule
- Comme yy est forcément égale à daterecep (puisque tu viens de l'écrire)
- Il te rentre la date suivant de 01

Si je comprends bien, si tu as déjà rentré des données pour une journée (par exemple 21/05/2013) tu as donc en colonne A des valeurs comme 13052101 , 13052102 , 13052103 et 13052104 tu veux que la valeur suivante rentrée soit 13052105.

Est-ce bien ça ?

Martial
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

ex:
je rentre les dates suivantes
21/5/2013 ref = 13052101
21/5/2013 ref = 13052102
14/3/2013 ref = 13031401
14/3/2013 ref = 13031402
21/5/2013 ref = 13052103 on va rechercher la dernière référence correspondant à la date pour reprendre l'incrémentation.

Voici actuellement ce que cela me donne sur le tableau
Code:
13062108		21-juin-13
0001		        18-juin-13
13062109		21-juin-13
13062110		21-juin-13
13062111		21-juin-13
0001		
0002		        12-juin-13
ça me trouve bien la date existante et me fait ce que je veux dans le cas d'une date existante, mais dès que je rentre une nouvelle date, il me fait le 0001
 
Dernière édition:

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

Pour rechercher la dernière date, il vaut mieux partir de la dernière ligne.

Car avec Find ça prends toujours la première valeur.

Il faudrait faire quelque chose du style

For yy = Cells(Rows.count, 1).end(xlup).row to 4
etc...

Voici ton fichier modifié, j'en ai profité pour mettre un peu d'ordre dans l'ordre de tabulation entre le ComboBox1 et le TextBox35.

Il suffit de faire une tabulation pour passer d'un contrôle à l'autre.

A+

Martial
 

Pièces jointes

  • 2013 classeur béton (BETA3) V2.4.xlsm
    105.1 KB · Affichages: 50

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Comment te dire.....
en 10' tu me fais un code d'une simplicité "toute relative" et d'une fonctionnalité irreprochable alors que moi en (je tais le temps passé dessus) je n'arrive à rien.
Merci beaucoup encore encore et encore.
tu as combien d'année dans la programmation?
 

Yaloo

XLDnaute Barbatruc
Re : optimisation de macro

J'ai commencé avec quelques macros en Excel4 et des UserForm intégré dans des onglets, il n'y avait pas Visual Basic à l'époque (oh le vieux !), mais je m'y suis mis sérieusement pour un projet il y a 2 ans.

Mon patron m'a demandé un fichier et puis "si on faisait ça", "oh ça serait bien de faire comme ceci" et puis "il nous manque tel truc", enfin de fil en aiguille, maintenant je maitrise pas mal, mais pas tout.

Mais c'est aussi en regardant les posts sur Xld, Pcastuces avait aussi un bon forum, pour Excel je suis très curieux, donc quand je regarde un post je me dis que je pourrais m'en servir pour faire telle ou telle chose.

Bon, n'hésites pas si besoin.

A+
 

Gilles52300

XLDnaute Junior
Re : optimisation de macro

Bonjour Martial,
j'espère que tu vas bien.
J'ai fait un break dans les macros, mais je reviens avec la suite du projet.
je te tiens informé de l'évolution.
au fait on ne peut pas marqué résolu dans le sujet?
au plaisir,
Gilles
 

Discussions similaires

Réponses
26
Affichages
404

Statistiques des forums

Discussions
312 299
Messages
2 086 992
Membres
103 422
dernier inscrit
victus5