IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment sélectionner et copier des lignes après un filtre


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Comment sélectionner et copier des lignes après un filtre
    Boujour,
    Je ne comprends pas pour quoi avec le code ci-dessous j'ai une erreur d'excécution "1004" Erreur définie par l'application ou par l'objet.

    Détail environnement :
    sur une feuille Excel d'un fichier x j'ai un bouton avec du code qui
    1) ouvre une feuille Fy d'un autre fichier y déjà ouvert
    2) fait un filtre sur la 2ème colonne
    3) sélectionne et copie toutes les lignes résultat du filtre

    Or la commande ci-dessous ne marche pas => elle fait une erreur "1004"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:" & [A1].SpecialCells(xlCellTypeLastCell).Address).Select
    alors que si je la teste sur un bouton avec le code sur cette feuille directement là elle fonctionne parfaitement.

    Comment la coder pour qu'elle fonctionne à partir d'un autre fichier ouvert ?
    Remarque qui peut être utile j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Détail_ruptures").Range("A1:" & [A1].SpecialCells(xlCellTypeLastCell).Address).Select
    mais là elle ne me sélection que les données des lignes 1 et 2 (i.e les lignes du filtre. Le filtre est en ligne 2) mais pas il manque les lignes résultat.

    Ci-dessous le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub CommandButton1_Click()
    Dim Message, Title, Default
    Message = "Nom du fichier contenant les données à copier (classeur1 par défaut)"
    Default = "classeur1.xls"
    titre = "Copie des données du jour"
    FichOrigine = InputBox(Message, titre, Default)
    Windows(FichOrigine).Activate
    Sheets("Détail_ruptures").Activate
     
    Selection.AutoFilter Field:=2, Criteria1:="199279"
    Range("A1:" & [A1].SpecialCells(xlCellTypeLastCell).Address).Select => erreu 1004
    Sheets("Détail_ruptures").Range("A1:" & [A1].SpecialCells(xlCellTypeLastCell).Address).Select => ne sélectionne que les données des 2 1ère lignes
    Selection.Copy
    End Sub
    Merci beaucoup pour votre aide
    Gaelle

  2. #2
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    bonjour

    apres ton filtre : pour selectionner tes lignes selectionnées :
    j'imagine 4 colonnes soit colonne D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:D" & range("A65536").end(xlup).row).SpecialCells(xlCellTypeVisible).Select
    Wilfried

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci Wilfried de t'intéresser à mon cas mais j'ai n'ai pas tout compris de ta réponse.
    Peux-tu expliquer d'avantage.
    Car en fait c'est le simple fait de commencer par Range.... qui pose Pb quand je veux accéder à la plage de l'autre feuille.

    A+

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    tu as bien dis que tu avais un fichier x et un fichier y d'ouvert ? et que le code partait du premier pour agir sur le deuxième ?

    dans ce cas, indique le nom du classeur y avant le nom de la feuille, parce que là, si le code est dans le classeur x, il cherche la feuille dans le classeur x si tu précises pas le classeur

    bref, quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("[nom_du_fichier].xls").Sheets("Détail_ruptures").Range("A1:" & [A1].SpecialCells(xlCellTypeLastCell).Address).Select
    vu que tu utilises des plages de deux classeurs, spécifie les chemins complets pour chacune des plages

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci Maluje pour ton retour,
    mais ça ne marche pas comme tu le dis.
    Peut-être que je paramètre mal l'accés à mes différentes feuilles de mes classeurs.

    Tu serais vraiment sympa si tu pouvais me donner un code simple qui marche chez toi (que je pourrais tester chez moi ) où, pour être la plus claire possible,

    1) le code serait dans un bouton de la feuille 1 du fichier F1

    sur clic de ce bouton le code ferait :

    2) un filtre sur la feuille 1 du fichier F2
    3) une sélection des lignes après filtrage avec la cde que l'on connaît bien
    4) une copie de cette sélection (ligne de titre et lignes resultantes du filtre)
    5) un collage sur la feuille 2 du fichier F1

    ça m'aiderais vraiment à comprendre ce qui ne va pas
    Merci d'avance
    Gaelle

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    J'ai pas testé mais ça doit ressembler plus ou moins à ça.
    Modifie les noms de classeurs/feuilles et les colonnes pour ton cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub bouton_clic()
    Dim taille As Integer
     
    'tu selectionnes le classeur F2 puis la feuille1 de ce classeur
    Workbooks("F2.xls").Activate
    Sheets("Feuille1").Select
     
    'On va compter la taille de ta zone à filter (ça évitera de tout copier)
    taille = WorksheetFunction.CountA(Columns("A:A")) 'Si A est une colonne qui contient des données non vides
     
    ' tu sélectionnes la plage (ici, les colonnes A à D, limitées au nombre de ligne remplies)
    Range("A1:D" & taille).Select
     
    'tu appliques ton filtre sur cette selection (j'ai repris ce que tu as mis dans ton code)
    Selection.AutoFilter Field:=2, Criteria1:="199279"
     
    'tu sélectionnes les cellules filtrées
    Range("A1:D" & taille).SpecialCells(xlCellTypeVisible).Select
     
    'on les copie
    Selection.Copy
     
    'Tu séléctionnes le classeur F1 puis la feuille 2 puis la cellule A1
    Workbooks("F1.xls").Activate
    Sheets("Feuille2").Select
    Range("A1").Select
     
    'et tu copies
    ActiveSheet.Paste
     
    End Sub

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    C'est bien ce que je craignais j'ai l'erreur 1004 Erreur définie par l'application ou par l'objet sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:M" & taille).Select
    En plus j'ai remarqué que la taille est égale à 0 avec la ligne suivante j'ai pris B:B car A contient des valeurs vides :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taille = WorksheetFunction.CountA(Columns("B:B"))
    Une idée ?
    Gaelle

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    si taille = 0, c'est normal qu'il bloque sur la ligne d'avant (puisqu'il cherche à selectionner une plage "A1:M0")

    a priori, il fait référence à la colonne B de la feuille où se trouve le bouton
    essaye avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taille = WorksheetFunction.CountA(Workbooks("F2.xls").Sheets("Feuille1").Columns("B:B"))

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Puisque tu copies ta ligne d'en-tête, teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Range("A1").CurrentRegion.Select 'je crois que le select est exceptionnellement utile ici
    Selection.copy
    Workbooks("F1.xls").Activate
    Sheets("Feuille2").Select 'tu adaptes le nom de la feuille où tu colles
    Range("A1").Select
    ActiveSheet.Paste
    Tu peux sans doute simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A1").CurrentRegion.Select 'je crois que le select est exceptionnellement utile ici
    Selection.copy Workbooks("F1.xls").Sheets("Feuille2").Range("A1")
    Plus c'est mieux court, plus mieux c'est bien
    Bref, teste les deux.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/07/2011, 17h13
  2. Réponses: 10
    Dernier message: 06/05/2010, 20h51
  3. Réponses: 5
    Dernier message: 22/12/2009, 11h59
  4. [D7] comment ne pas modifier des lignes d'1 TStringGrid
    Par raoulmania dans le forum Composants VCL
    Réponses: 5
    Dernier message: 15/12/2005, 07h28
  5. Copier des lignes d'une table
    Par thomas_strass dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 01/07/2005, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo