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 Sub

Voila 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 Sub

Et 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 Function

Bonsoir,

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 If

ok 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

16suivi.zip (265.00 Ko)

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 Sub

Comme 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 Sub

Je 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
Rechercher des sujets similaires à "optimisation code"