[RESOLU] Onglet récapitulatif simple

lancelot92

XLDnaute Nouveau
Bonjour à tous,

Ce que je souhaite réaliser je peux le décrire simplement de façon algorithmique car je sais exactement ou je veux aller mais je ne sais clairement pas m'y prendre pour programmer intelligemment en vba en utilisant les instructions appropriées sans tout mélanger.
Voici donc mon besoin :

1 Sélectionner à partir du 2ème onglet jusqu’à l'avant avant dernier onglet (Sheets(Sheets.Count - 2 )
2 Se placer sur le 1er onglet selectionné
3 A partir de la ligne 9 et pour toutes les autres lignes qui suivent, tant que les cellules en a ET en k ne sont pas vides, copier la ligne correspondante dans l'onglet "recap" à partir de la ligne 1 (et en incrémentant donc pour toutes les autres lignes qui y seront copiées).
4 Passer a l'onglet suivant (des que pour une ligne la cellule a OU la cellule k sera vide donc) et réitérer
l'instruction 3 jusqu’à l'avant dernier onglet

FIN

Un grand merci pour toute l'aide que vous pourrez m'apporter dans ma démarche.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour lancelot92,

Dans votre algorithme, vous dites :
3 A partir de la ligne 9 et pour toutes les autres lignes qui suivent, tant que les cellules en a ET en k ne sont pas vides, copier la ligne (...)

Si on suit cette instruction, on ne copie rien du tout pour le fichier fourni. En effet toutes les lignes n° 9 de vos tableaux sont vides, donc les cellules en A et K sont vides. La condition "tant que les cellules en a ET en k ne sont pas vides" n'est donc plus vérifiée => on arrête la copie et on passe au tableau suivant... qui lui-même a une ligne 9 vide. J"ai donc remplacé le "tant que" par "si".

Dans le fichier joint, cliquez sur le bouton "Risks summary" de la feuille "Recap". Le code est dans module1.
VB:
Sub recap()
Dim f&, derlig&, N&, i&

   Application.ScreenUpdating = False
   Sheets("Recap").Range("a9:L" & Rows.Count).Clear
   N = 8
   For f = 2 To Sheets.Count - 2
      With Sheets(f)
         If .AutoFilterMode Then .Cells.AutoFilter
         derlig = .Cells(.Rows.Count, "a").End(xlUp).Row
         If derlig >= 9 Then
            For i = 9 To derlig
               If .Cells(i, "a") <> "" And .Cells(i, "k") <> "" Then
                  N = N + 1
                  Sheets("Recap").Cells(N, "a").Resize(, 12).Value = .Cells(i, "a").Resize(, 12).Value
                  Sheets("Recap").Cells(N, "k").Resize(, 2).Merge
               End If
            Next i
            .Range("a8:L8").AutoFilter
         End If
      End With
   Next f
   Application.Goto Sheets("Recap").Range("a1"), True
End Sub
 

Pièces jointes

  • lancelot92- Recap- v1.xlsm
    106.8 KB · Affichages: 47
Dernière édition:

lancelot92

XLDnaute Nouveau
Bonjour mapomme,

Le code que tu as programmé fonctionne parfaitement et répond complètement à mon besoin. Il est simple et épuré ; je pourrai sans difficulté le réadapter au contexte du travail que je dois réaliser car celui-ci évolue beaucoup.

Le point qui reste sombre, c'est pourquoi est-ce que nous avons besoin de l'instruction
Code:
If .AutoFilterMode Then .Cells.AutoFilter
et de l'instruction
Code:
 .Range("a8:L8").AutoFilter
pour assurer la présence des filtres. Je croyais que
Code:
.Range("a8:L8").AutoFilter
suffirait mais visiblement après essai ça ne suffit pas.

Un grand merci à toi pour cette précieuse aide.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir lancelot92,

On utilise l'instruction derlig = .Cells(.Rows.Count, "a").End(xlUp).Row pour trouver la dernière ligne de chaque tableau. Cette instruction ne donne un résultat correct que si toutes les lignes sont affichées. En effet, si un filtre est actif et qu'il masque, par exemple, les deux dernières lignes, alors derlig ne retournera non pas la véritable dernière ligne du tableau, mais la véritable dernière ligne moins deux -> le traitement oubliera les deux dernières lignes du tableau.

Donc avant de calculer derlig, j'ôte le filtre automatique de la feuille pour afficher toutes les lignes du tableau. Pour ôter le filtre automatique, il faut qu'il existe (sinon survient une erreur). D'où le code: If .AutoFilterMode Then .Cells.AutoFilter. (si un filtre auto existe sur la feuille, .Cells.AutoFilter l'ôte).

Quand le traitement du tableau est terminé, je remets le filtre automatique avec l'instruction : .Range("a8:L8").AutoFilter.
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
329

Membres actuellement en ligne

Statistiques des forums

Discussions
312 379
Messages
2 087 763
Membres
103 661
dernier inscrit
fcleves