Suppression partie de texte dans cellule ?

Bonjour tout le monde,

J'essais de ma familiariser avec les fonctions de texte...

Pour ça, j'ai récupéré en Module1 quelques fonctions...

J'ai fait plusieurs testes, mais n'arrive pas au résultat que je veut:

En colonne C, je voudrais supprimer le 1er espace et tout ce qui se trouve avant (c.a.d. l'heure).

Quelqu'un a-t-il une idée sur le sujet ?

Merci de votre aide...

Mon fichier joint :

18chevaux.xlsm (370.33 Ko)

Bonjour,

Essaie ceci :

Replace(chaine, Split(chaine, " ")(0) & " ", "")

Bonjour Altonia,

Peux-tu expliciter ce que tu cherches à faire dans les macros présentes dans Feuil2?

Version révisée :

Right(chaine, Len(chaine)-(Len(Split(chaine, " ")(0)+1))

Ce code permet d'éviter les suppressions indésirables de ma première proposition, dans le cas où les mot avant le premier espace est également présent ailleurs dans ta chaîne de caractères.

Bonsoir Pedro22 et GVIALLES,

Pedro22, ta 1ère ligne de code fait bien le travail, mais au coup par coup, c.a.d. : Je sélection une seule cellule, c'est bon, mais si je sélectionne la colonne entière j'ai une incompatibilité de type...

Ta 2ème ligne de code me provoque immédiatement une une incompatibilité de type...

Voici mon code avec ta ligne :

Sub SupprimerHeure()
Application.ScreenUpdating = False

Dim oCell As Range
For Each oCell In Selection.Cells
   If oCell.Text Like "* *" Then

       chaine = Selection.Cells.Value
       Selection.Cells.Value = Replace(chaine, Split(chaine, " ")(0) & " ", "")

End If

Next oCell
Application.ScreenUpdating = True

End Sub

GVIALLES, En Feuil1, J'ai une bdd importée du net.

J'ai fait une copie en feuil2.

La "Sub Supprimer()" supprime les ligne contenant "Cheval A-Z".

La "Sub deplacer()" Copie la ligne directement sous la ligne en gras d'une colonne et la colle sur la même ligne que la ligne en gras

et enfin supprime la ligne sous la ligne en gras.

La "Sub deplacer2()" Fait la même chose, mais avec un déplacement de 2 colonnes

Enfin, la sub injustement appelée "Sub Rechercher()" recherche les cellules contenant ":" dans la colonne B, et les transfert en

colonne C, et fini par effacer les cellules concernées en colonne B.

Je sais, c'est du bricolage, mais pour l'instant, j'ai pas mieux.

D'ailleurs je râle sur la longueur du temps d'exécution...

Si quelqu'un à mieux à me proposer, il est le bienvenu...

Bonjour à tous,

Un essai, voir si ça convient ....

Je fais écrire dans la colonne voisine pour fin de tests.

La ligne en commentaire fait la même chose, mais elle écrase les sources.

Sub SupprimerHeure()
 Dim oCell As Range

 Application.ScreenUpdating = False

   For Each oCell In Selection.Cells
      If oCell.Text Like "* *" Then
         chaine = oCell.Value
         oCell.Offset(0, 1) = Replace(chaine, Split(chaine, " ")(0) & " ", "")
   '       oCell = Replace(chaine, Split(chaine, " ")(0) & " ", "")
      End If
   Next oCell
   Application.ScreenUpdating = True
End Sub

ric

Salut atlonia,

ceci, peut-être ?

Un double-clic en Feuille 1 démarre la macro.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tData, tData1(), iIdx%
Cancel = True
'
tData = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
For x = 1 To UBound(tData, 1)
    If tData(x, 1) <> "Cheval A-Z" Then
        If (InStr(tData(x, 1), "/") = 0 And InStr(tData(x, 1), ":") = 0) Or InStr(tData(x, 1), "N/R") > 0 Then
            iIdx = iIdx + 1
            ReDim Preserve tData1(3, iIdx)
            tData1(0, iIdx - 1) = tData(x, 1)
        Else
            If InStr(tData(x, 1), "/") > 0 Then tData1(1, iIdx - 1) = tData(x, 1)
            If InStr(tData(x, 1), ":") > 0 Then tData1(2, iIdx - 1) = Split(Split(tData(x, 1), ":")(1), " ")(1)
        End If
    End If
Next
With Sheets(2)
    .Range("A1").Resize(iIdx, 3).Value = WorksheetFunction.Transpose(tData1)
    .Range("A:A").Font.Bold = True
    .Columns("A:C").AutoFit
    .Activate
End With
'
End Sub

A+

5chevaux.xlsm (197.35 Ko)

Salut ric,

Encore toi...lol.!

Ta procédure fonctionne à merveille...

Parfait comme à ton habitude.

Merci beaucoup

Bpnsoir Curulis57,

Magnifique, c'est quoi cette fusée...

quelle efficacité !

content de te retrouver,

Je me doutais bien qu'il fallait passer par les tableaux, mais je ne sais pas faire...

Si ce n'est pas trop abuser de ta gentillesse, pourrais tu me commenter un peu ton code ?

Merci infiniment...

Salut atlonia,

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tData, tData1(), iIdx%
Cancel = True
'
'mise en tableau de la colonne [A]
tData = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
'parcourons ce tableau
For x = 1 To UBound(tData, 1)
    'si la valeur est différente de "Cheval A-Z"...
    If tData(x, 1) <> "Cheval A-Z" Then
        ' ...on y regarde alors de plus près
        'si pas de ":" et pas de "/" sauf "N/R"... on a donc un nouveau cheval
        If (InStr(tData(x, 1), "/") = 0 And InStr(tData(x, 1), ":") = 0) Or InStr(tData(x, 1), "N/R") > 0 Then
            '... on crée une nouvelle ligne dans le tableau de résultats tData1
            iIdx = iIdx + 1
            ReDim Preserve tData1(3, iIdx)
            tData1(0, iIdx - 1) = tData(x, 1)   'inscription du cheval en 1ère position de la nouvelle ligne
        Else
            'si présence d'un "/", ce sont les proprio (?) et jockey (?) : inscription en 2e position
            If InStr(tData(x, 1), "/") > 0 Then tData1(1, iIdx - 1) = tData(x, 1)
            'si présence de ":", course (?) en 3e position
            If InStr(tData(x, 1), ":") > 0 Then tData1(2, iIdx - 1) = Split(Split(tData(x, 1), ":")(1), " ")(1)
            'Split(tData(x, 1), ":")(1) = division de la valeur sur ":" et on garde la 2e partie
            'que l'on splitte à nouveau sur " ", Split("1er split", " ")(1), toujours en gardant la 2e partie
        End If
    End If
Next
'Affichage
With Sheets(2)
    .Range("A1").Resize(iIdx, 3).Value = WorksheetFunction.Transpose(tData1)
    .Range("A:A").Font.Bold = True
    .Columns("A:C").AutoFit
    .Activate
End With
'
End Sub

Merci infiniment curulis57,

Tu viens de m'éviter l'aspirine...lol

J'étais entrain d'essayer d'y comprendre quelque chose, mais commençais à avoir la migraine.

Je vais garder cette macro sous le coude pour pouvoir y revenir et essayer de m'en servir comme modèle.

C'est un peu plus clair pour moi maintenant.

Merci encore mille fois.

PS curulis57,

Je viens de m'apercevoir que le nom de champs de courses comme "Cagne sur mer" étaient tronqués au 1er mot du nom...

Peux tu me dire ce qu'il faut modifier pour éviter cela ?

Merci

Salut atlonia,

très juste!

Je vais souvent trop vite!

If InStr(tData(x, 1), ":") > 0 Then tData1(2, iIdx - 1) = Right(tData(x, 1), Len(tData(x, 1)) - InStr(tData(x, 1), " "))

A+

Bonjour curulis57,

Merci, c'est parfait.

bonjour curulis57,

encore 2 petites questions si tu le permet :

A quoi sert la ligne "Cancel = True" ?

Pourquoi "-1" dans le tableau résultat ?

If InStr(tData(x, 1), "/") > 0 Then tData1(1, iIdx[Surligner] - 1[/Surligner]) = tData(x, 1)

Merci de ton indulgence...

Salut atlonia,

- Cancel = True

destiné à court-circuiter le comportement standard d'une application. Un clic droit commande habituellement un menu contextuel... qui serait embêtant ici.

Essaye en mettant cette ligne en commentaire, c-à-d avec une apostrophe devant la ligne.

- iIdx - 1

pour être très schématique, Il y a les tableaux comme tData pour faire une "capture" d'écran" et les tData1() dont tu peux déterminer toi-même les indices voire les redimensionner en cours de route.

* tData : comme il n'y a pas de colonne ou ligne "0" dans Excel, le 1er élément est tData(1,1).

Quel que soit l'endroit de ta feuille où tu opères cette capture-écran, le 1er élément sera (1,1).

* tData1() : sauf si stipules en début de programme OPTION BASE 1, le 1er élément de ce tableau sera tData1(0,0).

Ici, je l'utilise comme tableau de résultat dont j'ignore au départ le nombre final d'éléments, donc tData1() = NULL

Je le REDIMensionne au besoin en PRESERVant les données déjà enregistrées (sans PRESERVE, tu effaces ces données lors de chaque redimensionnement).

iIdx = iIdx + 1 veut dire que je crée un premier index mais premier élément (0,0) donc je dois faire iIdx-1 lors de l'enregistrement.

Tu ne peux REDIMensionner que le dernier indice à DROITE de ces tableaux = Redim Preserve tData1(2,iIdx), 2 pour deux données par colonne (par exemple, hein!) = un tableau de 2 lignes et iIdx colonnes.

1er élément : tData1(0, iIdx -1 = 0)

2e élément : tData1(1, iIdx-1 = 0)

iIdx = iIdx + 1 -> iIdx = 2

Redim Preserve tData1(2, iIdx) car il y a maintenant 2 colonnes

1er élément : tData1(0, iIdx -1 = 1)

2e élément : tData1(1, iIdx - 1 = 1)

Présentation des données dans tData1()

1er 2e

TOTO0 TOTO1

TATA0 TATA1

Pour obtenir à l'écran...

1er TOTO0 TATA0

2e TOTO1 TATA1

... tu dois alors basculer tData1() à l'horizontale = WorksheetFunction.TRANSPOSE(tData1)

Est-ce plus clair ainsi? Rien de compliqué, en fait si tu as une certaine vision 3D de la chose...

A+

Bonjour curulis57 et merci pour ces explications qui m'ont bien éclairé...

J'ai mis la ligne

Cancel = True

en commentaire, mais aucune incidence aux testes, peut être parce que l'exécution de la macro se fait au clic gauche...

J'ai bien saisi la différence des 2 tableaux, mais en observant ton code, une chose m'intrigué:

ReDim Preserve tData1([Surligner]3[/Surligner], iIdx)

Si mon tableau démarre à l'indice 0, j'ai donc:

Colonne 0

Colonne 1

colonne 2

alors, pourquoi "3" dans cette ligne ?

J'ai testé en remplaçant par "2", et le résultat est toujours bon....

Merci de partager tes connaissances...

Salut atlonia,

comme quoi, quand on ne s'appelle pas Boisgonthier, on ne la ramène pas, hein...

  • effectivement, l'indice 2 suffit puisqu'il signifie de 0 à 2 1/0 ;
  • Cancel = True par contre, je suis plus catégorique.
Je t'envoie le fichier avec la même procédure accessible via un clic-droit, la commande étant en commentaire : vois par toi-même!

Il est vrai qu'en cas de double-clic gauche, ça peut passer quelques fois... 1 ou 2 fois avant qu'Excel n'exécute pas la procédure mais, au contraire, allume le curseur dans la cellule cliquée pour, croit-il, un changement de valeur. 1/1 Ouf!

Ici, j'ai double-cliqué une dizaine de fois et, effectivement, la procédure s'est exécutée sans souci : ça n'arrive pas systématiquement.

On apprend tous les jours : c'est génial! Un chiffre en-dessous à taper = moins d'effort! Merci, atlonia!

A+

4chevaux.xlsm (254.83 Ko)

Bonsoir curulis57,

Arf..! Arf..!

Un chiffre en-dessous à taper = moins d'effort!

J'ai fais les testes que tu m'as dit, mais n'ai constaté aucun changement..

Mais peut être que je ne les ai pas poussés assez loin !

En tout cas, merci encore infiniment pour ton aide précieuse qui m'a bien aidé à mieux comprendre les tableaux.

Au plaisir de te retrouver au grès de mes problèmes en VBA...

Rechercher des sujets similaires à "suppression partie texte"