> Tous les forums > Forum Bureautique
 macro pour trier un tableau et effacer les lignes sans saisieSujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
jmsch
  Posté le 28/08/2014 @ 22:10 
Aller en bas de la page 
Petit astucien

Bonjour,

j'ai besoin d'un petit coup de main pour une macro. Cette macro doit fonctionner sur excel 2003 et 2010.
J'en ai faite une avec l'enregistreur de macro, elle fonctionne sur 2010 mais pas sur 2003.

Dans un classeur de ce type je voudrais effacer les lignes qui ne contiennent pas d'entrées ni de sorties.
Comme je ne sais pas le faire en filtrant les colonnes entrées sorties j'ai mis une mise en forme conditionnel couleur jaune si une entrée ou sortie est saisie.
Le but était de me servir de ca pour trier puis d'effacer les lignes sans saisie.

Une fois terminé je veux qu'il me reste uniquement les lignes coloré en jaune, trier par ordre alphabétique.

macro1 que j'ai pour trier

Range("A2:D200").Select
ActiveWorkbook.Worksheets("saisie").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("saisie").Sort.SortFields.Add Key:=Range("B2:B200") _
, SortOn:=xlSortOnCellColor, Order:=xlDescending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("saisie").Sort.SortFields.Add Key:=Range("B2:B200") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("saisie").Sort
.SetRange Range("A1:D200")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

macro 2 pour effacer les lignes vides sans saisie

Dim n(1) As Integer, i%
For i = 0 To 1
n(i) = Cells(200, i + 3).End(xlUp).Row + 1
Next i
Range("D200:A" & IIf((n(0) > n(1)), n(0), n(1))).Select
Selection.ClearContents
Range("E2").Select



Modifié par jmsch le 28/08/2014 22:12
Publicité
ferrand
 Posté le 28/08/2014 à 23:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonsoir,

Proposition :

Sub EffacerTrier()
Dim n%, i%
With ActiveSheet
n = .UsedRange.Rows.Count
With .Range("A2:D" & n)
For i = n To 2 Step -1
If .Cells(i, 3).Value = "" And .Cells(i, 4).Value = "" Then _
.Rows(i).Delete xlShiftUp
Next i
End With
n = UsedRange.Rows.Count
.Range("A2:D" & n).Sort key1:=.Cells(2, 2), order1:=xlAscending, Header:=xlNo
End With
End Sub

Non testée en l'absence de classeur modèle...

jmsch
 Posté le 29/08/2014 à 00:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Merci pour le test.

Fonctionne pas.
Vu la simplicité du classeur je ne l'ai pas joint.
Je vais voir demain comment faire pour mettre un classeur test en ligne.

ferrand
 Posté le 29/08/2014 à 01:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

jmsch a écrit :

Merci pour le test.

Fonctionne pas.
Vu la simplicité du classeur je ne l'ai pas joint.
Je vais voir demain comment faire pour mettre un classeur test en ligne.

En quoi ? Quelles commandes ? Erreurs d'exécution ou non ?...

Une image ne peut remplacer un classeur... On suppose à ton texte que les colonnes A à D sont utilisées, à partir de la ligne 1. Je n'utilise pas les colorations dans la macro, mais uniquement le contenu de C et D, supposées contenir une valeur ou rien, pour supprimer les lignes ne contenant aucune valeur en C et D, et trier ensuite sur le contenu de D. Il faut évidemment que ces actions soient bien celles que tu souhaites et que le classeur réponde à ces spécifications...

jmsch
 Posté le 29/08/2014 à 14:50 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

salut

voilà le lien du classeur http://cjoint.com/?0HDo54MoK3C

Pour info c'est dans l'onglet saisie. La macro qui fonctionne sous 2010 mais pas sous 2003 c'est trier.

Y a plusieurs autre macro qui elles fonctionnent.
Au final, quand elles fonctionneront toutes j'en ferais une synthèse.



Modifié par jmsch le 29/08/2014 14:56
corinthien
 Posté le 29/08/2014 à 20:29 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonsoir tout le monde.

@ferrand, ta macro fonctionne parfaitement après correction d'un petit oubli : le point devant le second UsedRange.

Sub EffacerTrier()
Dim n%, i%
With ActiveSheet
n = .UsedRange.Rows.Count
With .Range("A2:D" & n)
For i = n To 2 Step -1
If .Cells(i, 3).Value = "" And .Cells(i, 4).Value = "" Then _
.Rows(i).Delete xlShiftUp
Next i
End With
n = .UsedRange.Rows.Count
.Range("A2:D" & n).Sort key1:=.Cells(2, 2), order1:=xlAscending, Header:=xlNo
End With
End Sub

Par contre, n prends la valeur 9700, classeur fait en dépit du bon sens… et temps d'exécution considérable.



Modifié par corinthien le 29/08/2014 20:33
ferrand
 Posté le 29/08/2014 à 20:35 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Dans l'immédiat, j'ai juste ajusté la dernière macro proposée pour qu'elle fonctionne, conformément me semble-t-il à ce que tu souhaitais : effacement (au lieu de suppression) des lignes sans saisie et tri dans la foulée.

Je regarde le reste dès que j'ai un moment...

http://cjoint.com/?DHDuHRIneQn

ferrand
 Posté le 29/08/2014 à 23:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Normal que la macro trie ne fonctionne pas sous 2003.

A réécrire (une seule ligne suffit) :

Range("A2:D200").Sort key1:=Range("B2"), order1:=xlAscending, Header:=xlNo

