Copier colonne en fonction chiffre dans une autre

Bonjour a tous,

mon soucis est le suivant :

j 'ai un gros fichier avec des lignes a copier si le chiffre de la colonne b supérieur a 1. idem pour la colonne f sans rapport entre les 2 colonnes.

pour résumer si le chiffre est supérieur à 1 dans une des 2 colonnes copier la ligne dans la feuille "tableau"

par avance merci avec une formule j 'y arrive mais vu la taille de mon fichier , vba semble mieux adapte

et la je pèche

13test.xlsx (9.55 Ko)

Bonjour

Effectivement VBA sera beaucoup plus rapide et mieux adapté !

Un essai à tester en réel... !

'   ---------------------------------------------
'   Code Commenté dans le respect du principe jmd
'   (c)GLI73, 2019
'   ---------------------------------------------

Sub CopierSupUn()
'   Declarations des onglets en type Objet pour accelerer les traitements des onglets
Dim wsMatrice   As Object   '   ws (pour WorkSheet) suivi du nom de l'onglet
Dim wsTableau   As Object

'   Declaration de 2 variables "logique" pour savoir si un traitement est realisé
Dim matriceVide As Boolean
Dim tableauVide As Boolean

'   Declaration de 2 tableaux (aans dimension - donc de type Variant - pouir pouvoir s'adapter automatiquement au volume de donnees)
Dim tabMatrice()    '   Tableau des donnees de l'onglet [matrice]
Dim tabTableau()    '   -       contenant le resultat => sera copié dans l'onglet [tableau]

Dim cptLig, cptCol  '   Compteur de ligne et de colonne
Dim colOne, colTwo  '   Colonne "un" et "deux" à comparer > 1
Dim nbrLig          '   Nombre de ligne totalisee > 1

Dim ligDeb, colDeb  '   Ligne et colonne de debut   des donnees dans [matrice]
Dim ligFin, colFin  '   Ligne et colonne de fin     ..
Dim ligRef, colRef  '   Ligne et colonne de reference pour connaitre le nombre de lignes et colonnes de [matrice]

    '   Initialiser les onglets
    Set wsMatrice = Worksheets("matrice")
    Set wsTableau = Worksheets("tableau")

    '   Mettre les variables "traitement" a Faux
    '       (Nota : Theoriquement ces 2 lignes sont inutiles car les variables de type Boolean sont toujouts initialisées à Faux au moment de la déclaration)
    '       Mais pour plus de lisibilité dans le code on indique de cette manière "pour l'instant nous continuons le traitement"
    matriceVide = False
    tableauVide = False

    '   Sur l'onglet [matrice]
    '   =>  L'utilisation de With permet de travailler sur l'onglet sans avoir beoin de déplacmeent physique, ni d'affichage par Excel
    '       Ce procédé rend le code beaucoup plus rapide car l'affichage est l'un des traitements les plus lents d'Excel
    With wsMatrice
        ligDeb = 4  '   Ligne de debut des donnees ===> A adapter !!!!
        colDeb = 1  '   idem pour la colonne de debut

        ligRef = 3  '   idem pour la ligne de reference
        colRef = 1  '   idem pour la colonne ..

        '   Recherher la derniere ligne de donnees
        '       Rows.Count  permet de placer (virtuellement) le curseur sur la derniere ligne au sens Excel
        '       End(xlUp)   permet de deplacer (virtuellement) le curseur vers le haut (xlUp) - comme avec les touches [CTRL-HAUT]
        '       Row         permet de connaitre la ligne active
        '       ligFin      pointe donc la derniere ligne "utile" des donnees de [matrice]
        '   le . (point) devant CELLS pour indiquer que les actions se déroulent sur l'onglet du WITH
        ligFin = .Cells(Rows.Count, colDeb).End(xlUp).Row

        '   Si la derniere ligne utile 'ligFIn' Est > ou = à la premiere ligne des donnees Alors "il y a des donnees à traiter"
        If (ligFin >= ligDeb) Then
            '   Recherher la derniere colonne de donnees
            '   même explication que pour ligFIn avec xlToLeft correspondant à vers la gauche comme [CTRL-GAUCHE] et "column(s)" pour colonne(s)
            '   le . (point) devant CELLS pour indiquer que les actions se déroulent sur l'onglet du WITH
            colFin = .Cells(ligRef, Columns.Count).End(xlToLeft).Column

            '   Si la derniere colonne 'colFin' Est > à la premiere colonne des donnees Alors "il y a des donnees à traiter"
            If (colFin > 1) Then

                colOne = 2  '   1ere colonne de recherche ===> A adapter !!!!
                colTwo = 3  '   2eme colonne de recherche ===> A adapter !!!!

                nbrLig = 0  '   pur l'instant aucune ligne n'est traitee

                '   Initialiser le tableau des donnees de [matrice]
                tabMatrice = Range(.Cells(ligDeb, colDeb), .Cells(ligFin, colFin))

                '   Pour 'chaque ligne' de ce tableau   ubound(... , 1) donne le nombre de lignes d'un tableau
                For cptLig = 1 To UBound(tabMatrice, 1)

                    '   Si l'une des colonnes de recherche donne un resultat positif Alors Ajouter une ligne dans le tableau resultat
                    If (tabMatrice(cptLig, colOne) > 0) Or (tabMatrice(cptLig, colTwo) > 0) Then
                        nbrLig = nbrLig + 1     '   Une ligne de plus est triatee
                        '   Redimensionner le tableau resultat en preservant (Preserve) les donnees precedentes
                        '   Nota :  Le tableau resultat est dimensionner à l'envers colonne,ligne et non lignee,colonne
                        '           Cette "inversion" est obligatoire car VBA ne permet de redimensionner que la derniere dimension d'un tableau
                        ReDim Preserve tabTableau(1 To colFin, 1 To nbrLig)

                        '   Pour 'chaque colonne'
                        For cptCol = 1 To colFin
                            '   Copier dans le tbaleau resultat la donnee de cette colonne(cptCol) de cette ligne(cptLig) du tableau des donnees
                            tabTableau(cptCol, nbrLig) = tabMatrice(cptLig, cptCol)
                        Next    '   Colonne suivante
                    End If  '   Fin Si l'une des colonnes...
                Next    '   Ligne suivante

                '   Si la 1ere dimension du tableau est 0 (zero) le tableau resultat est vide car jamais redimensionner
                tableauVide = Not (UBound(tabTableau, 1) > 0)

            Else    '   Sinon
                matriceVide = True  '   aucune donnee puisqu'aucune colonne
            End If  '   Fin Si derniere colonne
        Else
            matriceVide = True  '   aucune donnee puisqu'aucune ligne
        End If  '   Fin Si dernier ligne
    End With    '   Fin de traitement de l'onglet [matrice]

    If matriceVide Then
        MsgBox "La matrice est vide => Aucun traitement réalisé !", vbInformation + vbOKOnly, "Désolé"
    Else
        If tableauVide Then
            MsgBox "La matrice ne comporte pas d'élément à copier => Aucun traitement réalisé !", vbInformation + vbOKOnly, "Désolé"
        Else
            '   Sur l'onglet [tableau] (toujours sans deplacement phyisique)
            With wsTableau
                Range(.Cells(1, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, .Cells(1, Columns.Count).End(xlToLeft).Column)).ClearContents
                '   Resize  permet de redimensionner (virtuellement) une cellule
                '       il faut indiquer le nombre de lignes et de colonnes pour povoir affecter les valeurs
                '       =>  Commme le tableau resultat est inversé il faut inverser aussi ce redimensionnement
                '           sans onublier d'inverser le tableau pour le remettre dans le bon sens (ligne/colonne)
                '   le . (point) devant CELLS pour indiquer que les actions se déroulent sur l'onglet du WITH
                .Cells(1, 1).Resize(UBound(tabTableau, 2), UBound(tabTableau, 1)) = WorksheetFunction.Transpose(tabTableau)
            End With    '   Fin de traitement de l'onglet [matrice]
        End If  '   Fin Si 'tableauVide'
    End If  '   Fin Si 'matriceVide'

    '   Ne pas oublier de libérer les variables de types Objet !!!
    Set wsTableau = Nothing
    Set wsTableau = Nothing

