Simplification de code

  • Initiateur de la discussion Initiateur de la discussion rounil09
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

rounil09

XLDnaute Occasionnel
Bonjour la liste,
Soit un tableau de 17 colonnes et de 3 000 lignes (pour l’instant)
Le code suivant, qui sélectionne (en fonction de la valeur de cellules) des Noms et Prénoms successivement dans plusieurs colonnes de la feuille Liste_EP et les colle sur la feuille BD_CE , fonctionne.

Pour une meilleure lisibilité et pour gagner en temps de calcul, je cherche à le simplifier, en particulier les répétitions de code que l’on peut remarquer entre les lignes 1er membre et 4ème membre.

Cela me parait impossible avec la fonction AutoFilter que j’utilise.
Je n’arrive pas à m’en sortir avec la fonction Find ou autre, malgré l’aide en ligne du site.
Quelqu’un pourrait-il me mettre sur la bonne voie ?

Sub BD_CE()

Application.ScreenUpdating = False 'fige l'écran
Application.Calculation = xlCalculationManual

Dim Cellule As Range

'Déprotège les feuilles avec mot de passe
Dim f As Worksheet
For Each f In ActiveWorkbook.Worksheets
f.Unprotect "7525"
Next

'Base de la macro : 1000 EP maxi par C.E. Nettoyage de l'écran,
[A10:Q1000].Clear

Sheets("Liste_EP").Select

If Range("A2").Value = 0 Then
Application.Goto Sheets("BD_CE").Range("A15:M15")
MsgBox "Vous n'avez pas sélectionné de C.E. dans la liste déroulante"
GoTo 1
Else
'Filtrer la base de données sur le champ I (8 --> Nom, Prénom du C.E.) avec valeur de la cellule A3
Sheets("Liste_EP").Select
Selection.AutoFilter
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=8, Criteria1:=Range("A3").Value

'Se caler dernière cellule vide de la colonne B, sélectionner jusqu'à colonne R, copier la sélection
Range("B" & Rows.Count).End(xlUp).Select
Range("B2:R2", ActiveCell).Select
Selection.Copy

Application.Goto Sheets("BD_CE").Range("A10")
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
Application.Goto reference:=Range("A1"), Scroll:=True

'Oter le filtre du champ 8 de la BD en cochant 'sélectionner tout' (codé par Down=-12)
Sheets("Liste_EP").Select
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=8
ActiveWindow.SmallScroll Down:=-12
End If

'Rechercher Membres des commissions

'1er membre
Sheets("Liste_EP").Select
'Filtrer la base de données sur le champ 13 (1er membre)
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=13, Criteria1:=Range("A3").Value
'Se caler dernière cellule vide de la colonne B,
Range("B" & Rows.Count).End(xlUp).Select
If ActiveCell = Range("B1").Value Then
[A1].Select
Else
Range("B2:R2", ActiveCell).Select
Selection.Copy
'Se caler dans BD_EP et copier la sélection
Sheets("BD_CE").Select
'Se caler dernière cellule vide de la colonne A,
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
End If

'2ème membre
'Oter le filtre du champ 13 de la BD en cochant 'sélectionner tout' (codé par Down=-12)
Sheets("Liste_EP").Select
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=13
ActiveWindow.SmallScroll Down:=-12
Sheets("Liste_EP").Select
'Filtrer la base de données sur le champ 14 (2ème membre)
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=14, Criteria1:=Range("A3").Value
'Se caler dernière cellule vide de la colonne B, sélectionner jusqu'à colonne R, copier la sélection
Range("B" & Rows.Count).End(xlUp).Select
If ActiveCell = Range("B1").Value Then
[A1].Select
Else
Range("B2:R2", ActiveCell).Select
Selection.Copy
'Se caler dans BD_EP et copier la sélection
Sheets("BD_CE").Select
'Se caler dernière cellule vide de la colonne A,
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
End If

'3ème membre
'Oter le filtre du champ 14 de la BD en cochant 'sélectionner tout' (codé par Down=-12)
Sheets("Liste_EP").Select
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=14
ActiveWindow.SmallScroll Down:=-12
Sheets("Liste_EP").Select
'Filtrer la base de données sur le champ 15 (3ème membre)
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=15, Criteria1:=Range("A3").Value
'Se caler dernière cellule vide de la colonne B, sélectionner jusqu'à colonne R, copier la sélection
Range("B" & Rows.Count).End(xlUp).Select
If ActiveCell = Range("B1").Value Then
[A1].Select
Else
Range("B2:R2", ActiveCell).Select
Selection.Copy
'Se caler dans BD_EP et copier la sélection
Sheets("BD_CE").Select
'Se caler dernière cellule vide de la colonne A,
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
End If

'4ème membre
'Oter le filtre du champ 15 de la BD en cochant 'sélectionner tout' (codé par Down=-12)
Sheets("Liste_EP").Select
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=15
ActiveWindow.SmallScroll Down:=-12
'Filtrer la base de données sur le champ 16 (4ème membre)
ActiveSheet.Range("$B$1:$R$100000").AutoFilter Field:=16, Criteria1:=Range("A3").Value
'Se caler dernière cellule vide de la colonne B, sélectionner jusqu'à colonne R, copier la sélection
Range("B" & Rows.Count).End(xlUp).Select
If ActiveCell = Range("B1").Value Then
[A1].Select
Else
'Se caler dans BD_EP et copier la sélection
Range("B2:R2", ActiveCell).Select
Selection.Copy
Sheets("BD_CE").Select
'Se caler dernière cellule vide de la colonne A,coller la sélection
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
End If

1 'Nettoyage écran et message si aucune E.P. enregistrée
Sheets("BD_CE").Select
If Range("A10").Value = "Chrono EP Global" Then
[A10:Q1000].Clear
With Sheets("Param")
MsgBox .Range("J28") & " " & ": aucune activité n'a été enregistrée pour ce C.E."
End With
End If

'Désactiver tous les filtres de la page Liste_EP
With Sheets("Liste_EP")
If .FilterMode = True Then .ShowAllData
End With

Application.Goto reference:=Range("A1"), Scroll:=True
Sheets("Param").Select
[I28].Value = 0
Sheets("BD_CE").Select
'Zoom de l'écran BD_CE
Range("A15:M15").Select
ActiveWindow.Zoom = True
Application.Goto reference:=Range("A1"), Scroll:=True


'Protège les feuilles avec mot de passe
For Each f In ActiveWorkbook.Worksheets
f.Protect "7525", True, True, True
Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True 'défige l'écran

End Sub
 
Re : Simplification de code

Salut Rounil09

Sans fichier, pas simple, mais essaye ce code
VB:
Option Explicit

Sub BD_CE()
  Dim Cellule As Range
  Dim Membre As Integer
  Dim TabCol() As String
  Dim Dlig As Long
  '
  Application.ScreenUpdating = False  'fige l'écran
  Application.Calculation = xlCalculationManual
  'Déprotège les feuilles avec mot de passe
  Dim f As Worksheet
  For Each f In ActiveWorkbook.Worksheets
    f.Unprotect "7525"
  Next
  '
  ' Définition des colonnes de filtre
  TabCol = Split("8,13,14,15", ",")
  'Base de la macro : 1000 EP maxi par C.E. Nettoyage de l'écran,
  [A10:Q1000].Clear


  If Sheets("Liste_EP").Range("A2").Value = 0 Then
    With Sheets("BD_CE")
      .Activate
      .Range("A15:M15").Select
      MsgBox "Vous n'avez pas sélectionné de C.E. dans la liste déroulante"
      If .Range("A10").Value = "Chrono EP Global" Then
        .Range("A10:Q1000").Clear
        MsgBox Sheets("Param").Range("J28") & " " & ": aucune activité n'a été enregistrée pour ce C.E."
      End If
    End With
    'Désactiver tous les filtres de la page Liste_EP
    With Sheets("Liste_EP")
      If .FilterMode = True Then .ShowAllData
    End With
    Sheets("Param").Range("I28").Value = 0
  Else
    'Filtrer la base de données sur le champ I (8 --> Nom, Prénom du C.E.) avec valeur de la cellule A3
    'Rechercher Membres des commissions
    '1er membre , 2ème membre, 3ème membre, 4ème membre
    With Sheets("Liste_EP")
      For Membre = 1 To 4
        .Range("$B$1:$R$100000").AutoFilter Field:=Val(TabCol(Membre)), Criteria1:=Range("A3").Value
        'Sélectionner de la cellule B2 à R et dernière ligne remplie
        Dlig = Sheets("BD_CE").Range("A" & Rows.Count).End(xlUp).Row
        .Range("B2:R" & Range("R" & Rows.Count).End(xlUp).Row).Copy Destination:=Sheets("BD_CE").Range("A" & Dlig + 1)
        'Oter le filtre du champ de la BD
        .Range("$B$1:$R$100000").AutoFilter Field:=Val(TabCol(Membre))
      Next Membre
    End With
  End If
  'Protège les feuilles avec mot de passe
  For Each f In ActiveWorkbook.Worksheets
    f.Protect "7525", True, True, True
  Next
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True  'défige l'écran  Else
End Sub

A+
 
Dernière modification par un modérateur:
Re : Simplification de code

Le code plante sur Autofilter

With Sheets("Liste_EP")
For Membre = 1 To 4
.AutoFilter
.Range("$B$1:$R$100000").AutoFilter Field:=Val(TabCol(Membre)), Criteria1:=Range("A3").Value

J'ai le message :
'Erreur d'execution 438'
Proprieté ou methode non gérée par cet objet
 
Re : Simplification de code

Grrrrr !!!!

Je plante toujours.

Je supprimé autofilter qui me parraissait superflu car repris en ligne qui suit.
Dans ce cas la macro passe, mais plante sur le 'paste' (ligne en rouge),
avec le message : 'Erreur d'execution 438'
Proprieté ou methode non gérée par cet objet

