XL 2016 Couper/coller avancé + SUPP ligne si possible

LumberJAAK

XLDnaute Nouveau
Bonjour à tous,

Après plusieurs recherches, je n'ai pas reussi à trouver une macro similaire a ce que je souhaite, c'est à dire du tri automatique récurant avancé j'ai envie de dire car à chaque fois que je trouver une macro c'était pour de la copie simple d'une plage defini, je pense que là le cas est un peu différent.
D'avance merci pour votre aide

explication de mon cas:

J'ai une colonne bleu avec des numéros allant de 1 à 3 dans l'exemple mais peuvent aller jusqu'à 6.
Toujours pour l'exemple , ces surlignez les trois lignes de différente couleurs.
Et j'aimerai réussir à déplacer des infos comme suit : La ligne avec le chiffre 1 en bleu ne bouge jamais, la ligne verte avec le chiffre 2 bleu va à la suite de la ligne 1 et la ligne orange avec le chiffre 3 bleu va à la suite de la ligne avec le chiffre 1 mais après la ligne au chiffre 2 déjà copier sur la ligne avec le chiffre 1.
Et que le tout se fasse sur tous le fichier. tous en supprimant les lignes déjà déplacées.

C'est un peu compliqué a expliquer comme ca mais avec le modèle ca sera plus compréhensible.
N'hésitez pas à me questionner si besoin.

Je ne sais pas si c'est faisable en VBA mais je demande quand même .

Je vous remercie encore par avance de votre aide

Un grand Merci

Cordialement,

ps: J'ai cherché partout et je n'ai malheureusement rien de trouver de similaire.
 

Pièces jointes

  • modele pour explication.xlsx
    53 KB · Affichages: 12
Solution
Bonjour,

Vous trouverez dans le fichier joint, la macro largement commentée suivante et qui fait le job.
Dans sa feuille 'Datas' cliquer sur le bouton bleu et Zou !!!
VB:
Sub AllignerConcessions()
    ' Feuille de destination des données alignées
    Dim WsDest As Worksheet
    '
    ' n° de ligne de données, destination  et n° de colonne destination
    Dim lgDatas As Long, lgDest As Long, colDest As Long
    '
    ' Référence de la concession en cours de traitement
    Dim Concession As String
    '
    ' N° du rang en cours de traitement
    Dim Rang As Integer

    With ThisWorkbook
        '
        ' Référencer la feuille destination
        Set WsDest = .Sheets("Destination")
        '
        ' Effacement éventuel des données...

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

24 vues, pas une réponse, bon, je ne suis pas le seul à ne rien comprendre à votre problème.

Trier ? sur quelle base ? 1,2,3 ? facile.
copier ? sur quel critère ?
Supprimer ? sur quelle base ?

Garder le premier élément de chaque concession ?

votre fichier n'est pas plus parlant.

cordialement
 
Dernière édition:

LumberJAAK

XLDnaute Nouveau
Je l'accorde je suis pas doué en explication. J'annexe trois fichiers qui montre le cheminement souhaitée en espérant que ce soit plus parlant que moi cherchant à m'expliquer.
Si ce n'est pas le cas je travaillerai sur mon explication différemment afin d'être compris.
En tout cas merci de m'avoir prévenu.

Ceci est un exemple sachant que certaines concessions peuvent avoir un RANG qui va jusqu'à 6 et sur un fichier d'un peu moins de 5000 lignes
 

Pièces jointes

  • Déplacement des informations.xlsx
    12.3 KB · Affichages: 4
  • Fichier de départ.xlsx
    12.5 KB · Affichages: 4
  • Fichier final souhaiter.xlsx
    11.8 KB · Affichages: 3

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

En fait, d'après vos fichiers, vous souhaiter uniquement conserver les rangs 1 pour chaque concession. Pourquoi cette histoire de déplacement ?

Ci joint, votre fichier départ avec une extraction par power query, les données sont triées par Concession et Rang en ordre ascendant et Filtrées ensuite en ne conservant que les Rangs 1.

Cordialement

P.S. seul un seul fichier avec 3 feuilles était nécessaire.
 

Pièces jointes

  • PQ-Fichier de départ.xlsx
    50.6 KB · Affichages: 3

LumberJAAK

XLDnaute Nouveau
Re,

Oui c'est bien ce que je recherche à la fin sauf que les données de C à X du rang 2 aille de Y à AT du rang 1 et que les données C à X du rang 3 aille de AU à BP du rang 1 et anisi de suite si la colonne rang va de 1 à 6

Au lieu d'avoir 3 Ligne pour la même concession, je souhaiterai avoir une seul ligne avec les informations des rang 2 et 3 à la suite du RANG 1 .

Dans votre fichier que vous m'avez transmis, je n'ai pas les infos des rang 2 et 3 à la suite du rang 1.

Est ce possible quand même ??

Merci

Cordialement ,
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

En fait c'est une transposition que vous voulez, pour avoir toutes les données d'une concession sur une seule ligne. Je vais voir ce que je peux faire.

Une fois fait, je rééditerai ce message pour y inclure la proposition.

cordialement
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Vous trouverez dans le fichier joint, la macro largement commentée suivante et qui fait le job.
Dans sa feuille 'Datas' cliquer sur le bouton bleu et Zou !!!
VB:
Sub AllignerConcessions()
    ' Feuille de destination des données alignées
    Dim WsDest As Worksheet
    '
    ' n° de ligne de données, destination  et n° de colonne destination
    Dim lgDatas As Long, lgDest As Long, colDest As Long
    '
    ' Référence de la concession en cours de traitement
    Dim Concession As String
    '
    ' N° du rang en cours de traitement
    Dim Rang As Integer

    With ThisWorkbook
        '
        ' Référencer la feuille destination
        Set WsDest = .Sheets("Destination")
        '
        ' Effacement éventuel des données déjà existantes.
        With WsDest.Range("A1").CurrentRegion
                If .Rows.Count > 1 Then .Offset(1).Resize(.Rows.Count - 1).ClearContents
        End With
       
        '
        ' Travailler à partir de la feuille Datas
        With .Sheets("Datas")
            '
            ' Travailler sur l'intersection de la région occupée par le tableau et les colonnes A à X
            With Intersect(.Range("A1").CurrentRegion, .Range("A:X"))
                '
                ' Trier les données sur 'Concession' et 'Rang'
                .Sort Key1:=.Range("A2"), Order1:=xlAscending, Key2:=.Range("B2"), Order2:=xlAscending, Header:=xlYes
                '
                ' Balayer les lignes de la zone
                For lgDatas = 2 To .Rows.Count
                    '
                    ' Récupération du rang en cours
                    Rang = .Cells(lgDatas, 2)
                    '
                    ' Calcul du n° de colonne de destination
                    colDest = 22 * (Rang - 1) + 3
                    '
                    ' si la concession a changé
                    If Concession <> .Cells(lgDatas, 1).Value Then
                        '
                        ' retenir la référence
                        Concession = .Cells(lgDatas, 1).Value
                        '
                        ' récupérer le prochain numéro de ligne non occupée dans la destination
                        lgDest = WsDest.Cells(Rows.Count, 1).End(xlUp)(2).Row
                        '
                        ' copier par valeur la référence et le rang (1) dans les deux premières colonnes
                        WsDest.Cells(lgDest, 1).Resize(, 2).Value = Array(Concession, Rang)
                    End If
                    '
                    ' Copier par valeur les 22 colonnes suivantes dans la destination
                    WsDest.Cells(lgDest, colDest).Resize(, 22) = .Cells(lgDatas, 3).Resize(, 22).Value
                Next
            End With
        End With
    End With

End Sub

bonne continuation
 

Pièces jointes

  • Fichier de départ.xlsm
    31 KB · Affichages: 6

LumberJAAK

XLDnaute Nouveau
Bonjour,

Un grand merci à vous pour tout. C'est super cool d'avoir bien commenté, ce qui me permettra de comprendre le processus et de possiblement le réadapter en fonction de mes besoins.
Je viens d'arriver au boulot mais je dois déjà partir pour une formation toute la journée, donc je testerai ce soir et je vous tien au courant.

Encore Merci

Bonne journée

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
314 718
Messages
2 112 177
Membres
111 452
dernier inscrit
christine64