End Sub

PS/ Pour les besoins du test j'ai mis > 0 comme condition des test "de copie" mais il faudra les adapter selon ton besoin car ta formulation était

si le chiffre est supérieur à 1 dans une des 2 colonnes

alors que dans la PJ rien n'est > 1

Salutations

Bonjour

un grand merci effectivement sa va beaucoup plus vite un grand merci a toi pour se travail

bravo bravo bravo

Bonjour

De rien

Mais as tu réussi à adapter à ton cas précis ?

oui merci encore

avec tes modifications je me rend compte qu'il est préférable pour moi de ne pas copier toutes la ligne mais juste certaine colonne de la ligne ou le chiffre est supérieure 1

autre soucis je souhaiterais garder ma mise en forme original dans la copie et la je rame

Bonjour

oui merci encore

Donc nous avons franchi une étape !

Quant à

autre soucis je souhaiterais garder ma mise en forme original dans la copie et la je rame

effectivement cela peut être une prérogative importante ! Le code que je t'ai proposé est un "test de résultat" pour vérifier dans un 1er temps si nous obtenons ce que nous voulons. Maintenant il faut passer à la mise en forme !

Je regarde... et je reviens...

Bonjour

Après lecture de ton fichier je constate que :

Il n'y a pas de ligne de libellés de colonnes (Est-ce pour la confidentialité des infos) ?

Car j'ai besoin dans mon code d'une "ligne de référence" pour connaitre le nombre de colonnes cf.

    With wsMatrice
        ligDeb = 4  '   Ligne de debut des donnees ===> A adapter !!!!
        colDeb = 1  '   idem pour la colonne de debut

       ligRef = 3  '   idem pour la ligne de reference      <=============
        colRef = 1  '   idem pour la colonne ..
        ....

la colonne s 'appelle nombre 1 en b3 ainsi de suite

encore merci pour ton travail

le fichier avec nom des colonnes

cdt

7classeur1.xlsx (16.06 Ko)

Bonjour

Ok pour les noms de colonnes !

2ème étape => 2ème question

autre soucis je souhaiterais garder ma mise en forme original dans la copie et la je rame

la "forme originale" veut il dire le format que dans l'onglet [Feuil1] copié à l'identique (colonnes à copier seulement) ?

oui c 'est sa

Rechercher des sujets similaires à "copier colonne fonction chiffre"