Macro ou code pour supprimer ligne et terme de cellules

(re)

Celle qui est marquée "Je voudrais" ?

re

peux être comme ca

Option Explicit

Sub Transfer()
Dim Derligne As Long
Dim L As Long
Dim Lig As Long
Dim Tmp As String
Feuil2.Columns(1).ClearContents
Derligne = Range("A" & Rows.Count).End(xlUp).Row
For L = 5 To Derligne
   Tmp = Split(Range("A" & L).Value, ":")(0)
   If Tmp = "Référen" Then
      Lig = Lig + 1
      Feuil2.Range("A" & Lig).Value = Split(Range("A" & L).Value, ":")(1)
   End If
Next
Feuil2.Select
End Sub

A+

Maurice

NCC 1701 a écrit :

(re)

Celle qui est marquée "Je voudrais" ?

oui c'est bien ca

edit euhh non pardon je suis un boulet pfff non comme ce que tu fais figurer sur la colonne 2 (ce que tu proposes)

(re)

Je ne comprends pas ??? ce n'est pas ce que mon code fait ? nous parlons bien de la colonne numéro 2 (Je Propose) ?

Ok j'ai trouvé le souci j'ai simplement remplacé le terme "Réf" par celui que je viens d'entourer c'est pour cela que ça effacer tout, comme selon les tableaux le terme peut changé celui de mon fichier joint "Réf" n'était pas celui que j'exploitais commençant par Addon, ,du coup il fonctionne vraiment bien mais.....

j'ai un autre souci sur le code désormais, comme je dois checker des dizaines de milliers de ligne sur des dizaines de feuille de plusieurs classeur il me retourne le message d'erreur suivant (j'ai en moyenne 500 000 lignes par feuille)

Sur 80 000 lignes ca boost bien mais au delà genre 300 000 ou plus j'ai ce message.

voici les message

capture erreur capture erreur 2

Si cela est faisable bien entendu sinon je ferais avec c'est déjà énorme et un grand merci pour ta patience et compétence ainsi qu'à tous les autres intervenant

(re)

Ce n'est pas un problème de code VBA ! c'est un problème dans les données !

Il doit y avoir quelque part dans tes centaines de milliers de lignes une valeur qui provoque une erreur !

Quant à chercher où ? bon courage !

Bonjour tout le monde,

Ce type de traitement me plait...

Je viens de télécharger le fichier avec trois onglets, [Feull1 ok], [Feuill2 no], et [feuil3].

Quelle liste doit elle triée ?

Re,

une idée...

Je te remercie Thihii je regarde cela demain car la suis pas chez moi je regarderais tout cela au plus vite

Re,

une seconde version, celle ci supprime les lignes qui sont hors chaine recherchée.

Ok je regarde tout cela demain si ça va bien car le souci est souvent le très grand nombre de ligne que je traite sur le tableau ! Tout va bien quand je lance en test la macro sur 10 ou 20 mille ligne mais des que je passe sur 400000 ou 500 mille ligne taille moyenne des feuilles un message d'erreur sur le code s'affiche ... je te tiens au jus

Re,

Pour éviter ce type d'erreur, j'évite l'utilisation de tableau et surtout de la fonction Find...

Un retour sur la quantité des données que vous allez traiter et la réaction du traitement de la macro m'intéresse.

Ok je viens de tester les codes Thihii mais ça ne correspond pas vraiment à ce dont j'ai besoin, NCC a parfaitement résumé en image ce dont j'ai besoin. En faite je rentre j'ai besoin de sélectionner le contenu uniquement d'une cellule et en partie seulement il s'agit de celle du milieu chaque fois intitulé Référence ou autre (peut importe) et de garder que ce qui après les ":" comme NCC le résume parfaitement ici.

besoin

Son code va bien et s’exécute rapidement mais je ne sais pas vraiment pourquoi ni a quel moment , lorsque le tableau présente peu de donné ca va nikel mais quand je lui envoi le nombre de lignes que je dois traiter ça bug . NCC penses d'après le code erreur qui est retourné qu'il ne s'agit pas d'un souci au niveau du VBA et je crois qu'il a raison. Toutefois y aura t il moyen de contourner ce type de message car je ne vois pas d'ou pourrait venir le souci et surtout impossible de le checker dans l'ensemble des lignes est ce un souci de copier coller ou autre

Bonjour ericjuju, Thihii

Il me vient une idée pour savoir d'où vient l'erreur...

Fait tourner mon code et lorsqu'il plante en restant dans le code VBA (sans l'arrêter) tu passes la souris sur une ligne où figure

Ubound(tabGood, 2)

et tu m'indique la valeur indiquée...

Nous verrons ensuite...

Bonjour NCC

Voilà je pense avoir fait comme tu m'as dit j'ai lancé depuis le code

Ensuite j'ai cliqué sur débogage voilà en image ce que ca donne

capture erreur execution13 debogage

Je vais dormir un peu je reviens un peu plus tard

Bonjour

Je viens de faire des tests avec un fichier > 700 000 lignes... !

Effectivement ça bug !

Alors j'ai trouvé "pourquoi" et aussi "une solution"

Par contre attention le code va être un peu plus compliqué... à ma connaissance je n'ai pas vu ce genre de traitement (programmation) souvent sur le forum, mais il faut dire que ce cas là est particulier... !

Voici le code :

Public Type typPhase
    tabPhase()  As Variant
End Type

