VBA - Optimiser code C/C valeurs & filtre avancé

Bonjour,

Je souhaite copier les valeurs des données du Classeur1, puis les coller dans le Classeur2 (sans interférer sur la mise en forme / formule du Classeur2).

Grâce à internet, j'ai élaboré ce code fonctionnel, mais qui ne répond pas tout à fait à mon besoin.

Classeur1.Worksheets("Feuil1-1").Range("G4:S89").Copy Destination:=Classeur2.Worksheets("Feuil2-1").Range("C4")

avec Classeur1 & Classeur2 as Workbook

J'ai l'alternative (grâce à l'enregistreur), mais je me retrouve avec un code pas très lisible, et sans doute moins fiable. Quelles modifications faut-il apporter pour intégrer la fonction "copier/coller les valeurs" dans le premier code ?

    Windows("Classeur1.xlsm").Activate
    Sheets("Feuil1-1").Select

    Range("G4:S89").Select
    Selection.Copy

    Windows("Classeur2.xlsx").Activate
    Sheets("Feuil2-1").Select

    Range("C4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Même demande pour automatiser un "filtrage avancé".

    Windows("Classeur1.xlsm").Activate
    Sheets("Feuil1-2").Select
    Columns("A:BL").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "BN1:BP58"), CopyToRange:=Range("BR1:BX1"), Unique:=False

Ci-dessus, j'ai le "code brut" fourni par l'enregistreur de macro. Est-il possible d'optimiser ce code pour en améliorer sa fiabilité et lisibilité ?

Espérant avoir été clair et précis, n'hésitez pas à me demander un classeur exemple. Je vous remercie par avance et je reste à disposition.

Cdlt,

Towelie.

Bonsoir Towelie,

Pour ta demande n° 1, je te propose ce code VBA :

  Classeur1.[Feuil1-1!G4:S89].Copy: Classeur2.[Feuil2-1!C4].PasteSpecial -4163

Et voici pour ta demande n° 2 :

  Classeur1.Activate: Worksheets("Feuil1-2").Select
  Columns("A:BL").AdvancedFilter 2, [BN1:BP58]

Cordialement,

dhany

Salut dhany,

Tout d'abord, merci beaucoup pour les efforts fournis. Ta solution est fonctionnelle et répond à mon besoin !!

Étrangement, la ligne ci-dessous ne fonctionne pas..

Classeur1.[Feuil1-1!G4:S89].Copy: Classeur2.[Feuil2-1!C4].PasteSpecial -4163

Mais j'ai pu résoudre le problème rapidement en "déclarant" les feuilles et les adresses de "manière conventionnelle"

Classeur1.Worksheets("Feuil1-1").Columns("G:S").Copy: Classeur2.Worksheets("Feuil2-1").Range("C4").PasteSpecial -4163

(je voulais en réalité copier les colonnes, d'ou le fait que j'ajoutes le "Columns")

Après avoir effectué des recherches sur msdn.microsoft.com (qui est vraiment explicite), j'ai pu comprendre que la méthode AdvancedFilter se construit de la manière suivante : expression .AdvancedFilter ( Action , CriteriaRange , CopyToRange , Unique )

Je n'avais pas compris pourquoi tu n'avais pas laissé les coordonnées du "CopyToRange", mais Excel est très malin et les retrouve de lui-même.

Merci encore,

Towelie.

Tu a écrit :

Excel est très malin et les retrouve de lui-même

En fait, c'est plutôt que pour un paramètre donné, il y a parfois une valeur « par défaut » ; c'est donc celle qu'Excel utilise si elle n'est pas indiquée, donc inutile de la préciser quand justement c'est la valeur par défaut qu'on veut utiliser, car elle convient très bien.

Merci d'avoir passé le sujet en résolu.

dhany

Rechercher des sujets similaires à "vba optimiser code valeurs filtre avance"