Je suis à deux lignes du terme... et pas possible de décoincer.

Merci pour un dernier petit coup de pouce.

With Sheets("Liste_EP")
For Membre = 1 To 4
'.AutoFilter
.Range("$B$1:$R$100000").AutoFilter Field:=Val(TabCol(Membre)), Criteria1:=Range("A3").Value
'Se caler dernière cellule vide de la colonne B, sélectionner jusqu'à colonne R, copier la sélection
Range("B2:R" & Rows.Count).End(xlUp).Copy
DLig = Sheets("BD_CE").Range("A" & Rows.Count).End(xlUp).Row
Sheets("BD_CE").Range("A" & DLig + 1).Paste 'Oter le filtre du champ 8 de la BD en cochant 'sélectionner tout' (codé par Down=-12)
.Range("$B$1:$R$100000").AutoFilter Field:=Val(TabCol(Membre))
Next Membre
End With
 
Re : Simplification de code

Salut Rounil09

C'est le problème quand on ne joint pas de fichier, on ne peut pas tester 🙄

Mais il y avait au moins 2 erreurs
1) ".Autofilter" est en trop
2) On ne peut pas faire un "Paste" sur un objet Range, uniquement sur l'objet Sheet

Code corrigé sur le Post#2

A+
 
Re : Simplification de code

Je jette l’éponge.
J’ai bataillé toute l’après-midi pour comprendre et modifier le code que m’a proposé, à 2 reprises, BRUNOM45.
Mais toujours sans succès. Je suis encore planté, cette fois sur la ligne :
.Range("$B$1:$R$100000").AutoFilter Field:=Val(TabCol(Membre)), Criteria1:=Range("A3").Value

Je joins le fishier
Merci à l’âme bienveillante qui voudra bien s’y pencher.
 

Pièces jointes

Re : Simplification de code

Bonsoir Rounil09

C'est tellement plus simple quand on a le fichier 🙄😀

J'ai laissé traîner bon nombre de bugs effectivement 😱

Regarde si cela te convient mieux

A+
 

Pièces jointes

Re : Simplification de code

Merci à nouveau BRUNOM45.
Le code fonctionne à un détail prés sur le fichier joint (noitoirement allégé)
Par contre, sur mon fichier origine je replante à la même ligne !!!
Je vais voir demain soir si je peux avancer seul (pas possible avant).
Bonne soirée et peut-être à ++
 
Re : Simplification de code

Bonjour la liste des mordus d’Excel,

Je touche….presque au but.
Je suis venu à bout des quelques petits problèmes qui subsistaient mais Il me reste un dernier dysfonctionnement à régler.
Le but de la macro est de récupérer toute l’activité d’un individu donné. Il s’agit d’extraire par filtrages successifs d’une BD toutes les lignes qui le concernent.
Hors, si une colonne contient deux fois le Nom du même individu, il n’est récupéré que la dernière ligne le concernant. C’est valable pour toutes les colonnes filtrées.

Par exemple,
pour l’individu ‘CLAR Robert’ il manque la ligne 13 de la BD (en colonne 8).
Pour l’individu ‘SUTR Jean-Luc’ il manque la ligne 1 de la BD . (en colonne 8).
Pour l’individu ‘HER Jules’ il manque la ligne 11 de la BD . (en colonne 13).
Nota : Les n° de lignes à considérer sont portés en colonne A

Je ne vois bien pas où doit porter la correction.
Toutes les solutions que j’ai testées ont échouées…

Voir le fichier joint.
 

Pièces jointes

Re : Simplification de code

Bonsoir Rounil09

Il faut changer cette partie du code
VB:
        If DLigL >= 2 Then 
         NLigB = Sheets("BD_CE").Range("A" & Rows.Count).End(xlUp).Row + 1
          .Range("B" & DLigL & ":R" & DLigL).Copy Destination:=Sheets("BD_CE").Range("A" & NLigB)
          Sheets("BD_CE").Range("A" & NLigB & ":Q" & NLigB).Copy
          Sheets("BD_CE").Range("A" & NLigB).PasteSpecial Paste:=xlPasteValues
        End If
Par
VB:
        If DLigL >= 2 Then
          NLigB = Sheets("BD_CE").Range("A" & Rows.Count).End(xlUp).Row + 1
          .Range("B2:R" & DLigL).Select
          .Range("B2:R" & DLigL).Copy Destination:=Sheets("BD_CE").Range("A" & NLigB)
          NLigB = Sheets("BD_CE").Range("A" & Rows.Count).End(xlUp).Row
          Sheets("BD_CE").Range("A10:Q" & NLigB).Copy
          Sheets("BD_CE").Range("A10").PasteSpecial Paste:=xlPasteValues
        End If
Effectivement la copie se faisait uniquement sur la dernière ligne filtrée
au lieu de commencer par la 2ème

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
10
Affichages
547
Réponses
18
Affichages
316
Réponses
2
Affichages
283
Réponses
17
Affichages
1 K
Réponses
3
Affichages
339
Retour