Masquer les lignes qui ne correspondent pas à des criteres m

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

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.

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

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.

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

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

Non, je ne tiens pas absolument à voir ton fichier 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.

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

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

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.

65david-v1.xlsm (106.30 Ko)

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

Salut David,

dav999 a écrit :

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 ?

Je ne vois pas vraiment de quoi tu veux parler. A moi ça ne me cause pas de problème Par contre le texte qui est affecté à ces lignes par la première partie de la macro ne te convient pas, indique-moi un exemple de ligne concernée et je verrai comment corriger le tir.

Je pensais ne faire qu’une seule macro et ne pas montrer à l’écran le résultat intermédiaire avec les lignes marquées « A effacer », mais si ça te convient mieux ainsi …….

Tu parles de plusieurs listes de données que tu as « concaténées » les unes aux autres. Je pense que là également on pourrait automatiser un certain nombre d’opérations par macro. Si jamais ça t’intéresse.

Cordialement.

16david-v2.xlsm (107.12 Ko)
Yvouille a écrit :

Par contre le texte qui est affecté à ces lignes par la première partie de la macro ne te convient pas, indique-moi un exemple de ligne concernée et je verrai comment corriger le tir.

Pour ta remarque ci dessus, je ne vois pas de quoi tu veux parler, de mon coté, je parlais de laisser simplement la toute première ligne du type "Date/Time PV60304,UNITE1@CHO_1 TT60302,UNITE1@CHO_1 M-10341_B22.UNITE1@CHO_1", les suivantes on peux les supprimer sans vergogne

pour la concaténation, je me suis pas trop embêté, un

cat *.txt > test.txt

et zou tous les fichiers texte contenus dans le répertoires sont moulinés, j'ai eu quelques problèmes avec la conversion utf8 -> iso pour m'éviter des erreurs lors de l'import dans excel, mais pour le reste en 2 minutes c'était fait, ce qui m'a pris le plus de temps c'est sous excel heureusement que tu es la.

Bon je me suis laissé toute la semaine prochaine pour finir, je reviendrais peut être pour avoir des idées sur "comment traiter les infos et présenter ces infos sur un graphique" par exemple, ou éventuellement me faire une totalisation des minutes/heures de fonctionnement.

Si c'est le cas je pense revenir à partir de mercredi sur le forum.

J'ai pas encore regardé le fichier, mais je ne pense pas avoir à y redire, je te dis donc de suite un grand merci, tu m'a fais gagné quelques (dizaines) d'heures de recherches

Donc merci Yves

Re,

J'ai cité ton texte que je ne comprenais pas dans mon précédent message. Tu as bien écrit : "Après sur certaines lignes il va manquer la valeur numérique .......". Là, tu ne parles pas de la première ligne, non ?

Pour la suite - pour les graphiques et tout ça - je ne sais pas si je pourrais encore t'aider. Alors indique peut-être ce fil comme résolu et ouvre-en un autre avec tes nouvelles questions. Sinon, peut-être que je pourrai quand même t'aider

A la prochaine.

Ah oui ces lignes la, je parlais des cellules "remplies" avec les 8 caractères espace, mais avec ta macro c'est bien prit en compte, donc aucun soucis à ce niveau la

Il me semble que j'ai cliqué sur l'icône résolu hier, je vérifie une fois

Merci

Rechercher des sujets similaires à "masquer lignes qui correspondent pas criteres"