Copier les premières lignes des données visibles après un filtre

Bonjour à tous,

Je suis en train de créer un nouvel affichage pour communiquer les défauts observés lors du contrôle qualité.

L'import des données est bon, le format d'affichage a été défini.

La seule chose qu'il me manque c'est la copie des données de la base de données vers l'onglet affichage que j'imprime ensuite.

    Sheets("Interface").Select

    Nblignes = Range("F2").Value

    FiltreMachine = "C1:C" & Nblignes
    FiltreDate = "B1:B" & Nblignes
    FiltreHeure = "F1:F" & Nblignes
    Plage = "A1:O" & Nblignes
    'Ces variables permettront de trier/filtrer l'ensemble du tableau

    Sheets("BDD").Select
    ActiveSheet.Range(Plage).AutoFilter Field:=7, Criteria1:=Array( _
        "Comp gazeuse", "DL", "FC", "FD", "FP", "FST", "Prédécoupe", "SL", "SL PLI", "SL SD", "ST", "ST PLI", "ST SD", "ST/SL", "Zip", "Zip SD" _
        , "="), Operator:=xlFilterValues

    ActiveWorkbook.Worksheets("BDD").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("BDD").Sort.SortFields.Add Key:=Range(FiltreMachine), _
        SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="F5", _
        DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("BDD").Sort.SortFields.Add Key:=Range(FiltreDate), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("BDD").Sort.SortFields.Add Key:=Range(FiltreHeure), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("BDD").Sort
        .SetRange Range(Plage)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

        'Toujours le même problème : Si la ligne 5 est masquée car défaut non sélectionné, la ligne sera quand même copiée
        'Je voudrais sélectionner uniquement les 10 premières lignes 

Range("A1").Select
    ActiveCell.Offset(10, 0).Activate
    'DLig = Cells.SpecialCells(xlCellTypeVisible).Row
    Nbrow = ActiveCell.Row

Je cherche à copier les données des 10 premières lignes, colonne par colonne (l'ordre des colonnes n'est pas le même sur les deux onglets.

bdd

Onglet source

controle

Onglet cible

exemple

Voici le format. Derrière les carrés, j'ai mi l'image des produits pour identifier s'il y a des zones récurrentes (Supprimées sur cette photo dans un soucis de confidentialité). Les numéros sont affectés dans les carrés via formules et macro.

Avez-vous une idée d'une ligne de code permettant de sélectionner uniquement les 10 premières données visibles ? J'ai trouvé des informations avec Array mais je n'arrive pas à l'appliquer.

J'essaye de trouver une solution pour récupérer le numéro de ligne de la 10ème ligne visible, sans succès.

Merci d'avance pour votre aide :)

Quentin

Bonjour,

Avez-vous une idée d'une ligne de code permettant de sélectionner uniquement les 10 premières données visibles ? J'ai trouvé des informations avec Array mais je n'arrive pas à l'appliquer.

J'essaye de trouver une solution pour récupérer le numéro de ligne de la 10ème ligne visible, sans succès.

Essayez ceci

            Set f1 = Sheets("BDD")
            DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille BDD non filtrée

            Prem_Ligne = 2 'première ligne du tableau, hors ligne des titres
            'sélection et copie de la zone filtrée sans les titres
            Range(f1.Cells(Prem_Ligne, "A"), f1.Cells(DerLig_f1, "O")).SpecialCells(xlVisible).Copy  'indiquez ici  la destination

            Cpt = 1 'initialisation d'un compteur de lignes visibles
            For l = 2 To DerLig_f1
                If Rows(l).Height > 0 And Cpt = 10 Then 'si la ligne est visible et le compteur est égal à 10
                    Lig = l 'on récupère le numéro de la 10ème ligne visible
                    Exit For
                ElseIf Rows(l).Height > 0 And Cpt < 10 Then 'sinon, on incrémente le compteur
                     Cpt = Cpt + 1
                End If
            Next l

A adapter à vos données

Cdlt

Bonjour Arturo,

Est-ce que je suis obligé de passer par l'étape "copier les données visibles dans un autre onglet" qui créé une étape supplémentaire (il faudra également que je supprime ces données après du coup) ?

Je suis en train de créer cet affichage et ce code pour une ligne de production, le projet final est de déployer ce support sur 13 lignes. Je cherche donc à faire un fichier "léger" et une macro qui mettra toutes les données à jour rapidement (pas de perte de temps pour la personne qui sera chargée d'actualiser l'affichage).

Autre question : A quoi sert cette ligne ?

Set f1 = Sheets("BDD")

Je n'ai jamais utilisé le set auparavant, je faisais plutôt directement Sheets("BDD").Select

En attendant, ce code fonctionne parfaitement avec l'adaptation.

Merci beaucoup pour ton aide !

Je te mets le code que j'ai adapté :

            Set f1 = Sheets("BDD")
            'DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille BDD non filtrée
            'Prem_Ligne = 2
            'Range(f1.Cells(Prem_Ligne, "A"), f1.Cells(Nblignes, "O")).SpecialCells(xlVisible).Copy _
            Destination:=Sheets("Copie temporaire").Range("A1")

            'J'ai défini le Nblignes en début de macro, que j'obtiens avec un NBVAL. J'en ai déduis une plage de données : plage = "A1:O" & Nblignes - 1
            Range(plage).SpecialCells(xlVisible).Copy _
            Destination:=Sheets("Copie temporaire").Range("A1")  ' -----> Cette étape est-elle obligatoire ? Si je procède de cette manière, je pense que je peux ensuite mettre directement Range("A2:A11").Copy pour prendre les 10 premières valeurs ? La boucle n'est dans ce cas pas obligatoire je pense

            Cpt = 1 'initialisation d'un compteur de lignes visibles
            For l = 2 To Nblignes
                If Rows(l).Height > 0 And Cpt = 10 Then 'si la ligne est visible et le compteur est égal à 10
                    Lig = l 'on récupère le numéro de la 10ème ligne visible
                    Exit For
                ElseIf Rows(l).Height > 0 And Cpt < 10 Then 'sinon, on incrémente le compteur
                     Cpt = Cpt + 1
                End If
            Next l
Est-ce que je suis obligé de passer par l'étape "copier les données visibles dans un autre onglet" qui créé une étape supplémentaire (il faudra également que je supprime ces données après du coup) ?

Non mais, c'est bien ce que vous vouliez au départ , non?

La seule chose qu'il me manque c'est la copie des données de la base de données vers l'onglet affichage que j'imprime ensuite.

Mettre le nom de la feuille en variable, cela évite de répéter à chaque fois "Sheets("BDD")"
**************************************************************************************************************************************

Cdlt

Je veux copier uniquement les données des 10 premières lignes, et non la plage entière (affichage des 10 derniers défauts constatés).

Je continue de faire des tests, et en fait je n'ai besoin que de la boucle que tu m'as proposé non ?

            Cpt = 1 'initialisation d'un compteur de lignes visibles
            For l = 2 To Nblignes
                If Rows(l).Height > 0 And Cpt = 10 Then 'si la ligne est visible et le compteur est égal à 10
                    Lig = l 'on récupère le numéro de la 10ème ligne visible
                    Exit For
                ElseIf Rows(l).Height > 0 And Cpt < 10 Then 'sinon, on incrémente le compteur
                     Cpt = Cpt + 1
                End If
            Next l

J'ajoute ensuite les colonnes et la zone où copier les données :

Range("B2:B"&Lig).Copy 'je ne peux pas utiliser directement la destination car je veux utiliser uniquement un copier valeurs
Sheets("Contrôle étanchéité").Select
    Range("A55").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Merci pour tes explications :)

Le soucis c'est que j'ai peur que ce soit un peu lourd à l'utilisation (8 colonnes * 13 lignes de production = 104 fois l'opération à terme)... Je verrais à l'utilisation !

Essayez ceci, sélectionne les 10 premières lignes filtrées et les recopies dans la feuille "Contrôle d'étanchéïté.

    Set f1 = Sheets("BDD") 'attribution de la variable f1 à la feuille "BDD"
    Set f2 = Sheets("Contrôle étanchéité") 'attribution de la variable f2 à la feuille "Contrôle étanchéité"
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille BDD non filtrée

    Prem_Ligne = 2 'première ligne du tableau, hors ligne des titres

    Cpt = 1 'initialisation d'un compteur de lignes visibles
    For l = 2 To DerLig_f1
        If Rows(l).Height > 0 And Cpt <= 10 Then 'si la ligne est visible et le compteur est égal à 10
            Lig = l 'on récupère le numéro des lignes visibles
            Cpt = Cpt + 1
        End If
    Next l
    Range(f1.Cells(Prem_Ligne, "A"), f1.Cells(Lig, "O")).SpecialCells(xlVisible).Copy
    f2.Range("A55").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Cdlt

Bonjour

Bonjour à tous

...code permettant de sélectionner uniquement les 10 premières données visibles ?

Un essai à tester et adapter...

10essai-v1.xlsm (18.56 Ko)

Bye !

Ce que tu viens de me proposer fonctionne parfaitement @Arturo ! Je pense que ce sera moins lourd à l'actualisation car je n'ai plus besoin de changer d'onglet à chaque fois (Sheets("Contrôle étanchéité").Select....).

Je suis quand même obligé de copier les données en 5 fois car les colonnes ne sont pas dans le même ordre (l'affichage a été défini avec l'ensemble de l'équipe, et la BDD où je vais chercher les données est utilisée pour d'autres actions donc impossible de modifier l'ordre).

Merci beaucoup pour ton aide

            Set f1 = Sheets("BDD")
            Set f2 = Sheets("Contrôle étanchéité")

            Compteur = 1 'initialisation d'un compteur de lignes visibles
            For i = 2 To Nblignes
                If Rows(i).Height > 0 And Compteur = 10 Then 'si la ligne est visible et le compteur est égal à 10
                    Ligne = i 'on récupère le numéro de la 10ème ligne visible
                    Exit For
                ElseIf Rows(i).Height > 0 And Compteur < 10 Then 'sinon, on incrémente le compteur
                     Compteur = Compteur + 1
                End If
            Next i

        Range(f1.Cells(2, "B"), f1.Cells(Ligne, "B")).SpecialCells(xlVisible).Copy
    f2.Range("A55").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Range(f1.Cells(2, "F"), f1.Cells(Ligne, "F")).SpecialCells(xlVisible).Copy
    f2.Range("B55").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Range(f1.Cells(2, "E"), f1.Cells(Ligne, "E")).SpecialCells(xlVisible).Copy
    f2.Range("C55").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Range(f1.Cells(2, "G"), f1.Cells(Ligne, "I")).SpecialCells(xlVisible).Copy
    f2.Range("D55").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Range(f1.Cells(2, "K"), f1.Cells(Ligne, "L")).SpecialCells(xlVisible).Copy
    f2.Range("G55").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

@gmb : J'ai également regardé ton fichier, je comprends le fonctionnement dans les grandes lignes mais j'ai un peu plus de mal avec les tableaux. Je le garde près de moi et je regarderai comment fonctionnent les différents arguments, ça me servira une prochaine fois

Je clôture le sujet, merci à tous les 2 !

Bonjour …

Si vous avez dit Tableau

Pour voir mon beau Tableau, regarder dans le fichier joint (garanti sans virus qui courent les rues).

Si c'est toi Quentin qui a mis en place le code donné, tu n'auras pas grand mal à analyser ma production.

Bonjour @Ordonc,

Oui je comprend bien le fonctionnement également ! L'application est intéressante pour un affichage "temporaire" pour l'utilisateur du fichier, mais mon besoin était de copier les données dans un autre onglet qui est ensuite imprimer.

Je garde quand même ton fichier dans un coin

A quoi correspondent les fonctions privées dans VBAProject (FUNCRES.XLAM) -> Modules -> RibbonX_Code ?

Je pense que ça ne m'était pas destiné.

Merci pour ton temps !

Quentin

Rechercher des sujets similaires à "copier premieres lignes donnees visibles filtre"