Optimisation code Excel
Bonsoir,
Pourriez-vous s'il vous laît m'aider à optimiser ce code, je n'ai pas de formation informatique mais je trouve cela très lourd...
Par avance merci!
Sub Bouton23_Cliquer()
' Bouton9_QuandClic Macro
' Macro enregistrée le 19/10/2011 par M4072147
If Range("A9") = "" Then
MsgBox "Veuillez entrer une date"
Range("A9").Select
Exit Sub
End If
'Msbox entrer une date
If Range("v9") = 1 Then
Range("AAA9") = "Conditionnelle"
End If
If Range("v10") = 1 Then
Range("AAA9") = "Programmée"
End If
If Range("v11") = 1 Then
Range("AAA9") = "Currative"
End If
'Saisi type de maintenance
If Range("P9").Value <> "" Or Range("O9").Value <> "" Then
Sheets("Interventions programmées").Activate
Rows("8:8").Select
Selection.Insert Shift:=xlDown
Sheets("Saisi intervention").Activate
Range("B9:C9").Select
Selection.Copy
Sheets("Interventions programmées").Activate
Range("B8").Select
ActiveSheet.Paste
Sheets("Saisi intervention").Activate
Range("O9").Select
Selection.Copy
Sheets("Interventions programmées").Activate
Range("A8").Select
ActiveSheet.Paste
Sheets("Saisi intervention").Activate
Range("P9").Select
Selection.Copy
Sheets("Interventions programmées").Activate
Range("D8").Select
ActiveSheet.Paste
Range("F8").Value = Range("C8").Value & " / " & Range("B8").Value
Call outlook
End If
'interventions programmées
If Sheets("Historique des interventions").Range("A8") = "" Then
Sheets("Saisi intervention").Activate
Range("A9:P9").Select
Selection.Copy
Range("D8").Value = Sheets("Saisi intervention").Range("AAA9").Value
Sheets("Historique des interventions").Activate
Range("A8").Select
ActiveSheet.Paste
Sheets("Saisi intervention").Activate
Range("A9:c9").Select
Selection.ClearContents
Range("j9:P9").Select
Selection.ClearContents
Range("O9:L9").Select
Selection.ClearContents
Range("D12").Select
Range("A9").Select
Else
Sheets("Historique des interventions").Activate
Rows("8:8").Select
Selection.Insert Shift:=xlDown
Sheets("Saisi intervention").Activate
Range("A9:P9").Select
Selection.Copy
Sheets("Historique des interventions").Activate
Range("A8").Select
ActiveSheet.Paste
Rows("15:15").EntireRow.AutoFit
Range("D8").Value = Sheets("Saisi intervention").Range("AAA9").Value
Sheets("Saisi intervention").Activate
Range("A9:c9").Select
Selection.ClearContents
Range("j9:L9").Select
Selection.ClearContents
Range("O9:P9").Select
Selection.ClearContents
Range("D12").Select
Range("A9").Select
End If
'historique des interventions
Sheets("Historique des interventions").Activate
Range("D8").Font.ColorIndex = 0
Range("E8").Value = Range("S1").Value & "/" & Range("S2").Value & "/" & Range("S3").Value & "/" & Range("S4").Value
Range("F8").Value = Range("AB1").Value & Range("AB2").Value & Range("AB3").Value & Range("AB4").Value & Range("AB5").Value
Range("G8").Value = Sheets("Saisi intervention").Range("AQ3").Value
Range("H8").Value = Sheets("Saisi intervention").Range("AQ7").Value
Range("I8").Value = Sheets("Saisi intervention").Range("AQ11").Value
Range("M8").Value = Range("W1").Value & "/" & Range("W2")
Range("N8").Value = Range("Z1").Value & "/" & Range("Z2")
Sheets("Saisi intervention").Select
Sheets("Saisi intervention").Range("AQ1").ClearContents
Sheets("Saisi intervention").Range("AS1").ClearContents
Sheets("Saisi intervention").Range("AU1").ClearContents
Sheets("Saisi intervention").Range("AQ5").ClearContents
Sheets("Saisi intervention").Range("AS5").ClearContents
Sheets("Saisi intervention").Range("AU5").ClearContents
Sheets("Saisi intervention").Range("AQ9").ClearContents
Sheets("Saisi intervention").Range("AS9").ClearContents
Sheets("Saisi intervention").Range("AU9").ClearContents
Sheets("Saisi intervention").Range("Z1").ClearContents
Sheets("Saisi intervention").Range("AH1").ClearContents
Sheets("Saisi intervention").Range("U9").ClearContents
Sheets("Saisi intervention").Range("U10").ClearContents
Sheets("Saisi intervention").Range("U11").ClearContents
Sheets("Saisi intervention").Range("AN1").ClearContents
Sheets("Saisi intervention").Range("R6").ClearContents
Sheets("Saisi intervention").Range("R7").ClearContents
Sheets("Saisi intervention").Range("R8").ClearContents
Sheets("Saisi intervention").Range("R9").ClearContents
Sheets("Saisi intervention").Range("R10").ClearContents
Sheets("Historique des interventions").Range("W1").ClearContents
Sheets("Historique des interventions").Range("W2").ClearContents
Sheets("Historique des interventions").Range("Z1").ClearContents
Sheets("Historique des interventions").Range("Z2").ClearContents
Sheets("Historique des interventions").Range("R1").ClearContents
Sheets("Historique des interventions").Range("R2").ClearContents
Sheets("Historique des interventions").Range("R3").ClearContents
Sheets("Historique des interventions").Range("R4").ClearContents
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox4 = ""
TextBox5 = ""
TextBox6 = ""
TextBox7 = ""
TextBox8 = ""
TextBox9 = ""
TextBox10 = ""
TextBox11 = ""
TextBox12 = ""
TextBox13 = ""
Range("AAA9") = ""
Conditionnelle = False
Programmée = False
Currative = False
Entretien = False
Réparation = False
Audit_contrôle = False
Formation = False
Antoine = False
Denis = False
Operateur = False
Apprenti = False
Soustraitant = False
ToggleButton1 = True
Secteur = ""
Machine = ""
ToggleButton2 = True
ToggleButton3 = True
'remise à zéro
End Sub
Sub outlook()
Dim MyOut As New outlook.Application
Dim RDV As outlook.AppointmentItem
Set RDV = MyOut.CreateItem(olAppointmentItem)
With RDV
.AllDayEvent = True
.Subject = Range("F8")
.Start = Range("A8")
.Body = Range("D8")
.Duration = 60
End With
RDV.Save
End SubVoila un autre module:
Sub droite1()
Range("h9").Select
ActiveSheet.Shapes("Flèche droite 52").Visible = True
ActiveSheet.Shapes("Flèche droite 57").Visible = True
ActiveSheet.Shapes("Flèche droite 68").Visible = False
ActiveSheet.Shapes("Flèche droite 69").Visible = False
End Sub
Sub droite2()
Range("k9").Select
ActiveSheet.Shapes("Flèche droite 53").Visible = True
ActiveSheet.Shapes("Flèche droite 58").Visible = True
ActiveSheet.Shapes("Flèche droite 70").Visible = False
ActiveSheet.Shapes("Flèche droite 71").Visible = False
End Sub
Sub droite3()
Range("m9").Select
ActiveSheet.Shapes("Flèche droite 55").Visible = True
ActiveSheet.Shapes("Flèche droite 65").Visible = True
ActiveSheet.Shapes("Flèche droite 72").Visible = False
ActiveSheet.Shapes("Flèche droite 73").Visible = False
End Sub
Sub droite4()
Range("n9").Select
ActiveSheet.Shapes("Flèche droite 56").Visible = True
ActiveSheet.Shapes("Flèche droite 66").Visible = True
ActiveSheet.Shapes("Flèche droite 74").Visible = False
ActiveSheet.Shapes("Flèche droite 75").Visible = False
End Sub
Sub droite5()
Range("p9").Select
ActiveSheet.Shapes("Flèche droite 67").Visible = True
End Sub
Sub gauche1()
Range("e9").Select
ActiveSheet.Shapes("Flèche droite 55").Visible = True
End Sub
Sub gauche2()
Range("h9").Select
ActiveSheet.Shapes("Flèche droite 52").Visible = False
ActiveSheet.Shapes("Flèche droite 57").Visible = False
ActiveSheet.Shapes("Flèche droite 68").Visible = True
ActiveSheet.Shapes("Flèche droite 69").Visible = True
End Sub
Sub gauche3()
Range("k9").Select
ActiveSheet.Shapes("Flèche droite 53").Visible = False
ActiveSheet.Shapes("Flèche droite 58").Visible = False
ActiveSheet.Shapes("Flèche droite 70").Visible = True
ActiveSheet.Shapes("Flèche droite 71").Visible = True
End Sub
Sub gauche4()
Range("m9").Select
ActiveSheet.Shapes("Flèche droite 55").Visible = False
ActiveSheet.Shapes("Flèche droite 65").Visible = False
ActiveSheet.Shapes("Flèche droite 72").Visible = True
ActiveSheet.Shapes("Flèche droite 73").Visible = True
End Sub
Sub gauche5()
Range("n9").Select
ActiveSheet.Shapes("Flèche droite 56").Visible = False
ActiveSheet.Shapes("Flèche droite 66").Visible = False
ActiveSheet.Shapes("Flèche droite 74").Visible = True
ActiveSheet.Shapes("Flèche droite 75").Visible = True
End SubEt enfin le worksheet
Private Sub ToggleButton1_Click()
If ToggleButton1.Value Then
Secteur.Visible = True
Else
ToggleButton2.Value = False
Secteur.Visible = False
Secteur = ""
Range("B9") = ""
Machine.Visible = False
Machine = ""
Range("C9") = ""
Zone_machine.Visible = False
Zone_machine = ""
Range("J9") = ""
ToggleButton3.Value = False
End If
End Sub
Private Sub ToggleButton2_Click()
If ToggleButton2.Value Then
Machine.Visible = True
Else
ToggleButton3.Value = False
Machine.Visible = False
Machine = ""
Range("C9") = ""
Zone_machine.Visible = False
Zone_machine = ""
Range("J9") = ""
End If
End Sub
Private Sub ToggleButton3_Click()
If ToggleButton3.Value Then
Zone_machine.Visible = True
Else
Zone_machine.Visible = False
Zone_machine = ""
Range("J9") = ""
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Macro enregistrée le 12/02/2013 par B6961452
If Not Intersect(Range("a9:a9"), Target) Is Nothing And Target.Count = 1 Then
Application.EnableEvents = False
If EstOuvertUF("F_calendrier1dateTableur") Then Unload F_calendrier1dateTableur
F_calendrier1dateTableur.Show
F_calendrier1dateTableur.Left = 10
F_calendrier1dateTableur.Top = 140
Application.EnableEvents = True
Secteur.Visible = False
Secteur.Visible = True
Machine.Visible = False
Machine.Visible = True
Zone_machine.Visible = False
Zone_machine.Visible = True
ToggleButton1.Value = True
ToggleButton2.Value = True
ToggleButton3.Value = True
End If
If Not Intersect(Range("o9:o9"), Target) Is Nothing And Target.Count = 1 Then
Application.EnableEvents = False
If EstOuvertUF("F_calendrier1dateTableur") Then Unload F_calendrier1dateTableur
F_calendrier1dateTableur.Show
F_calendrier1dateTableur.Left = 10
F_calendrier1dateTableur.Top = 140
Application.EnableEvents = True
End If
If Not Intersect(Range("a9:f9"), Target) Is Nothing And Target.Count = 1 Then
Range("b14", "b15") = "t"
Range("B16") = "t"
Range("b17", "b18") = "t"
Range("B19") = "t"
Else
Range("b14", "b15") = ""
Range("B16") = ""
Range("b17", "b18") = ""
Range("B19") = ""
End If
If Not Intersect(Range("g9:i9"), Target) Is Nothing And Target.Count = 1 Then
Range("b20", "b21") = "t"
Range("B22") = "t"
Else
Range("b20", "b21") = ""
Range("B22") = ""
End If
If Not Intersect(Range("j9:l9"), Target) Is Nothing And Target.Count = 1 Then
Range("b23", "b24") = "t"
Range("B25") = "t"
Else
Range("b23", "b24") = ""
Range("B25") = ""
End If
If Not Intersect(Range("m9"), Target) Is Nothing And Target.Count = 1 Then
Range("B26") = "t"
Else
Range("B26") = ""
End If
If Not Intersect(Range("n9"), Target) Is Nothing And Target.Count = 1 Then
Range("B27") = "t"
Else
Range("B27") = ""
End If
If Not Intersect(Range("o9:p9"), Target) Is Nothing And Target.Count = 1 Then
Range("b28", "b29") = "t"
Else
Range("b28", "b29") = ""
End If
End Sub
Function EstOuvertUF(nom)
EstOuvertUF = False
For Each i In UserForms
If UCase(i.Name) = UCase(nom) Then EstOuvertUF = True
Next i
End FunctionBonsoir,
Déjà tu peux optimiser les
xxx.select
selection.xxxx
exemple sur un bout de ton code :
'Saisi type de maintenance
If Range("P9").Value <> "" Or Range("O9").Value <> "" Then
Sheets("Interventions programmées").Activate
Rows("8:8").Insert Shift:=xlDown
Sheets("Saisi intervention").Activate
Range("B9:C9").Copy
Sheets("Interventions programmées").Activate
Range("B8").Select
ActiveSheet.Paste
Sheets("Saisi intervention").Activate
Range("O9").Copy
Sheets("Interventions programmées").Activate
Range("A8").Select
ActiveSheet.Paste
Sheets("Saisi intervention").Activate
Range("P9").Copy
Sheets("Interventions programmées").Activate
Range("D8").Select
ActiveSheet.Paste
Range("F8").Value = Range("C8").Value & " / " & Range("B8").Value
Call outlook
End Ifok merci , je regarde ça.
Il vaut mieux avoir le moins de ligne possible?
Vaut-il mieux appeler des macro des sub ou tout mettre à la suite dans une seule et même macro?
Bonjour,
On ne peut pas faire de l'optimisation comme ça : Le code est indissociable du classeur.
Tu peux toujours supprimer les Select...Selection. ça sera déjà moins pire, mais ça ne fera pas un code optimisé :
Il y a notamment une incohérence :
'interventions programmées
If Sheets("Historique des interventions").Range("A8") = "" Then
Sheets("Saisi intervention").Activate
Range("A9:P9").Select
Selection.Copy
'La ligne suivante n'est probablement pas à sa place ( à moins qu'il ne manque un groupe de ligne ???)
Range("D8").Value = Sheets("Saisi intervention").Range("AAA9").Value
'**************************************************************************
Sheets("Historique des interventions").Activate
Range("A8").Select
ActiveSheet.Paste...qui demande à faire du débogage en pas à pas pour voir ce que tu as voulu faire exactement.
Il vaut mieux avoir le moins de ligne possible?
Ce n'est pas une question de nombre de ligne (Encore que, ça marche souvent de pair...)
tout mettre à la suite dans une seule et même macro?
Ça n'a aucune importance : Je dirais même que c'est plutôt exactement le contraire !
Personnellement, je professe que "Diviser pour mieux régner" devrait être la devise de tout programmeur VBA !
De mon temps... On apprenait qu'une bonne macro VBA devait tenir dans un écran ! (sans scroller)
A+
Bonjour,
Merci pour vos réponses. Voici le fichier. Le mot de passe est suivi
Bonjour
J'ai commencé à comprendre ton code (pas sur d'avoir tout compris)
Et j'ai modifié (non testé) ta macro
Sub Bouton23_Cliquer()
' Bouton "Afficher à l'historique" dans la page "Saisi intervention"
' Bouton9_QuandClic Macro
' Macro enregistrée le 19/10/2011 par M4072147
If Range("A9") = "" Then
MsgBox "Veuillez entrer une date"
Range("A9").Select
Exit Sub
End If
'Msbox entrer une date
Application.ScreenUpdating = False
'figer l'écran
'Saisi type de maintenance
Range("AAA9").ClearContents
If Range("U9") = True Then
Range("AAA9") = "Conditionnelle"
ElseIf Range("U10") = True Then
Range("AAA9") = "Programmée"
ElseIf Range("U11") = True Then
Range("AAA9") = "Currative"
End If
If Range("AAA9") = "" Then
MsgBox "Veuillez choisir un type de maintenance"
Exit Sub
End If
' Si Description ou date prochaine intervention
' interventions programmées
If Range("P9") <> "" Or Range("O9") <> "" Then
With Sheets("Interventions programmées")
.Rows("8:8").Insert
Range("B9:C9").Copy .Range("B8")
Range("O9").Copy .Range("A8")
Range("P9").Copy .Range("D8")
.Range("F8") = Range("C8") & " / " & Range("B8")
'Call outlook
End With
End If
' historique des interventions
With Sheets("Historique des interventions")
If .Range("A8") <> "" Then
.Rows(8).Insert
End If
Range("A9:P9").Copy .Range("A8")
.Range("D8") = Range("AAA9")
.Range("D8").Font.ColorIndex = 0
.Range("E8") = .Range("S1") & "/" & .Range("S2") & "/" & .Range("S3") & "/" & Range("S4") ' Type d'intervention
.Range("F8") = .Range("AB1") & .Range("AB2") & .Range("AB3") & .Range("AB4") & .Range("AB5") ' Les intervenants
.Range("G8") = Range("AQ3") ' Temps d'arrêt
.Range("H8") = Range("AQ7") ' Temps d'intervention
.Range("I8") = Range("AQ11") ' Temps de dépannage
.Range("M8") = .Range("W1") & "/" & .Range("W2") ' Solution immédiate + Ressource matériel
.Range("N8") = .Range("Z1") & "/" & .Range("Z2") ' Solution à long terme + Ressource matériel
' On efface
.Range("W1:W2,Z1:Z2:R1:R4").ClearContents
End With
' remise à zéro
Range("A9:C9,J9:P9,O9:L9,AQ1,AS1,AU1,AQ5,AS5,AU5,AQ9,AS9,AU9,Z1,AH1,U9:U11,AN1,R6:R10,AAA9").ClearContents
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox4 = ""
TextBox5 = ""
TextBox6 = ""
TextBox7 = ""
TextBox8 = ""
TextBox9 = ""
TextBox10 = ""
TextBox11 = ""
TextBox12 = ""
TextBox13 = ""
Conditionnelle = False
Programmée = False
Currative = False
Entretien = False
Réparation = False
Audit_contrôle = False
Formation = False
Antoine = False
Denis = False
Operateur = False
Apprenti = False
Soustraitant = False
ToggleButton1 = True
Secteur = ""
Machine = ""
ToggleButton2 = True
ToggleButton3 = True
'Retour à l'onglet saisi intervention
Application.ScreenUpdating = True
Range("A9").Select
End SubComme j'ai trouvé (avis personnel) ta manière de faire très compliquée (des formules un peu partout sur les pages)
Je suis parti sur une étude d'un code avec un Userform
Ce n'est pas parfait mais si cela t'intéresse on peut continuer sur cette voie
A toi de dire
Bonjour Banzaï,
Tout d'abord un grand merci, c'est exactement ce que je voulais. Je n'ai pas eu le temps de vous répondre avant car beaucoup de travail. Il m'a fallu pas mal de temps pour comprendre le code.
Il y a un problème avec le secteur miroiterie, je ne parviens pas à trouver les machines et seulement pour ce secteur. Pour les autres secteurs cela fonctionne très bien. Je ne l'explique pas.
Il y a encore certaines choses que je n'ai pas compris dans le code.
A quoi sert cette ligne?
Intervenant = Mid(Intervenant, 2)A quoi sert le module de classe?
Public WithEvents Bouton As MSForms.TextBox
Private Sub Bouton_Change()
Dim Groupe As Integer
Dim Total As Double
Groupe = Right(Bouton.Name, 1) \ 3
Total = Val(UserForm1.Controls("TB" & Groupe * 3)) * 24
Total = Total + Val(UserForm1.Controls("TB" & (Groupe * 3) + 1))
Total = Total + Val(UserForm1.Controls("TB" & (Groupe * 3) + 2)) / 60
UserForm1.Controls("LabelTot" & Groupe) = IIf(Total = 0, "", Round(Total, 2))
End SubJe souhaite encore optimiser le code, pourriez-vous m'aider?
Voici ce que je voudrais faire:
1)Quand on ajoute une entrée dans un des trois textbox de l'onglet lieu, incrémenter la liste correspondante (secteur, machine ou zone machine). Il faudrait également que la liste reste triée par ordre alphabétique
J'ai quelques petites idées mais j'ai peur de dire une usine à gaz.
Il faudrait pour cela si on suit la logique actuelle et si par exemple on veut ajouter le secteur Croisillons
ajouter une entrée dans l'onglet secteur et machine colonne A
Ajouter dans l'onglet secteur et machine une entrée tout à droite du tableau sur la ligne 1
Trier par ordre alphabétique
Ajouter la machine dans l'onglet zone machine. Pour cela je ne vois vraiment pas comment faire, vu qu'il s'agit de cellules fusionnées...
Trier
Si on veut ajouer une machine maintenant,
il faut ajouter la machine dans l'onglet secteur et machine dans la bonne colonne
Trier
Ajouter la machine dans l'onglet Zone, dans le bon secteur
Trier les machines
Je viens de commencer, pourriez vous me donner quelques pistes svp...
Merci d'avance
Bonjour
Intervenant = Mid(Intervenant, 2)récupère la partie situé après le 1er "/" : Fais un teste en masquant cette ligne et tu verras le résultat
Un module de classe permet de grouper des macros pour un nombre important de contrôles
Ici j'ai voulu éviter de taper 9 fois le code TextBox...Change (c'est à dire copier 9 fois le code du module de classe dans le code de l'userform)
exceldu13 a écrit :Il y a un problème avec le secteur miroiterie
Tu recherches dans une page, et tu récupères les données dans une autre pas glop
A tester
Si des problèmes : Détailles bien les actions à faire pour refaire le bug
Bonjour,
Merci pour ton aide. Ci joint le fichier final.
Il y a un bug quand on essaye de rentrer le premier seccteur (le trie se fait en prenant en compte l'entête de la colonne secteur). Comment est-ce possible?
Pourrais tu m'aider à résoudre ce problème?
Merci d'avance.
Bonsoir
Le mot de passe ?
oups
VBA: suivipw
onglet: suivimp
Bonjour
Banzai64 a écrit :Si des problèmes : Détailles bien les actions à faire pour refaire le bug
J'ai rapidement survolé le code
cela sert à quoi ?
For i = 1 To 50
Me.LBSecteur.AddItem s & i
Me.LbMachine.AddItem t & i
Me.LbMachine.AddItem u & i
Next