Supprimé de façon automatisé du texte

Je suis en train de traiter l'information de curulis57.

Sauf que quand je fais Alt+F11 / je colle le code :

Private Sub Worksheet_Change(ByVal Target As Range)

'

If Target.Count > 1 Then

Application.EnableEvents = False

Application.ScreenUpdating = False

iRow = Range("L" & Rows.Count).End(xlUp).Row

For x = 2 To iRow

If Len(Cells(x, 12)) > 1 Then

sData = Cells(x, 12)

iCar = IIf(Mid(sData, 9, 5) = "<DEC>", 14, 8)

Cells(x, 12) = Right(sData, Len(sData) - iCar)

End If

Next

Application.ScreenUpdating = True

Application.EnableEvents = True

End If

'

End Sub

je refais Alt+F11 / Alt+F8, je n'ai pas la possibilité de faire exécuté la macro, il n'y rien de "prêt".

Malheureusement, je dois quitter mon lieu de travail je reprend dès demain 7h30. Si des gens se sentent de continuer ma formation lol. J'ai peur que ça ce complique dans l'avenir (déjà que je suis déjà dépassé...). Je comprendrai parfaitement si vous étiez saoulé de vous casser la tête pour moi..

En tout cas merci à tous pour vos éléments de réponses et je vous retrouve demain sans faute, bisou à tous.


Je suis en train de traiter l'information de curulis57.

Sauf que quand je fais Alt+F11 / je colle le code :

Private Sub Worksheet_Change(ByVal Target As Range)

'

If Target.Count > 1 Then

Application.EnableEvents = False

Application.ScreenUpdating = False

iRow = Range("L" & Rows.Count).End(xlUp).Row

For x = 2 To iRow

If Len(Cells(x, 12)) > 1 Then

sData = Cells(x, 12)

iCar = IIf(Mid(sData, 9, 5) = "<DEC>", 14, 8)

Cells(x, 12) = Right(sData, Len(sData) - iCar)

End If

Next

Application.ScreenUpdating = True

Application.EnableEvents = True

End If

'

End Sub

je refais Alt+F11 / Alt+F8, je n'ai pas la possibilité de faire exécuté la macro, il n'y rien de "prêt".

Malheureusement, je dois quitter mon lieu de travail je reprend dès demain 7h30. Si des gens se sentent de continuer ma formation lol. J'ai peur que ça ce complique dans l'avenir (déjà que je suis déjà dépassé...). Je comprendrai parfaitement si vous étiez saoulé de vous casser la tête pour moi..

En tout cas merci à tous pour vos éléments de réponses et je vous retrouve demain sans faute, bisou à tous.

Alice,

Il existe deux familles de macros ....

1. La famille 'standard' ... les macros ont besoin d'être lancées ...

2. La famille 'évènmenetielle' ... les macros se déclenchent toutes seules ... ou plus exactement lorsque l'évènement se produit ...

Dans ton cas, il suffit que tu changes quelque chose dans ta feuille ... pour que la macro se déclenche 'toute seule' ....

En espèrant que cela t'aide ...

Bonsoir,

Comme les précisions arrivent au compte goutte, j'ai modifié mon code en fonction :

Sub Test()

    Dim Plage As Range
    Dim Cel As Range

    With ActiveSheet: Set Plage = .Range(.Cells(2, 12), .Cells(.Rows.Count, 12).End(xlUp)): End With

    For Each Cel In Plage

        On Error Resume Next
        Cel.Value = Split(Cel.Value, ">")(1)

    Next Cel

End Sub

Comme tu veux traiter en bloc des lignes, une procédure événementielle ne sert à rien. Donc,Alt+F11, Menu "Insertion" ---> "Module" puis Ctrl+V dans la partie droite qui vient de s'afficher ensuite, tu places le curseur n'importe où dans le code collé puis F5 ou si tu veux voir le déroulement de la macro ligne par ligne, appuis successifs sur F8 !

Bonjour Alice,

Bonjour l'équipe,

voici quelques améliorations... qui fonctionnent très bien ici! Evidemment, je ne suis pas dans un environnement de travail réel ce qui facilite faussement les choses!

- Je remarque que certaines lignes arrivent sans <DEC>... onner! Une nouvelle exception!

Je maintiens donc mon système pour éviter les problèmes que, je pense, SPLIT ne saurait éviter.

  • Pour accélérer le traitement, je passe la colonne "L" en tableau.
  • Il faut collerr plusieurs lignes pour que cela fonctionne, Worksheet_BeforeRightClick() (qu'on peut supprimer!) venant apporter son grain de sel...
A ce propos, quand tu choisiras ton emplacement pour coller les nouvelles données, prends soin de sélectionner AU MOINS 2 lignes avant Clic Droit-Coller sinon... crac!
  • Pourquoi? Parce qu'un clic droit (UNE cellule sélectionnée, donc) sur une cellule de la colonne "L" active-désactive l'affichage du texte de cette cellule sur plusieurs lignes, histoire de favoriser la lecture.
  • Double-click pour éditer et/ou modifier une cellule de la colonne "L" dont tu auras pris la précaution préalable d'activer le multi-ligne.
Je suppose que tu sais (je ne le savais pas avant ton cas!) qu'il faut faire ALT-ENTER pour passer le texte à la ligne dans une même cellule!

ENTER pour valider, évidemment...

Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim tData
'
If Target.Count > 1 Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    '
    iRow = Range("L" & Rows.Count).End(xlUp).Row
    tData = Range("L2:L" & iRow).Value
    For x = 1 To UBound(tData)
        iCar = 0
        If Len(tData(x, 1)) > 1 Then
            If Left(tData(x, 1), 7) = "--GID--" Then iCar = 8
            If Mid(tData(x, 1), 9, 5) = "<DEC>" Then iCar = 14
            If iCar > 0 Then tData(x, 1) = Right(tData(x, 1), Len(tData(x, 1)) - iCar)
        End If
    Next
    Range("L2:L" & iRow).Value = tData
    Range("L:L").WrapText = False
    '
    If [AAA1] > 0 Then
        ActiveWindow.ScrollRow = [AAA1]
        ActiveWindow.ScrollColumn = 1
        [A1].Select
    End If
    '
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End If
'
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'
If Target.Count > 1 Then
    [AAA1] = Selection.Row
    Exit Sub
End If
'
Cancel = True
iRow = Range("L" & Rows.Count).End(xlUp).Row
'
If Not Intersect(Target, Range("L2:L" & iRow)) Is Nothing Then Target.WrapText = IIf(Target.WrapText = False, True, False)
'
End Sub

A tester et re-tester et faire remonter les problèmes!

Bon travail!

A+

3incidents2016.xlsm (36.63 Ko)

Bonjour,

Split() comme tant d'autre fonction sait gérer, il suffit de le lui demander en lui passant les bons arguments !

Sub Test()

    Dim Plage As Range
    Dim Cel As Range

    With ActiveSheet: Set Plage = .Range(.Cells(2, 12), .Cells(.Rows.Count, 12).End(xlUp)): End With

    For Each Cel In Plage

        On Error Resume Next
        Cel.Value = Split(Cel.Value, "<DEC>")(1)

        If Err.Number <> 0 Then Cel.Value = Split(Cel.Value, "GID--")(1)

    Next Cel

End Sub
Theze a écrit :

Bonjour,

Split() comme tant d'autre fonction sait gérer, il suffit de le lui demander en lui passant les bons arguments !

Sub Test()

    Dim Plage As Range
    Dim Cel As Range

    With ActiveSheet: Set Plage = .Range(.Cells(2, 12), .Cells(.Rows.Count, 12).End(xlUp)): End With

    For Each Cel In Plage

        On Error Resume Next
        Cel.Value = Split(Cel.Value, "<DEC>")(1)

        If Err.Number <> 0 Then Cel.Value = Split(Cel.Value, "GID--")(1)

    Next Cel

End Sub

Je viens de rentrer ce code en traitant les informations que vous avez eu l'amabilité de me fournir dans l'ordre d'arrivé.

J'ai rentré le code cité au dessus et j'ai le plaisir de vous dire que ........ CA A MARCHE !!!

Alors effectivement je comprend rien du tout aux différentes ligne que vous m'avez tous envoyés mais en tout cas les possibilités informatiques en matières de programmation semble infinie pour un seul programme donné.

Je vous tiens au courant à savoir si le code tient le coup, s'il tient dans la duré.

Je ne peux rien faire pour vous de mon PC mais en tout cas je vous gratifie d'un réel merci général et individuel pour votre prise de temps et la patience dont vous avez fait preuve !

Merci à tous.

BRAVO ALICE ...

TA PERSEVERANCE mérite d'être saluée .....

C'est votre persévérance qui mérite d'étre salué, moi je n'ai fait que me tromper dans les information que je vous ai donné etc etc. C'est vous tous qui avait fait le gros du boulot....

Dans le code suivant que j'ai utilisé, j'aurai besoin de l'utiliser pour un autre document, la même chose, les mêmes caractères mais simplement sur une autre colonne, actuellement c'est la colonne L, mais si je veux la même macro sur la colonne W dans cette ligne de code :

Sub Test()

Dim Plage As Range

Dim Cel As Range

With ActiveSheet: Set Plage = .Range(.Cells(2, 12), .Cells(.Rows.Count, 12).End(xlUp)): End With

For Each Cel In Plage

On Error Resume Next

Cel.Value = Split(Cel.Value, ">")(1)

Next Cel

End Sub

Alice,

Comme tu es en train de deviner une Experte ...

Tu auras remarqué que la Colonne L est la colonne N° 12 ...

Du coup, si tu veux la même macro pour la Colonne W ...

il te suffit de remplacer 12 par 23 ...

James007 a écrit :

Alice,

Comme tu es en train de deviner une Experte ...

Tu auras remarqué que la Colonne L est la colonne N° 12 ...

Du coup, si tu veux la même macro pour la Colonne W ...

il te suffit de remplacer 12 par 23 ...

Je cherchais justement la lettre L dans la ligen de code mais je ne voyais pas le rapprochement. Du coup la nouvelle ligne de code devra être :

Sub Test()

Dim Plage As Range

Dim Cel As Range

With ActiveSheet: Set Plage = .Range(.Cells(2, 23), .Cells(.Rows.Count, 23).End(xlUp)): End With

For Each Cel In Plage

On Error Resume Next

Cel.Value = Split(Cel.Value, ">")(1)

Next Cel

End Sub

Bon, j'ai fait des tests, ça marche pas sur un autre fichier alors que ça marche sur le fichier que je vous ai donné.

J'ai 1 question :

1/ Dans la case je copie colle le texte suivant :

--GID--

<DEC>26480024

06H03 ADC du 894101 me signale avoir des difficultés

Dans le dossier que je vous ai donné suite à la macro, dans la cellule s'affiche :

26480024

06H03 ADC du 894101 me signale avoir des difficultés

Ce qui est parfait.

Mais si le texte de base est le suivant :

--GID--

Absence d'alimentation sur le secteur

(donc sans le <DEC>), le --GID-- va t'il disparaitre ? Parce que j'ai 5% des lignes que je dois copier coller qui n'ont pas le <DEC>

Et du coup le --GID-- ne s'enléve pas.

Je vous fourni le dossier où j'ai besoin d'appliquer la même macro mais qui ne marche plus, sachant que j'ai mis la ligne de code suivante, en remplaçant la colonne L par W, soit en remplaçant le 12 par 23 :

Sub Test()

Dim Plage As Range

Dim Cel As Range

With ActiveSheet: Set Plage = .Range(.Cells(2, 23), .Cells(.Rows.Count, 23).End(xlUp)): End With

For Each Cel In Plage

On Error Resume Next

Cel.Value = Split(Cel.Value, ">")(1)

Next Cel

End Sub

20incidents.xlsx (527.75 Ko)

Je viens de faire d'autres tests et il s'avère que :

1/ Effectivement quand il n'y a que --GID-- (sans le <DEC>), le --GID-- ne disparait pas.

2/ Que pour ce faire la macro doit être activé à chaque copier coller et n'est pas automatique. (Je sais pas si c'est possible mais que la macro efface en temps réel toute seul les informations dès que l'on les colle).

Bonjour Alice,

essaie au moins ce que je t'ai envoyé...

A+

Re,

Mon code avec les commentaires (désolé, j'ai oublié !) :

Sub Test()

    Dim Plage As Range
    Dim Cel As Range

    'défini la plage sur la feuille active et sur la colonne L (12ème colonne) à partire de L2
    With ActiveSheet: Set Plage = .Range(.Cells(2, 12), .Cells(.Rows.Count, 12).End(xlUp)): End With

    'parcour la plage cellule par cellule...
    For Each Cel In Plage

        'évite l'erreur de la chaine "<DEC>" introuvable, si existe, ne garde que ce qui se trouve
        'après la chaine "Split(Texte, Séparateur)(1)<--- en base 0 donc, avant le séparateur, la dimension est 0
        On Error Resume Next
        Cel.Value = Split(Cel.Value, "<DEC>")(1)

        'si une erreur est générée (absence du séparateur) recherche le séparateur "GID--" et récupère ce qui se trouve après
        If Err.Number <> 0 Then Cel.Value = Split(Cel.Value, "GID--")(1)

        'si il advenait que le second séparateur n'existait pas, il faudrait gérer ce cas de figure !

    Next Cel

End Sub

Mais si le texte de base est le suivant :

--GID--

Absence d'alimentation sur le secteur

(donc sans le <DEC>), le --GID-- va t'il disparaitre ? Parce que j'ai 5% des lignes que je dois copier coller qui n'ont pas le <DEC>

Et du coup le --GID-- ne s'enléve pas.

Si tu as le texte :

--GID--

Absence d'alimentation sur le secteur

dans une cellule, la chaine "--GID--" va disparaître car avec "GID--" comme séparateur, les deux premiers tirets font partie de la 1ère dimension (ce qu'il est possible de vérifier avec l'instruction --> MsgBox Split(Cel.Value, "GID--")(0) ) et comme le séparateur est d'office supprimé, les deux disparaîtront de la chaine

J'ai eu des soucies au début curulis57, j'arrivais pas à faire fonctionner la macro et apres avoir recommencer plusieurs fois, ça a étrangement marché. Je comprends pas bien. Du coup je vais essayer de réadapter ton code pour le mettre sur la colonne W, soit le nombre 23.

Private Sub Worksheet_Change(ByVal Target As Range)

'

Dim tData

'

If Target.Count > 1 Then

Application.EnableEvents = False

Application.ScreenUpdating = False

'

iRow = Range("W" & Rows.Count).End(xlUp).Row

tData = Range("W2:W" & iRow).Value

For x = 1 To UBound(tData)

iCar = 0

If Len(tData(x, 1)) > 1 Then

If Left(tData(x, 1), 7) = "--GID--" Then iCar = 8

If Mid(tData(x, 1), 9, 5) = "<DEC>" Then iCar = 14

If iCar > 0 Then tData(x, 1) = Right(tData(x, 1), Len(tData(x, 1)) - iCar)

End If

Next

Range("W2:W" & iRow).Value = tData

Range("W:W").WrapText = False

'

If [AAA1] > 0 Then

ActiveWindow.ScrollRow = [AAA1]

ActiveWindow.ScrollColumn = 1

[A1].Select

End If

'

Application.CutCopyMode = False

Application.ScreenUpdating = True

Application.EnableEvents = True

End If

'

End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

'

If Target.Count > 1 Then

[AAA1] = Selection.Row

Exit Sub

End If

'

Cancel = True

iRow = Range("W" & Rows.Count).End(xlUp).Row

'

If Not Intersect(Target, Range("W2:W" & iRow)) Is Nothing Then Target.WrapText = IIf(Target.WrapText = False, True, False)

'

End Sub

Je vais essayer ça voir si ça marche.

Ca y est, je crois que la bête est maintenant dompté pour de bon. A voir si ça va durer dans le temps.

Merci encore, je reviens vers vous s'il y a encore des soucies.

Vous étes de vrais pros en tout cas.

Merci à Theze aussi pour l'explication de la ligne, c'est bien stylé de comprendre ce que je rentre lol.

Merci particulièrement à curulis qui m'a visiblement trouvé la réponse.

Bonjour Alice,

pas si pro...

J'ai décelé une erreur dans mon code : je pensais (pas capté pendant les premiers tests) qu'il y avait un LineFeed après <DEC>.

Or, il n'y en a pas donc le texte est tronqué d'un caractère après traitement, ce que tu peux vérifier par toi-même.

Voici le correctif mais l'idéal serait que tu puisses, tant que faire se peut, nous faire l'inventaire des possibilités et exceptions en fonction des habitudes d'encodage de ton entreprise.

Il y aurait peut-être moyen de fignoler un paramétrage...

Tu n'as rien dit à propos de --RI--...!?

A+

6incidents2016.xlsm (34.63 Ko)

Je ne vois pas de --RI--, bien que je ne sois plus sur mon lieu de travail. Enfaite derrière le <déc> il y a un retour à la ligne, la ligne d'après commence par une suite de chiffre aléatoire et juste après il y a l'heure d'un événement. Ça donne donc comme vous pouvez le voir :

--GID--

<DEC>

064164849367h45 balise en panne (Chiffre aléatoire + heure + texte)

L'objectif ici était de supprimer les 2 premières lignes soit le GID et le DEC. Il me paraît absolument impossible de faire commencer la 3eme ligne par l'heure du début de l'événement, car les chiffres aléatoire sont collés au premier chiffre de l'heure. Je rappelle que le chiffre aléatoire peux être composé de plusieurs nombres qui varient tout le temps.

Je ne connais malheureusement pas toutes les exceptions aux automatismes qui s'affiche. Mais il y aura au moins tout le temps le --GID-- et 4/5 ème du temps le <DEC>.

La suite de chiffre aléatoire suivant le <DEC> n'a aucune forme d'importance, si le premier nombre du chiffre disparaît ce n'est pas du tout un problème. Et si 1 fois sur 100 je dois personnellement double cliquer sur une cellule pour enlever le trop pour X ou X raison, ce n'est pas bien grave.

Le boulot que vous avez fait est impressionnant, en tout cas de mon point de vue. Après en fonction des compétences personnelles de chacuns on est tous plus ou moins bon et on impressionne plus ou moins.

Bonsoir Alice,

comme tu peux le voir (ligne 13, entre autres), pas de retour à la ligne après <DEC> (aucune importance en soi) mais bien après le nombre aléatoire... qui compte apparemment toujours le même nombre de chiffres.

Faut-il éliminer ce nombre aléatoire?

L'important est de savoir si il y d'autres types d'encodage, d'autres indications préalables au texte que GID ou DEC...

Le correctif prévoit qu'il puisse y avoir un retour ligne ou pas (je n'ai pas encore essayé l'option OUI, j'avoue ) après DEC.

Le code --RI-- se trouve plus bas dans le texte.

Rien d'urgent, donc!

--GID--

<DEC>39990000

12h00 : avis , à l'ac de digoin, d'un agent télécom que le pn 37 ligne770000 est en raté d'ouverture

12h42 : fonctionnement normal du pn , ras à la visite

--RI--

RAS aux vérif et essais.

Bonne soirée!

A+

Bonjour mon ami curu,

Ce nombre aléatoire serait dans l'idéal à faire disparaitre, mais je vois pas trop comment c'est possible, le gain temps / utilité serai trop peu intéressent pour qu'on si intéresse à mon avis..

la macro actuelle marche bien et est efficace, c'est le plus important.

Le --RI-- doit rester pour le coup, il a sa place dans le texte.

Nouveau problème, quand j'enregistre le fichier excel, ça me marque ça :

erreur macro

Du coup biensur je fais non, ça me demande de choisir un nouveau nom (comme si j'enregistrais le fichier pour la premiere fois, mais à chaque fois ce message revient, ce qui m'empêche de garder la macro active continuellement.

Bonjour,

Il te faut l'enregistrer en .xlsm et non .xlsx donc, choisie classeur contenant des macros dans la liste (ComboBox) de la boite Enregistrer


Bonjour,

Il te faut l'enregistrer en .xlsm et non .xlsx donc, choisie classeur contenant des macros dans la liste (ComboBox) de la boite Enregistrer

Rechercher des sujets similaires à "supprime facon automatise texte"