Règlage d'une macro

bonjour,

je me permets de vous soumettre à nouveau un fichier dont la macro me pose un petit souci.

Celle ci a été en grande partie écrite par gmb, que je salue au passage et que je remercie

J'ai ajouté quelques adaptations.

Mon souci :

1/j'ai ajouté 3 critères de tri supplémentaires et pour ce faire, j' ai intégré le "généré" d'une macro mais je crois qu'on peut avoir le même résultat mais avec un "code" plus simplifié au niveau du tri

2/mon fichier exemple, onglet "ENCOURS" présente entre autres les lignes 13 à 16 qui répondent à ma sélection et qui doivent faire l'objet du transfert sur l'onglet HISTO

Dans ce contexte (où les 4 lignes correspondantes à la sélection) sont en queue de fichier, le transfert ne se fait que pour les lignes numérotées 111 et 333 (colonne F) 222 et 444 restent en carafe!

Par contre ces 4 lignes si elles sont "noyées" dans le corps de l'onglet, ça marche !

merci de votre avis

sam

7fichier-test.xlsm (22.73 Ko)

Bonjour,

Sub Transfert()
    Dim i%, n%, iDisp%, wDisp As Worksheet
    With Worksheets("ENCOURS")
        If .Range("B4") = .Range("D4") Then
            n = .Range("A" & .Rows.Count).End(xlUp).Row
            Set wDisp = Worksheets("HISTO")
            iDisp = wDisp.Range("A" & wDisp.Rows.Count).End(xlUp).Row
            For i = n To 6 Step -1
                If .Range("H" & i) = .Range("A4") Then
                    iDisp = iDisp + 1
                    With .Range("A" & i).Resize(, 11)
                        .Copy wDisp.Range("A" & iDisp)
                        .Delete xlShiftUp
                    End With
                End If
            Next i
        Else
            MsgBox "terminez pointage en cours - abandon du transfert"
            Exit Sub
        End If
    End With
    'tri sur HISTO : notif (H4) date (A4) mont (G4) sens (J4)
    With wDisp.Range("A4:K" & iDisp)
        .Sort key1:=.Range("J4"), order1:=xlAscending, Header:=xlNo
        .Sort key1:=.Range("H4"), order1:=xlAscending, key2:=.Range("A4"), order2:=xlAscending, _
         key3:=.Range("G4"), order3:=xlAscending, Header:=xlNo
    End With
    wDisp.Activate
End Sub

Cordialement.

merci à MFerrand !

ça marche! et avec un code plus simplifié

Il va falloir que je comprenne ce que tu as fait dans la partie de la macro avant tri!

par contre je ne comprends pas le tri (qui fonctionne au demeurant!)

pourquoi y a t il 2 key1 et de plus les critères sont H, A, G, J alors qu'ils devraient être J, H, A, G

(en clair le J est en 1ere position alors qu'il devrait être en dernière!)

Question complémentaire (hors macro) :

L'onglet "encours" est un tableau que j'enrichis tous les jours par une saisie "manuelle" horzontale, cellule par cellule.

je souhaiterais que sur chaque ligne vide (juste avant la saisie), dans la 1ere cellule disponible (c'est une date), le système me pré-renseigne cette cellule avec la date de la cellule précédente avec le curseur positionné sur cette date de la ligne de saisie (au cas où je voudrais la modifier).

dernière question :

aurais tu un lien qui me permette de trouver des explications :

- en tapant une instruction vba, il me donne l'explication en clair

ou faut-il "aller à la pêche", instruction par instruction ?

merci beaucoup pour ton aide efficace

bien cordialement

sam

Bonsoir,

D'abord, pour les explications le premier moyen c'est l'aide. Ce n'est pas toujours très clair, surtout quand on débute, mais on y trouve tout de même pas mal de choses, la syntaxe à utiliser, des particularités à prendre en compte, et même quand on n'est pas débutant sa consultation reste plus qu'utile... Il faut apprendre à naviguer dedans, le plus souvent remonter vers l'objet concerné pour repartir de la liste de ses membres et arriver sur qu'on cherche effectivement.

Après tu as les cours et tutos de ce site et d'autres sites spécialisés : c'est à privilégier pour avoir une vue à la fois d'ensemble et pratique sur tout un domaine : les Userforms, tel contrôle particulier, les tableaux, les variables, les évènements de Feuille ou de Classeur, etc.

Pour le tri : pour une raison qui m'échappe Microsoft a fait en sorte que dès que tu enregistres une opération de tri, l'enregistreur te fourgue systématiquement la méthode de tri que tu avais qui est une méthode de l'objet Worksheet. Or la méthode d'origine, qui est celle de l'objet Range n'est pas moins efficace et s'écrit en général en une ligne... Jusqu'à présent, je n'ai vu qu'un cas où Worksheets.Sort s'imposait sur tri avec un critère particulier incorporé dans la définition d'un filtre (encore qu'il aurait peut-être été possible de trier avant pour filtrer ensuite l'ordre de tri étant automatiquement pris en compte par le filtre, mais bon, cela reste de toute façon un cas rare.

Pourquoi commencer par la fin ? Si tu faisais le tri sur un seul critère, une seule colonne à la fois, en ayant un tri sur plusieur colonnes avec une hiérarchie, il faut toujours commencer par le dernier critère de ta hiérarchie : par exemple tu trier sur Noms Prénoms, soit classement par Nom et pour un même nom par Prénom, tu tries d'abord sur les Prénoms, ils seront dans l'ordre, puis sur les Noms qui les reclasser mais sans toucher à l'ordre des Prénoms dans chaque Nom, alors que tu vois bien qu'à l'inverse le tri des prénoms en second ferait balader les Noms dans tous les sens.

C'est d'ailleurs ce que fait le code de la méthode, de façon transparente puisque tu ne fais que lui indiquer ta hiérarchie et elle s'occupe du reste.

Mais Range.Sort est limitée à 3 critères de tri, donc comme tu en as 4, il faut faire 2 tris succesifs, mais en commençant par la fin.

1er tri pour le critère 4 (en clé1), 2e tri pour les critères 1, 2 et 3 (clés 1, 2, 3).

On aurait pu tout aussi bien faire : 1er tri : critères 3 et 4 (clés 1 et 2), 2e tri : critères 1 et 2 (clés 1 et 2), pour le même résultat...

Pour le reste tu as vu que le défaut essentiel était que tu supprimais des lignes avec une boucle croissante, donc en aval de ton cheminement ce qui te crée quelques obstacles pour arriver au bout. Il faut toujours supprimer en remontant dans une boucle For... Next, cela ne touche pas les lignes en amont, et la ligne finale reste inchangée.

J'ai maintenu le copier-coller au lieu de l'affectation directe, car cela permettait de coller le format.

Pour ce qui est de ta date, tu peux programmer l'évènement SelectionChange pour que lorsque tu te places dans la colonne Date, si la cellule est vide et la cellule précédente occupée, elle te mette automatiquement la valeur de cette cellule.

Mais il me semble qu'on t'avait donné un code pour le faire, ou je confonds ?

Cordialement.

merci de m'avoir consacré ce temps !

et merci pour toutes tes explications

pour la date,on m'a donné une macro (ce que je savais déjà faire) mais que je ne voulais pas, parce cela ne correspondait pas à ce que je voulais faire)

merci encore

à bientôt sans doute sur le forum

cordialement

sam

Rechercher des sujets similaires à "reglage macro"