Microsoft 365 VBA: trier des cellules

  • Initiateur de la discussion Initiateur de la discussion Aloha
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Aloha

XLDnaute Accro
Bonjour,

Dans le fichier en annexe je voudrais trier le bloc bleu pour que les lignes vides disparaissent.

Les lignes vides proviennent de la copie d'un bloc de cellules qui sont liées deux par deux verticalement. L'action de copier lève la liaison de sorte qu'une ligne sur deux est vide.

J'ai essayé de transformer du code enregistré lors du triage du bloc jaune, mais cela ne fonctionne pas.

A préciser qu'après le bloc bleu il y aura une multitude d'autres blocs et j'ai donc besoin d'une solution passe-partout.

Bonne journée
Aloha
 

Pièces jointes

Aloha à vous,
Essayez de lancer la sub ci-dessous après chaque "copier/coller" concerné
VB:
Sub Tri_Me()
    With ActiveSheet.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("B2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("A2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
 
Bonjour

Peux-tu expliciter ta demande.

S'il s'agit de faire seulement un tri tu peux très facilement passer par Données/Trier après avoir sélectionner la zone sur laquelle doit porter le tri. C'est immédiat à moins que je n'aie pas tout perçu.

Les lignes vides vont toutes être regroupées à la fin donc plus faciles à supprimer je suppose.

S'il s'agit d'éviter de sélectionner une à une les lignes vides pour les supprimer la solution me semble satisfaisante.

Autre recette : tu peux démarrer l'enregistrement d'une macro avant de faire les manip à la main; une fois l'enregistrement terminé libre à toi de reprendre la macro proposée par Excel pour l'adapter à ton besoin.

Bonne réception
 
Bonjour,

@"fanch55":
Merci pour le code! Il fonctionne comme il faut!

@"juvaxe": il faut absolument faire le tri par VBA: des blocs comme dans le fichier, qui 'étendent en réalité sur un mois entier (avec donc 30 ou 31 lignes vides) il y en a plus de 130 qui sont copiés tous les mois par VBA.

J'ai enregistré l'action, mais j'ai trébuché lorsqu'il fallait remplacer les références fixes comme A4:A65.

Bien à vous
Aloha
 
Bonjour,
Ma prochaine tâche est de copier "Nom2" dans les cellules A10:A15.
Comment faire pour définir cette rangée? Mon problème est que je dois me référer à 2 colonnes différentes: pour A10 c'est la première cellule libre en A, mais pour A15 je dois me baser sur l'une des autres colonnes.
Bonne journée
Aloha
 

Pièces jointes

Bonjour,
Pour répondre à la demande dans l'absolu (code jetable):
VB:
Sub Set_Nom()
Dim LastRow As Long, Ligne As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Ligne = Range("B2:B" & LastRow).Find("*", , , , xlByColumns, xlPrevious).Row + 1
    Range("B" & Ligne & ":B" & LastRow) = "Nom2"
End Sub

Mais après réflexion en analysant les 2 demandes, 🤔
je pense que le mieux serait de faire l'action suivante lors du coller du bloc externe :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Last_Action As String, A As Variant, Nom As String
   
    A = Split(Replace(Target.Address & "$$", ":", ""), "$")
   ' Bloc à exécuter que si la sélection concerne les colonnes A à F
    If A(1) = "A" And A(3) = "F" Then
        On Error Resume Next
            With Application.CommandBars("Standard")
                Last_Action = .Controls(.FindControl(ID:=128).Index).List(1)
            End With
        On Error GoTo 0
        If Last_Action = "Coller" Then
            Nom = InputBox("Entrez le nom pour le bloc collé")
            If Nom <> "" Then Selection.Columns(2) = Nom
            Tri_Me
        End If
    End If
   
End Sub
A mettre dans le code de la feuille.
 
Bonjour,
Merci pour ce code.
Entretemps je m'avais réussi à fabriquer qch moi-même.
"Nom2" représente ici le nom qui est sur chacune des 130 feuilles copiées. Il faut le prendre là après le triage et le coller dans la colonne B.

En ce moment je suis occupé à intégrer l'action de copier les données dans un code déjà existant qui parcourt toutes les feuilles de tous les classeurs pour y prendre des valeurs.
Ce qui permet de l'occasion où le code prend les valeurs dans une feuille pour copier en même temps tous les symboles.
 
En ce moment je suis occupé à intégrer l'action de copier les données dans un code déjà existant qui parcourt toutes les feuilles de tous les classeurs pour y prendre des valeurs.
Ce qui permet de l'occasion où le code prend les valeurs dans une feuille pour copier en même temps tous les symboles.
L'erreur 1004 indique que (probablement) le tri ne se fait pas sur la bonne feuille.
Le code ci-dessous est plus strict mais doit être appelé explicitement par l'une des 3 façons listées:
  • Tri_Me Sheets("Feuil1")
  • Tri_Me ThisWorkbook.Sheets("Feuil1")
  • Tri_Me Workbooks("nom du classeur.xlsm").Sheets("Feuil1")

VB:
Sub Tri_Me(Sh As Worksheet)
    MsgBox "On va trier la Feuille " & Sh.Name
    With Sh.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Sh.Range("B2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Sh.Range("A2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Sh.Range("A2:F" & Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
 
Je ne peux pas intégrer le code dans une Sub() existante?
Si , mais pas avec le mot-clé activesheet si vous êtes sur une autre ...
VB:
.......
.......
Dim Sh As Worksheet
Set Sh = Sheets("Feuil1")
    With Sh.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Sh.Range("B2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Sh.Range("A2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Sh.Range("A2:F" & Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
....
....
....
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour