Microsoft 365 creation petit macro ordre croissant

blancolie

XLDnaute Impliqué
Bonsoir le Forum,

Dans ce fichier, j'aimerais avoir dans un module, une petite macro qui rangera mes plantes par ordre croissant quand il y aura un rajout d'une nouvelle plante ( nouvelle ligne)

la colonne à mettre en ordre croissant, c'est la colonne F et à partir de F27. Bien sur, j'espère que cela ne mélangera pas les données à côté.

Pouvez-vous me mettre le code dans votre message si au cas ou je n'arrive pas à ouvrir le fichier.

En vous remerciant d'avance.

Cordialement.
 

Pièces jointes

  • BDD_Fleurs.xlsm
    89.1 KB · Affichages: 39
Solution
Re,

Le tri est fait par une autre méthode ; cette fois, j'ai testé, et ça marche !
:)

Fais un essai : clique sur le bouton « Copier » ➯ ta nouvelle plante carnivore « Crocus
cracoucass (carnivorus) » a été ajoutée sous la dernière ligne du tableau, en ligne 470 ;
puis le tableau a été trié selon le nom de plante, par ordre croissant ➯ la ligne 470 a
été remontée en ligne 121 ; et ton « curseur » va devant cette ligne, en E121.

Essaye de me donner ton avis ... enfin, si tu es saine et sauve, et que tu ne t'es pas fait
bouffer par la plante cracoucass (c'est très dangereux, l'élevage des plantes exotiques,
surtout les plantes carnivores ! :p).


Code VBA complet :
VB:
Option...

blancolie

XLDnaute Impliqué
Bonsoir Soan,

j'ai renommé un fichier et j'ai adapté ton code et j'ai juste cette ligne la qui m'embête car elle me met en defaut :

.SortFields.Clear: .SortFields.Add Range("T_Datas[[#all]],[plantes]]"), 0, 1

peux tu deja m'expliquer que veut me dire sile 0, 1 et me dire ou est mon problème

en te remrciant d'avance
 

Pièces jointes

  • Création de Devis.xlsm
    160.7 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Bonjour blancolie,

Désolé d'avoir tardé à te répondre ; j'ai été pris par des affaires personnelles.

Je te laisse essayer le fichier joint (non testé ; je t'en laisse le soin ;)).


--------------------------------------------------------------------------------------

J'ai remplacé ton instruction :

.SortFields.Add Range("T_Datas[[#all]],[plantes]]"), 0, 1

par celle-ci :

.SortFields.Add Range("T_Datas[[#All],[Plantes]]"), 0, 1

Petit jeu des différences : compare le nombre de crochets, et leur position. :p

--------------------------------------------------------------------------------------

Tu as écrit : « Peux-tu déjà m'expliquer ce que veulent dire 0 et 1 ? »

* le 0 est la constante numérique de : xlSortOnValues

* le 1 est la constante numérique de : xlAscending


--------------------------------------------------------------------------------------

De plus, tu avais oublié de mettre b à 1 dans cette partie :
VB:
  If Not cel Is Nothing Then
    lig = cel.Row: b = 1 'plante trouvée
C'est grâce à cela que plus bas, les instructions qui sont dans ce test :
If b = 0 Then ... End If ne seront pas exécutées (et c'est bien ça
qu'il faut ! :))


--------------------------------------------------------------------------------------

Merci de m'indiquer, ci-dessous, dans ton prochain post,
si c'est ok, ou s'il faut une autre adaptation. ;)


soan
 

Pièces jointes

  • Création de Devis.xlsm
    159.9 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
Ajout :

Je n'oublie pas la discussion du filtrage, mais ça va encore tarder car
je suis encore très pris par des choses diverses (persos), et d'autres
exos du forum ; aussi, je m'en occuperai dès que je pourrai.


soan
 

soan

XLDnaute Barbatruc
Inactif
@blancolie

J'étais sur un autre exo, et j'viens d'voir ton post #20. ;)

regarde la ligne Dim :

Dim cel As Range, plante$, lig&, b As Byte, i As Byte

1) tu peux voir que b est du type Byte (valeurs de 0 à 255)

2) quand la ligne Dim est exécutée, ça réserve de la place en mémoire (RAM)
pour les variables indiquées, et ça les initialise à une chaîne de caractères vide
("") pour les variables de type String ; à 0 pour les variables numériques (ceci
pour les variables locales d'une Sub ou d'une Function)
; donc pour b, il vaut
implicitement 0, sans que j'aie besoin de mettre explicitement b = 0.

3) donc b = 0 ; et c'est moi qui lui donne cette signification : quand b vaut 0,
ça veut dire que la plante n'a pas été trouvée.

4) maintenant, regarde cette partie de code :
VB:
  Set cel = Columns(6).Find(plante, , -4163, 1, 1)
  If Not cel Is Nothing Then
    lig = cel.Row: b = 1 'plante trouvée
  Else
a) l'instruction avec .Find cherche le nom de la plante dans la colonne F.

b) cel vaut Nothing (rien) si la plante n'a pas été trouvée, et dans ce cas,
ça exécute la partie du Else.

c) si au contraire la plante a été trouvée, cel est la cellule où le nom de la plante a
été trouvé, donc ça exécute : lig = cel.Row ➯ lig est le n° de la ligne de la cellule
de la plante trouvée ; et b = 1, pour indiquer que la plante a bien été trouvée ;
dans ce cas, ce sera une modification et pas un ajout en fin de tableau ; et ce ne
sera pas nécessaire de trier à nouveau le tableau puisque ça avait déjà été fait
au moment de l'ajout de cette plante (quand elle n'existait pas encore dans
ton tableau des plantes)
.

5) il aurait été possible de faire la même chose avec Dim b As Boolean : b est de
type Booléen, donc il est initialisé à False (Faux = 0) et je l'aurais mis à True
(Vrai = -1) ; mais un Boolean est sur 2 octets alors qu'un Byte est sur 1 seul
octet ; plus bas, le test aurais été : If b = False Then ou If Not b Then.

--------------------------------------------------------------------------------------------

à petite question, très longue réponse ; mais au moins, comme ça, tout sera clair !
enfin, j'espère ! :rolleyes: (j'croise les doigts) ... quelle est ta question suivante ? :p:D


soan
 

soan

XLDnaute Barbatruc
Inactif
dans mon fichier du post #11, il y a aussi : If b = 0 Then ... End If

attention : ne confonds pas le test If b = 0 avec une affectation de valeur b = 0

pour l'explication du test If b = 0 : relis mon post #21 ; et en particulier le point 4) c) ;
car s'il s'agit d'une modification d'une ligne de plante (et non pas d'un ajout), ce sera inutile
de trier à nouveau T_Datas, et le test
If b = 0 permet justement d'éviter ce tri, ainsi que
la 2ème recherche de la ligne de la plante (car elle a été déplacée suite au tri) pour pouvoir se
placer devant : « curseur » en début de ligne, colonne E (donc ça aussi est évité).

note bien qu'en cas de modif, avec
lig = cel.Row : lig contient bien déjà le bon
de ligne ; donc même alors que
If b = 0 Then ... End If n'est pas exécuté :
Application.Goto Cells(lig, 5), True place bien le « curseur » au bon endroit. :)

soan
 

soan

XLDnaute Barbatruc
Inactif
ok, c'est le post #18, et donc le fichier "Création de Devis.xlsm" ;
dans ce fichier, en K5, il y a : « Abutilon x canadensis » ; dis-
moi, c'est pas une plante qui existe déjà dans T_Datas ? si oui,
indique-moi sur quelle ligne, car j'ai pas envie de chercher ça
à ta place !


soan
 
Dernière édition:

Discussions similaires

Réponses
23
Affichages
1 K
  • Résolu(e)
Microsoft 365 EXCEL VBA
Réponses
3
Affichages
632

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 182
dernier inscrit
savio