Macro sur date
Bonjour au forum,
Je dois copier au quotidien dans le fichier « BASE » les données du Pays US dans le fichier « US ».
Je ne dois copier uniquement la dernière date par rapport à la date du jour, soit le 16/11/2016 dans le fichier « US ».
La macro suivante permet d’effectuer cette tâche.
Windows("BASE.xlsx").Activate
Range("A1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$C$13").AutoFilter Field:=1, Operator:= _
xlFilterValues, Criteria2:=Array(2, "11/16/2016")
ActiveSheet.Range("$A$1:$C$13").AutoFilter Field:=2, Criteria1:="US"
Range("A12:C12").Select
Selection.Copy
Windows("BASE.xlsx").Activate
Range("A12:C12").Select
Application.CutCopyMode = False
Selection.Copy
Windows("US.xlsx").Activate
Range("A2").Select
ActiveSheet.Paste
Windows("BASE.xlsx").Activate
Windows("FICHIER MACROS.xlsm").Activate
Range("D15").Select
End SubCependant, je rencontre un souci. Comme la BASE est alimentée au quotidien par des données, la macro ne filtre que la date du 16/11/2016. Comment modifier ce code avec un format de date à J-1 ?
xlFilterValues, Criteria2:=Array(2, "11/16/2016")En espérant avoir été clair dans mes explications.
Bonjour,
la variable "Date" de donne la date du jour , tu soustrait 1 .. puis tu utilise la fonction format pour obtenir le bon affichage (US) de ta date ...
Bonjour,
Le filtrage sur des dates sera inopérant en VBA si tu passes des dates sous forme texte...
L'utilisation d'un Criteria2, suppose qu'un Criteria1 a été défini !
Et je ne saurais trop conseiller par ailleurs d'expurger ton code d'un nombre conséquent d'éléments issus de l'enregistreur qui ne donne aucune envie de s'y pencher...
Cordialement.
Les macros sans l'enregistreur, j'ai un peu de mal..
Cela s'apprend
On commence par l'élimination de tout Select, Selection ou Activate, qui se fait dans de nombreux cas en raccordant les morceaux séparés :
Range(xx).Select
Selection.Copy
devient :
Range(xx).Copy
Ce faisant on a éliminé une opération parasite et économisé le temps qu'elle prenait.
On évite l'objet Window au profit de Workbook qui s'avèrera plus stable et plus fiable.
On élimine toujours la ligne : Application.CutCopyMode = False, sans y réfléchir car si l'enregistreur la produit, c'est que l'action accomplie l'a provoqué ! Et si tant est qu'on ait besoin de recourir à cette ligne de commande, ce sera forcément toujours, s'agissant de code enregistré, dans une situation où elle n'a pas été enregistrée et ne figure donc pas (encore faut-il savoir ce que fait la commande !!). Donc, si elle se trouve sur du code enregistré, il convient de toujours l'effacer.
Au stade suivant, on s'efforce de doter toutes ses expressions de qualificateurs d'objets, de façon que VBA n'ait pas à déterminer lui-même à quel objet actif se référer. Le code y gagnera en clarté, en fiabilité et en rapidité.
Et lorsque plusieurs expressions doivent référer au même objet, on n'hésite pas à l'inscrire dans une instruction With... End With, qui permettra à VBA de conserver l'objet en mémoire, et ainsi gagner du temps...
Enfin on élimine les arguments ou paramètres inutiles inscrits par l'enregistreur, car laissés à leur valeur par défaut, et qu'il est inutile de perdre du temps à les définir à la valeur qu'ils ont déjà (sauf pour 2 ou 3 méthodes, bien signalées dans l'aide, pour lesquelles les paramètres se conservent d'un appel à l'autre, et dans le cas où on les a antérieurement modifié).
Et contrairement à l'enregistreur on rétablit comme règle normale de passage d'arguments le passage par position, au lieu de conserver le passage par nom qui n'offre d'intérêt que dans le cas d'un nombre conséquent d'arguments dont beaucoup restent inutilisés, ou s'il peut y avoir ambiguïté et risque d'erreur... Là on s'économise de l'écriture !
Et parvenu à ce point, on peut se concentrer sur les progrès réalisables avec les moyens offerts par VBA mais échappant par nature à l'enregistrement car non réalisables manuellement : utilisation de boucles, de tableaux, d'affectations directes de valeurs (évitant de passer par un copier-coller), etc.
Cordialement.
NB- Et si on indente son code, on pourra le lire d'autant mieux !