masquer les lignes qui ne correspondent pas à des criteres m Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
d
dav999
Membre habitué
Membre habitué
Messages : 92
Inscrit le : 29 mars 2013
Version d'Excel : 2019 FR

Message par dav999 » 29 mars 2013, 11:42

Bonjour,

je dois compiler un ensemble de ligne de texte (44Mo de fichiers texte), pour ne garder que les lignes selon certains critères.

J'ai 4 colonnes :
Date Valeur 1 Valeur 2 Valeur 3

La valeur 1 et 2 sont des nombres rééls (virgules), la valeur 3 est un bit (soit 0 ou 1)
Sur chaque feuille j'ai entre 70000 et 80000 lignes (x 10 feuilles), vous comprendrez pourquoi je cherche à automatiser tout cela

Ce que j'ai déjà réussi à faire, c'est avec la mise en forme conditionnelle colorier le fond de la cellule selon la valeur de chaque cellule, mais maintenant il faut que je passe à l'étape supérieure.
Je dois cacher ou effacer toutes les lignes qui ne rentrent pas dans les critères suivants : la valeur 1 soit supérieure à 53 ET que la valeur 3 soit égale à 1

J'ai taté du Vb sous excel 5 en français, et plus rien depuis, de plus c'est un peu pressé c'est pour le boulot (dreal)

Si vous pouvez sur ce coup la m'aider je vous en serais grandement reconnaissant

Merci
David
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'886
Appréciations reçues : 63
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 29 mars 2013, 12:10

Bonjour David et bienvenue sur le Forum,

J’ai tenté d’adapter ce code – créé pour un autre utilisateur – sur la base de tes informations.

Si ce n’est pas ça, merci de nous fournir un de tes fichiers avec une dizaine de lignes représentatives.
Sub Supprimer()
Dim i As Integer

Application.ScreenUpdating = False
For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
    If Cells(i, 2) <= 53 Or Cells(i, 4) = 0 Then Rows(i).Delete
Next
End Sub
Cordialement.
Yvouille

Valais de Coeur
d
dav999
Membre habitué
Membre habitué
Messages : 92
Inscrit le : 29 mars 2013
Version d'Excel : 2019 FR

Message par dav999 » 29 mars 2013, 12:23

Merci je vais essayer, mais je vais avouer que je suis tellement nul sous excel, que je ne sais même pas comment activer la macro une fois sur ma feuille, oui je sais c'est désolant, mais bon :)
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'886
Appréciations reçues : 63
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 29 mars 2013, 12:33

Si jamais il te reste cette possibilité :
Yvouille a écrit :Si ce n’est pas ça, merci de nous fournir un de tes fichiers avec une dizaine de lignes représentatives.
Yvouille

Valais de Coeur
d
dav999
Membre habitué
Membre habitué
Messages : 92
Inscrit le : 29 mars 2013
Version d'Excel : 2019 FR

Message par dav999 » 29 mars 2013, 12:59

Ca fonctionne, bon je passe directement par VB et en étant sur ma feuille ca prend bien en compte, par contre j'ai un soucis avec le integer, comme j 'ai plus de 65565 lignes il me fait une erreur d’exécution, y a pas un format extended (je viens de trouver le type LONG), qui me permettrait de garder le bénéfice du nombre entier, mais en augmentant la capacité de mémorisation du nombre de lignes :)

Pourquoi je préfèrerais que tu me donnes la marche à suivre plutôt que de me créer un fichier tout fait, ca ma permettra sur le prochain fichier de le refaire par moi même, c'est quand même plus sympa non :)

je te met tout de même un fichier en mode réduit (mais n'oublies pas que j'ai plus de 66000 lignes sur un fichier complet).

Merci pour tout en tout cas.
David

ps : pour les fichiers il ne prend pas plus de 300ko, le mien fait 1.5mo, voiçi un autre lien :
http://dl.free.fr/rxq4EKond

