Décortiquer un code VBA
Bonjour les amis,
il m'a été amené d'essayer de décortiquer un code vba, je dois absolument saisir son fonctionnement .. Pourriez vous m'aider à l'analyser svp ?
Sub function()
Dim Fin As Long, Liste As Range, Liste1 As Range, Liste2 As Range, Liste3 As Range
Sheets("feuil1").Activate
[A4].AutoFilter field:=4, Criteria1:=" "
Range("_FilterDataBase").Offset(1, 0).Resize(Range("_FilterDataBase"). _
Rows.Count - 1).SpecialCells(xlCellTypeVisible).DELETE Shift:=xlUp
ActiveSheet.ShowAllData
Fin = Columns("G").Find("*", , , , , xlPrevious).Row
Set Liste = Range("G2:G" & Fin)
Sheets("feuil2").Range("H300:M300").ClearContents
Sheets("feuil2").Range("H300") = Application.Sum(Liste)
Set Liste1 = Range("H2:H" & Fin)
Sheets("feuil2").Range("M300") = Application.Sum(Liste1)
Set Liste2 = Range("I2:I" & Fin)
Sheets("feuil2").Range("I300") = Application.Sum(Liste2)
Set Liste3 = Range("J2:J" & Fin)
Sheets("feuil2").Range("J300") = Application.Sum(Liste3)
Set Liste4 = Range("K2:K" & Fin)
Sheets("feuil2").Range("K300") = Application.Sum(Liste4)
End SubBonjour
En premier vous ne pouvez pas utiliser le FUNCTION pour une SUB car ce mot est utilisé par excel. Changer le par FONCTION par exemple
Votre code expliqué :
Sub fonction()
Dim Fin As Long, Liste As Range, Liste1 As Range, Liste2 As Range, Liste3 As Range 'déclaration des variables
Sheets("feuil1").Activate 'On active la feuille 1
[A4].AutoFilter field:=4, Criteria1:=" " 'filtre automatique sur colonne D
Range("_FilterDataBase").Offset(1, 0).Resize(Range("_FilterDataBase"). _
Rows.Count - 1).SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp 'suppression des lignes
ActiveSheet.ShowAllData 'on réaffiche toutes les données
Fin = Columns("G").Find("*", , , , , xlPrevious).Row 'Recherche de la dernière ligne de la colonne G dans feuille 1
Set Liste = Range("G2:G" & Fin) 'attribution du nom LISTE pour déclarer la plage G2 à G et dernière colonne (fin)
Sheets("feuil2").Range("H300:M300").ClearContents 'suppression des données dans la plage H300 à M300 de la feuille 2
Sheets("feuil2").Range("H300") = Application.Sum(Liste) 'somme de la plage Liste en H300
Set Liste1 = Range("H2:H" & Fin) 'attribution du nom LISTE pour déclarer la plage H2 à H et dernière colonne (fin)
Sheets("feuil2").Range("M300") = Application.Sum(Liste1) 'somme de la plage Liste1 en M300
....Si vous souhaitez garder ce code plutôt que celui ci-dessous, vous pouvez remplacer Liste1, liste2, liste3 et liste4 par le mot LISTE
Votre code un peu simplifié
Sub fonction()
Dim Fin As Long
With Sheets("feuil1")
.Activate
.Range("A4").AutoFilter field:=4, Criteria1:=" "
.Range("_FilterDataBase").Offset(1, 0).Resize(Range("_FilterDataBase"). _
Rows.Count - 1).SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
.ShowAllData
Fin = .Columns("G").Find("*", , , , , xlPrevious).Row
Sheets("feuil2").Range("H300:M300").ClearContents
Sheets("feuil2").Range("H300") = Application.Sum(.Range("G2:G" & Fin))
Sheets("feuil2").Range("M300") = Application.Sum(.Range("H2:H" & Fin))
Sheets("feuil2").Range("I300") = Application.Sum(.Range("I2:I" & Fin))
Sheets("feuil2").Range("J300") = Application.Sum(.Range("J2:J" & Fin))
Sheets("feuil2").Range("K300") = Application.Sum(.Range("K2:K" & Fin))
End With
End SubMoyennant votre fichier on pourrait probablement simplifier encore
Si ok, merci de cloturer le fil en cliquant sur le V vert à coté du bouton EDITER lors de votre réponse
Cordialement
Merci bcp pour votre aide .. j'arrive à comprendre le fonctionnement de la macro ..
Sauf que là .. lorsque je l'exécute ça m'affiche l'erreur suivante :
Erreur d'exécution 1004, pas de cellules correspondantes
La ligne du code concernée est :
.Range("_FilterDataBase").Offset(1, 0).Resize(Range("_FilterDataBase"). _
Rows.Count - 1).SpecialCells(xlCellTypeVisible).DELETE Shift:=xlUpJe tiens à vous remercier pour votre collaboration !
Re
Oui je me doutais de cela.
Il faudrait savoir à quoi correspond ce nom --> "_FilterDataBase"
Regardez dans les noms attribués au fichier
Cordialement
Oui effectivement; une telle variable n'existe même pas dans la feuille ..
Peut être qu'elle se crée juste après activation du filtre ?
Re
Non du tout. Il faut définir la plage concernée, genre Range("A1:O10000") ou alors peut être enlever cette instruction ?
Si vous avez copié ce code quelque part, il faut l'adapter à votre fichier
Cordialement