Excel 2007 VBA Autofiltr: Sélectionnez Case IsEmpty vs Copying

Je suis en difficulté avec ma macro.

GOAL & MAIN IDEA: Il ouvre différents files xls, basé sur Autofilter, il vérifie la 10ème colonne pour choisir les lignes avec quatre "jours de vendredi dernier" (donc, si nous avons 18/02, il returnne 13/02, 06/02, 30 / 01, 23/01.)

PROBLÈME: Le problème n'est que lorsque dans mon file il n'y a pas de dates comme aboves. Même si le file doit être fermé automatiquement, essayez de copyr la gamme vide! J'utilise Select Case (code ci-dessous)

sélection vide, mais il est encore en train de copier

CODE:

Rows("4:4").Select '*Autofilter - this part is ok* Selection.AutoFilter *' four last-Fridays from the Column - ok* ActiveSheet.Range("J5", Range("J5").End(xlDown)).AutoFilter Field:=10, Criteria1:=Array( _ LastFridayDate, Friday2weeksagoDate, Friday3weeksagoDate, Friday4weeksagoDate), Operator:= _ xlFilterValues Range("A4").Offset(1, 0).Activate Select Case IsEmpty(ActiveCell) ' *MISTAKE!!* Case True MISTAKE!! *no data in file, file should be closed!* Workbooks("prima UKACZEE.xls").Close SaveChanges:=False Case Else ' *this part always works* Range("A5", Range("A5").End(xlDown).End(xlToRight)).Select Selection.Copy Workbooks("Makro XXX Claim Hours v.01.xls").Sheets("TRN Claim Report - Labour").Activate Range("A5").End(xlDown).Offset(1, 0).Activate ActiveSheet.Paste Application.DisplayAlerts = False *' closing file - ok* Workbooks("prima UKACZEE.xls").Close SaveChanges:=False Application.DisplayAlerts = True End Select 

Si vous pouviez aider. Apprécier

Le problème ici est que AutoFilter ne rend pas les lignes inexistantes, il les cache simplement. Indépendamment du fait qu'un filter a été appliqué Range("A4").Offset(1,0) se référera toujours à la cellule A5, donc s'il y a une valeur dans A5, IsEmpty(ActiveCell) renverra toujours faux.

Pour résoudre ce problème, vous devrez utiliser la méthode SpecialCells de l'object Range. Le code ci-dessous active la 1ère cellule visible dans la colonne A qui se trouve au-dessous de la cellule A4, dans votre cas la première rangée de résultats après filtrage.

 Range("A5:A" & ActiveSheet.Rows.Count).SpecialCells(xlCellTypeVisible).Cells(1, 1).Activate