Amélioration de code

Bonjour,

Je viens de finaliser mon fichier dans lequel il y a pas mal de lignes de code. Tout fonctionne mais étant novice en VBA il y a pas mal de lourdeur. J'aurai voulu savoir si quelqu'un aurait la gentillesse de visualiser le code afin de voir les améliorations possibles. Si intéressé j'enverrais le fichier via MP. Merci.

Bonjour Benoit, bonjour le forum,

Pourquoi tant de mystère ?!... Si tu veux profiter de l'aide de tous met donc ton fichier en pièce jointe ou, au pire, ton code !

Bonjour ThauThème, plus de mystères , voici le fichier

13planning-2016-v5.xlsm (258.58 Ko)

Re,

Ho P*** ! T'en veux du code ?!... Y'en a à revendre là... Je t'avoue que ça donne pas envie mais je vais jeter un rapide coup d'œil.

J'avais prévenu ThauThème, LOL . Merci

Re,

Bon commençons par le Code sur le composant Feui11(Planning)

Inutile de spécifier le nom de l'onglet chaque fois : Sheets("Planning") puisque c'est de lui qu'il s'agit. Quand c'est vraiment nécessaire, Me fait l'affaire : Me.Shapes("rectangle 9").Visible = False

Évite les Select inutiles qui ne font que ralentir l'exécution du code :

Range("B12:B" & derligne).Select puis un peu plus loin Sheets("Planning").Range("D3").Select.

Les Variables

Utilise Option Explicit en haut des modules. C'est vrai que c'est pénible car ça oblige à déclarer toutes les variables. Mais ça évite tellement d'erreurs que c'est, finalement, un gain de temps précieux.

Met de préférence une majuscule ou tout en en majuscule pour le nom de tes variables. En effet, VBE va automatiquement les réécrire en majuscules quand tu éditeras le code. Ça te permet, d'un rapide coup d'œil de vérifier qu'il n'y a pas une faute de frappe…

Tu peux déclarer plusieurs variables sur une même ligne mais il faut toujours spécifier le type de chacune sinon elle prendra le type Variant par défaut (très gourmand en mémoire)

Le type Double (nombre à virgule flottante) n'est pas approprié pour des variables de lignes ou des colonnes.

Le dernier numéro de colonne après la version 2003 est 16384. Donc, le type Integer (entre -32 768 et 32 767) convient pour typer une variable de colonne et aussi pour une variable de ligne dans un tableau contenant moins de 32768 lignes. Sinon il faudra utiliser le type Long pour une variable de ligne.

Dim lig, col As Double devrait être Dim LIG As Long, COL As Integer.

[b]ligFin = IIf(ligFin = Rows.Count, 0, ligFin)

[/b]Donner à une variable de ligne la valeur 0 peut-être risqué et engendrer un plantage mais dans ton cas ça n'a pas d'incidence…

Sinon c'est super bien écrit ! La suite au prochain post...

bonjour le fil

Si tu utilises FormCal

Private Sub CmdB_Date1_Click(): Set TxtB_Date = TxtB_Date1: FormCal.Show: End Sub
Private Sub CmdB_Date2_Click(): Set TxtB_Date = TxtB_Date1: FormCal.Show: End Sub

etc ...

Cordialement

Merci pour vos aides, je prends note au fur et à mesure.

ThauThème, par quoi remplacer les .select

Merci

Bonjour à toi.

Petite idée que tu prends ou pas.

Personnellement, j'aime bien quand il n'y a qu'un seul onglet d'afficher au bas de la page, car ça force les futurs utilisateurs à se servir du menu que tu as construit en haut de ton document. Ce que tu peux faire, c'est que lorsque tu appuis sur un bouton pour sélectionner un nouvel onglet, tu fasses un truc du genre :

NouvelleFeuilleChoisie.Visible = xlsheetvisible
AncienneFeuille.visible = xlsheetveryhidden

Mais ce n'est qu'une recommandation! Ton fichier excel semble bien être monté dans l'ensemble

Martin

Re,

Benoist28200 a écrit :

ThauThème, par quoi remplacer les .select

J'ai dit les Select inutiles... Quand il y a vraiment besoin il faut les laisser évidemment.

Sinon, ton calendrier... Alors là je kiffe à donf (comme disaient les djeuns) ! Mare des ces "picker" qui marchent sur une bécane sur dix...

Je vais même te le piquer pour mes besoins personnels...

Franchement je ne vais pas passer tout ton code mais je le trouve excellent dans l'ensemble. Après, on a tous nos petites manies et nos préférences.

Si tu as un problème spécifique dans ton fichier, dis-nous lequel et on s'y penchera...

Re,

Le souci , je pense, vient du calcul automatique mais je si je le mets en manuel je ne sais pas trop ou l'activer et ou le désactiver.

Amicalement

Benoist


Merci martin.truchon , j'ai prévu de masquer tout les onglets quand tout aura été optimiser.

Amicalement

Benoist

Re,

Pour éviter les flashs, malgré le ScreenUpdating = False :

Sub Rectangle15_Cliquer()
Application.ScreenUpdating = False
Application.EnableEvents = False
With Sheets("Planning")
    If .Range("A1").Value = 0 Then
        .Range("A1").Value = 1
        .Shapes("rectangle 9").Visible = True
        .Shapes("rectangle 35").Visible = True
        .Shapes("rectangle 42").Visible = True
        .Shapes("rectangle 43").Visible = True
    Else
        .Range("A1").Value = 0
        .Shapes("rectangle 9").Visible = False
        .Shapes("rectangle 35").Visible = False
        .Shapes("rectangle 42").Visible = False
        .Shapes("rectangle 43").Visible = False
    End If
End With
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

L'événement Change de l'onglet Planning est peut être à revoir car ça flashe de partout...

Re,

L'événement Change de l'onglet Planning est peut être à revoir car ça flashe de partout...

Je m'en suis aperçu ThauThème mais je vois pas comment faire autrement.

Re,

Peut-être comme ça :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig, col As Double
Dim obs As Variant
Dim ligFin, colFin As Double

Application.ScreenUpdating = False
lig = Target.Row
col = Target.Column
ligFin = Cells(12, 2).End(xlDown).Row
ligFin = IIf(ligFin = Rows.Count, 0, ligFin)
colFin = Cells(8, 3).End(xlToRight).Column
colFin = IIf(colFin = Columns.Count, 0, colFin)
If Range("B12").Value = "" Then
    Exit Sub
Else
    If (lig = 3) And (col = 14) Then
        ' Cellule de la date
        Application.EnableEvents = False
        Range(Cells(12, 3), Cells(ligFin, colFin)).ClearComments
        EditeRems Cells(3, 14)
        Application.EnableEvents = True
    End If
End If
On Error Resume Next
Application.EnableEvents = False
Sheets("Planning").Range("N2").Value = Sheets("Planning").Range("N3").Value
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Re,

Je viens d'essayer mais ça fais exactement la même chose

Amicalement

Benoist

Re,

Chez moi ça améliore considérablement les choses...

Tu as raison , après redémarrage du fichier il y a une nette amélioration.

Amicalement

Benoist

Rechercher des sujets similaires à "amelioration code"