Mais j'ai l'impression que beaucoup de macros se recoupent et font "doublon". Il me semble qu'il faudrait revoir l'ensemble en fonction de ta procédure d'utilisation (complète).

NB: Quand je dis complète, c'est que par exemple en suivant tes instructions écrites, si je lance prepare, je vais renouveler la liste par copier-coller sans avoir effacé l'existant... le résultat ne sera pas forcément celui souhaité (et rien ne m'empêche de le faire).

ferrand
 Posté le 30/08/2014 à 14:40 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

J'ai jeté un oeil sur ton appli. Un certain nombre d'éléments me laissent dubitatif sur la procédure que tu souhaites mettre en place.

Si je comprends bien le maillon qui te préoccupe actuellement, on procède à la saisie des entrées et sorties sur la feuille Saisie, puis (en fin de journée ?) les saisies du jour sont transférées sur la feuille EntréesSorties.

Dans cette hypothèse, tu peux sélectionner sur liste les éléments pour lesquels tu as à saisir des entrées ou sorties, procédure qui fait double-emploi avec la recopie de la liste complète sur Saisie (laquelle ne peut que compliquer la saisie). La méthode la plus simple (et efficace) consiste à utiliser la sélection sur liste pour procéder à la saisie, une macro de validation en fin de journée opère le transfert sur EntréesSorties, y insère la date, retrie selon les critères retenus...

La suite est moins claire : il semble que tu envisages l'alimentation de récap à partir d'EntréesSorties sans limite de temps, à partir de formules. Ce n'est pas une solution que j'envisagerais car le classeur sera assez vite très lourd et de moins en moins facile à gérer.

L'apurement des EntréesSorties sur une périodicité mensuelle (ou variable, peu importe) peut aussi bien par macro : consolidation des données sur récap... Avec une récap sur plusieurs années, tu conserves un classeur léger puisque sans formules, ce qui te laisse une grande marge pour sophistiquer ta gestion de stocks...

Cordialement.

jmsch
 Posté le 30/08/2014 à 17:33 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

en effet tu résumes assez bien la démarche que j'envisage de mettre en place.

J'ai opté pour faire les saisies sur une page qui contient la liste complète car cette opération devrait se faire 1 à 2 fois par semaine et donc la saisie sera facilité et plus rapide si la liste complète se trouve sur la page. Faire le choix à chaque fois de l'article, dans une liste déroulante, avant de saisir les entrées-sorties sera je pense plus lent.

Effectivement pour le calcul je suis parti avec des formules et là je sais que le classeur sera lent voir très lent à terme mais je fais avec mes connaissances et possibilités à moi.
Je vais voir ce que je peux faire pour enlever les formules de l'onglet recap et mettre une macro en place qui me ferrait les totaux, mais là ce n'est pas gagné.

Merci à toi pour l'aide

ferrand
 Posté le 31/08/2014 à 12:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Suggestion pour ce qui concerne la saisie : http://cjoint.com/?DHFmzVvzwYP

Une seule macro attachée au bouton "Finaliser...", elle opère l'épuration de la liste des saisies, tri et datation, copie valeurs et tri sur EntreeSortie, effacement et réinitialisation liste saisie.

NB- Une macro enregistrée en vaut une autre... à condition de la réécrire !

Compléments : nom Matériel redéfini en champ dynamique (voir dans le gestionnaire de noms) ; ajout d'un spinbutton sur saisie pour dater et ajuster la date (permet faire varier date du jour de +ou- 30jours [contrôle activeX car son équivalent formulaire ne prend pas de valeur négative]).

Pour la suite, il semble que tu veuilles conserver les EntreeSortie de façon permanente. Il serait souhaitable cependant de limiter à un an (archivage et renouvellement de la feuille), en correspondance avec une colonne de recap. Un bouton (analogue à celui de saisie) pourrait lancer la mise à jour de recap (la date en A1 sur EntreeSortie pourrait être l'indicateur de la date de mise à jour précédente...).

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
20 € de remise dès 60 € d'achat sur les LEGO chez Cdiscount
-20 € -1 -%
@Cdiscount
SSD WD Black SN850X 4 To (PCIe Gen4, NMVe M.2, 7300 Mo/s) à 246,30 €
246,30 € 305 € -19%
@Cdiscount
Extension double écran 11.6 pouces GTMEDIA MATE X (FHD 1920x1080, IPS) pour portable 13 à 17.3 pouces à 174,99 €
174,99 € 279 € -37%
@Geekbuying
Souris sans-fil ergonomique verticale Logitech MX Vertical à 51,58 €
51,58 € 90 € -43%
@Geekbuying
Perforateur Bosch Professional GBH 2-21 SDS+ à 89,90 €
89,90 € 125 € -28%
@Cdiscount
Câble Ugreen HDMI 2.1 8K, 4K 240 Hz, DynamicHDR, Dolby Atmos, haute vitesse, 2 mètres à 11,19 €
11,19 € 15,99 € -30%
@Amazon

Sujets relatifs
macro afficher masquer lignes tableau dans word 2010
EXCEL: macro pour insérer un champ de lignes
Excel : Macro pour tableau croisé dynamique
Macro pour ajouter une ligne à la fin d'un tableau
macro pour supprimer lignes inutiles
une macro pour trier les homonymes d'une liste
compter lignes d'un tableau dont toutes les cellules sont en couleur
Faire un tableau sur Excel avec des sauts de lignes
macro pour comparer 2 listes
Supprimer lignes d'un Tableau à l'impression
Plus de sujets relatifs à macro pour trier un tableau et effacer les lignes sans saisie
 > Tous les forums > Forum Bureautique