Reps : si ca pouvais être possible de laisser une ligne vide au dessus de chaque séquence de suppression, c'est a dire, j'ai plusieurs lignes qu'il faut que je supprime et paf dès que je tombe sur une ligne à garder -rajouter une ligne vierge au dessus, puis balayage de toutes les lignes à garder et réinitialisation de la fonction dès que je retombe sur une ligne à supprimer, et paf re-ajout d'une ligne vide lorsque je retombe sur une ligne à garder, cela me permettrait de voir les démarrages et arrêt de production de l'installation industrielle (c'est une série de valeur sur une chaudière industrielle)

Merci
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'886
Appréciations reçues : 63
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 29 mars 2013, 13:16

Non, je ne tiens pas absolument à voir ton fichier :D Si tu veux te débrouiller tout seul, c'est bien mieux.

Le type de données "Integer" à une limite de 32'767 (ça n'a donc rien à voir avec le nombre de lignes de la version Excel 2003 de 65'536).

Rempace donc "Integer" par "Long" (le nombre de lignes maximum sera alors de 1'147'483'647 et ça n'a rien à voir avec le nombre de lignes maximum de Excel 2007 de 1'048'576).

Cordialement.
Yvouille

Valais de Coeur
d
dav999
Membre habitué
Membre habitué
Messages : 92
Inscrit le : 29 mars 2013
Version d'Excel : 2019 FR

Message par dav999 » 29 mars 2013, 13:25

pour mon soucis de ligne vides, je ne sais même plus comment ajouter 2 lignes de code après cette commande :
If Cells(i, 2) <= 53 Or Cells(i, 4) = 0 Then Rows(i).Delete
il faut faire un begin et end?
Si je met en place un elseif avec un boolean pour ajouter ma ligne vide, genre de code comme ca :
Dim vide as boolean

If Cells(i, 2) <= 53 Or Cells(i, 4) = 0 Then 
   begin
   Rows(i).Delete
   if vide = 1 then 
      begin
      rows(i-1).add
      vide :=0
      end
else if
   vide :=1
j'utilise pas la convention VB c'est presque sur, c'est mais tu codes aussi je suppose que tu comprendra ce que je souhaite faire pour me "traduire" en VB et surtout voir si la méthode employée est la bonne.
Dans ma vision des choses lorsque je met un égal "=" c'est un test de la variable et lorsque je met un doublepoint/égal ":=" j'assigne la valeur sur la droite à la variable située à gauche
d
dav999
Membre habitué
Membre habitué
Messages : 92
Inscrit le : 29 mars 2013
Version d'Excel : 2019 FR

Message par dav999 » 29 mars 2013, 16:05

j'ai essayé avec les infos que j'ai pu trouver, dites moi ce que vous en pensez :
    Sub Supprimer()
    Dim i As Long
    Dim vide As Boolean
        
    vide = False
            
    Application.ScreenUpdating = False
    For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
        If Cells(i, 2) <= 53 Or Cells(i, 4) = 0 Then                    ' lorsque la ligne n'est pas à conserver
            
            Rows(i).Delete                                              ' suppression ligne
                
            vide = True
            
        Else
            
            
            If vide = True Then                                         ' si ligne vide
                
                ActiveCell.Offset(1).Resize(1, 1).EntireRow.Insert      ' ajout d une nouvelle ligne
                vide = False
                End If
        End If
        
            
    Next
    End Sub
j'ai des problèmes j'ai l'impression que ca ne fonctionne pas pourtant le code à l'air bon mais je ne sais pas si quand je fais un déboguage pas à pas je me trouve sur la bonne feuille.
Comment faire pour intégrer ma macro dans le fichier et le lier par exemple à une feuille (j'ai l'impression que c'est à cause de cela que j 'ai mes soucis) ?

Merci
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'886
Appréciations reçues : 63
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 29 mars 2013, 17:50

Re,

Je pense que soit on décide de résoudre ton problème et tu me laisses faire le code en m’expliquant tes besoins, soit on fait un cours VBA, mais alors ça risque de prendre des jours et je ne suis pas très chaud pour cela (tes codes comportent pas mal d'erreurs et d'imprécisions).

Afin de résoudre ton problème, j’ai pensé que l’on devait au préalable déterminer dans la colonne E quelles lignes étaient à effacer et lesquelles étaient premières ou dernières des séries à conserver.

Pour ce faire, j’ai placé un bouton sur la feuille oct2002 du fichier ci-joint (de manière à ce que la bonne feuille soit sélectionnée, autrement tu dois sélectionner la bonne feuille avant de lancer le code directement dans l’éditeur Visual Basic) et lorsque tu lances le code, il inscrit les informations nécessaires dans la colonne E.

Si ces informations – visibles provisoirement – sont correctes, on pourra aller de l’avant et effacer en plus automatiquement les lignes inutiles (mais l'effacement ligne par ligne prend un temps énorme, on va choisir une autre solution).

Lorsque ces lignes inutiles seront effacées, soit tu trouves que c’est suffisant d’avoir les indications « Début » et « Fin » dans la colonne E pour délimiter les blocs, soit on pourra comme tu le suggères ajouter des lignes vides (mais lignes vides dans Excel = DANGER).

Alors, pour l’instant, merci de contrôler les annotations intermédiaires dans la colonne E. Je te rends particulièrement attentif aux lignes tels que la 1 (on la garde, on l’efface ?), la 1804 (on la garde, on l’efface), la 1950 (est-ce bien correct quelle est le début et la fin du bloc ?).

Je n’ai laissé que 3000 lignes dans ce fichier, ce qui est suffisant pour notre échange (mais rien ne t’empêche de tester ces codes dans un autre fichier complet).

A te relire.
David_V1.xlsm
(106.3 Kio) Téléchargé 61 fois
Yvouille

Valais de Coeur
d
dav999
Membre habitué
Membre habitué
Messages : 92
Inscrit le : 29 mars 2013
Version d'Excel : 2019 FR

Message par dav999 » 29 mars 2013, 20:31

Du feu de dieu, merci ca fonctionne impeccable :)

Bon ben comme c'est toi qui a les compétences c'est toi le chef, alors je te suis ;;)

Donc pour tes commentaires :
Ligne 1, à laisser en place au moins sur la première ligne, les suivantes on peut les supprimer (en fait j'ai un fichier texte de 10heures qui prend la valeur de 3 capteurs d'instrumentation toutes les minutes), chaque mois comporte environ 70 fichiers de ce type que j'ai concaténé d'ou la, (enfin) les lignes spécifiques (1804 par exemple)

Pour ta remarque sur la ligne 1950, c'est impeccable, le tag "début et fin" me conviens parfaitement

Après sur certaines lignes il va manquer la valeur numérique (le pc d'historique était en maintenance), dans mes fichiers excel ca se traduit par une cellule contenant 8 caractères "espace", je ne sais pas si ca posera problème sur ta macro ?

Et oui cette façon de procéder pour me repérer (au lieu d'insérer une ligne vide) me conviens très bien, je pourrais toujours mettre une mise en forme conditionnelle sur la colonne E pour faire ressortir les "debut" "fin" et "debut et fin"

Donc ok pour une suppression auto, si ca ne te pose pas de problèmes particulier on rajoute un 2ème bouton qui servira juste à effacer, ca me permettra de vérifier avant de supprimer définitivement.

En tout cas je te dois déjà une fière chandelle, surtout que ca fais des années que j'ai plus touché à Excel (je suis sous linux avec libreoffice, mais comme je ne suis même pas arrivé à mettre en place la mise en forme conditionnelle sur les colonnes je suis passé sous excel avec tous les soucis de confusion en plus...)

Merci pour tout et je te souhaite ainsi qu'aux autres utilisateurs du forum de joyeuses fêtes de Pâques.
David
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message