Sub Tasser()
Dim ligFin, ligCpt, nbrLig
Dim tabVrac()
Dim tmp
Dim cptPhase
Dim nbrPhase
Dim debPhase, finPhase

    nbrPhase = CompterPhase
    debPhase = 2
    finPhase = 60000
    ReDim tabGood(1 To nbrPhase) As typPhase
    For cptPhase = 1 To nbrPhase

        tabVrac = Range(Cells(debPhase, 1), Cells(finPhase, 1))

        With tabGood(cptPhase)
            ReDim .tabPhase(1 To 1, 1 To 1)
        End With
        nbrLig = 0

        For ligCpt = 1 To UBound(tabVrac, 1)
            If Left(tabVrac(ligCpt, 1), 3) = "Réf" Then
                nbrLig = nbrLig + 1
                With tabGood(cptPhase)
                    ReDim Preserve .tabPhase(1 To 1, 1 To nbrLig)
                    tmp = Split(tabVrac(ligCpt, 1), ":")
                    .tabPhase(1, nbrLig) = tmp(1)
                End With
            End If
        Next

        debPhase = finPhase + 1
        finPhase = debPhase + 60000
    Next
    Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).ClearContents
    debPhase = 2
    For cptPhase = 1 To nbrPhase
        With tabGood(cptPhase)
            Cells(debPhase, 1).Resize(UBound(.tabPhase, 2), UBound(.tabPhase, 1)) = WorksheetFunction.Transpose(.tabPhase)
            debPhase = debPhase + UBound(.tabPhase, 2)
        End With
    Next

End Sub

Function CompterPhase()
Dim ligFin

    ligFin = Cells(Rows.Count, 1).End(xlUp).Row
    MsgBox "Votre fichier comporte " & ligFin & " lignes"
    MsgBox "le traitement sera effectué en " & (ligFin \ 60000) + 1 & " passes successives !"
    CompterPhase = (ligFin \ 60000) + 1

End Function

Quelques explications en vitesse :

  1. pour palier au bug j'ai découpé le traitement en plusieurs phases de 60 000 lignes chacune
  2. au début "Public Type typPhase ... End Type"
      me permet de décrire le nombre de phase
    • à l'intérieur il y a un tableau tabPhase() qui permet de conserver chaque phase
  • ensuite au début du code je compte le nombre de phases nécessaires c'est la fonction "CompterPhase() associée à nbrPhase = CompterPhase()"
  • je dimensionne donc le tableau tabGood au nombre de phase
  • puis je rempli le tableau des phases par groupe de 60 000 lignes
  • en cherchant la valeur "Réf..."
  • j'ajoute une colonne au tableau tabPhase à chaque fois que la valeur est trouvée
  • ensuite même procédé de découpage pour recopier le résultat...
  • et voilà !
  • Concernant "Public Type typPhase" :

    il s'agit d'un type utilisateur au même titre que String, Boolean, Long, Date... sont des types pré-définis dans Excel, à la différence que ce premier est un type utilisateur

    Autre remarque

    Pourquoi 60 000 lignes ? tout simplement parce que cela fait à peu près 65 537 soit la dimension sur laquelle "ça bug" donc par sécurité 60 000 "y'a pas de bug" en plus 65 537 est un chiffre bien connu (n'Est-ce pas ?)

    NCC alors là je dis chapeau l'artiste

    D'une part le programme fonctionne à la perfection y compris sur 900 000 lignes aucune latence, quasi instantané et surtout aucun bug ni message d'erreur.

    Purement j'aurais été incapable d'y arriver, je te remercie beaucoup car tu a été plus que patient et persévérer pour trouver la solution qui va m'être très utile s'est vraiment très sympa car je pense que ça devait être loin d’être simple à faire sans parler de comprendre vraiment ce dont j'avais besoin.

    Encore un grand merci à tout ceux qui ont tenté de m'aider vraiment très sympa, avec une mention particulière à kit, jean-eric, maurice et surtout NCC

    Bonjour,

    Heuuu, si j'ai bien lu avec un filtre auto où tu sélectionnes 'Ne contient pas' "référence:" pour supprimer ces lignes, et un Remplacer "référence: " par rien (vide) ça prenait quelques dizaines de secondes et pas 4 jours

    eric

    Bonjour eriiic

    Pas tout à fait dans la mesure où il faut que les deux cellules celle du dessus et dessous (par rapport à "Réf" ou autre) soit complètement effacées et ne garder que la partie situé après "Réf" ou autre intitulé donc je ne suis pas sur qu'un simple filtre permette cela, je crois que dans mon cas il s'agit plutôt d'un filtre de type booléen

    @NCC le code semble présenter 2 bug tout compte fait j'ai parlé un peu vite

    • quand on relance sur une autre feuille il reste bloqué sur le résu (en nombre de ligne filtré) de celui de la première exécution lancé
    • Puis sur un autre tableau voici les erreurs (les premières fenêtres sont les boites de dialogue bien sympa) mais je te met tout pas à pas
    erreur1 erreur2 erreur 3 erreur 4

    Pas tout à fait dans la mesure où il faut que les deux cellules celle du dessus et dessous (par rapport à "Réf" ou autre) soit complètement effacées et ne garder que la partie situé après "Réf" ou autre intitulé donc je ne suis pas sur qu'un simple filtre permette celà

    Essaie ce que je t'ai indiqué, ne serait-ce que par curiosité, pour avoir la réponse.

    moi j'en suis sûr


    30 s pour moi, et encore par moment je fais des pauses que tu vois les menus et le résultat.

    Allez 1' pour toi comme tu as beaucoup de lignes

    supp

    cliquer sur l'image

    Rechercher des sujets similaires à "macro code supprimer ligne terme"