Excel : remplacer une chaîne par une autre

Résolu
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008 - 28 août 2006 à 17:22
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008 - 29 août 2006 à 16:15
Bonjour,

Je suis sous un classeur XLS.
Je récupère des données d'une BDD Oracle.
Parmi ces données, une colonne récupère des priorités de trois niveaux à l'aide d'étoiles, c'est-à-dire *, ** et ***
J'aimerais que * soit remplacé par 'low', ** soit remplacé par 'medium' et *** soit remplacé par 'high'.

J'ai cru voir une fonction du genre 'Replace'.

Merci par avance à tous ceux qui voudront bien m'aider.
A voir également:

13 réponses

nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
29 août 2006 à 16:13
Re,

Bon, en fait, j'ai fait un truc tout simple, mais qui marche.
J'ai créé une fonction que j'appelle à la fin de l'extraction

Sub PriorityReplace()
    Dim PriorityCell As Range
    ActiveSheet.Columns("H:H").Select
    Dim p As String
    For Each PriorityCell In Selection
        If PriorityCell.Value = "-" Then
            PriorityCell.Value = "Low"
        ElseIf PriorityCell.Value = "*" Then
            PriorityCell.Value = "Medium"
        ElseIf PriorityCell.Value = "**" Then
            PriorityCell.Value = "High"
        ElseIf PriorityCell.Value = "***" Then
            PriorityCell.Value = "Urgent"
        End If
    Next
End Sub

Merci à tous pour vos suggestions.

++
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 17
28 août 2006 à 17:32
Salut,

j'allais justement te dire d'aller voir Replace, je vois que tu as trouvé.
Va dans l'aide vba excel, la syntaxe y est !!
Syntaxe

Replace(expression,find,replace[,start[,count[,compare]]])

L'aide est plus que détaillée, et il y a des centaines d'exemples ici, je ne vois pas où tu bloques.

@++


  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 août 2006 à 17:36
Salut,


Voici une petite usine a gaz




Dim UneCellule As Range 
'Selectionne la colonne D (c'est la ou j ai testé avec des ** *** *)
ActiveSheet.Columns("D:D").Select 
Dim p As String 
'Pour chaque cellule de la colonne
For Each UneCellule In Selection 
    'récupération de la valeur
    p =  UneCellule.Value 
    'remplacement des *** par high
    p =  Replace (p, "***", "'high'") 
    'remplacement des ** par medium
    p  = Replace(p, "**", "'medium'") 
    'remplacement des * par low
    p =   Replace (p, "*", "'low'") 
    'remise de p dans la cellule
    UneCellule.Value  = p 
Next 
 







<small> Coloration syntaxique automatique [AFCK]</small>

       
















@+,   Ju£i?n
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
28 août 2006 à 23:56
Salut Julien, Salut Mortalino,

Je ne fais que passer en coup de vent mais ... Heu .. En formule Excel, ça donne, à supposer que tu as ton ou tes * dans la cellule B2 :
Par ex, en C2 : =SI(NBCAR(B2)=1;SUBSTITUE(B2;"*";"Low");SI(NBCAR(B2)=2;SUBSTITUE(B2;"**";"Medium");SUBSTITUE(B2;"***";"High")))

Et hop là, plus qu'à jouer avec Excel.
Mais chuuuut, je suis déjà parti

Molenn
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
29 août 2006 à 08:39
>Molenn: Va falloir que tu m'expliques comment utiliser ta formule car je viens de la mettre en fonction dans C2 et je viens de mettre * dans B2 et Ô miracle, rien ne s'est produit....

@+,   Ju£i?n
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
29 août 2006 à 09:45
Tu m'étonnes parce que je l'ai faite de chez moi (sous Excel 2000), aucun soucis.
Je l'essaye du boulot (sous Excel 2003), aucun soucis.

Par acquis de conscience, j'ai enlevé tout ce que je coche dans les macros complémentaires (ça aurait pu venir de là) mais non, tout fonctionne sans aucune de ces macros.
Je ne te fais pas l'affront de te demander si tu n'aurais pas un espace ou une ' avant le signe de la formule ^^SI(NBCAR(B2)=1;SUBSTITUE(B2;"*";"Low");SI(NBCAR(B2)=2;SUBSTITUE(B2;"**";"Medium");SUBSTITUE(B2;"***";"High")))
Ceci collé dans ma cellule C2.
Et quand je tape directement * dans la cellule B2, ça m'affiche bien en C2 Low, ** Medium et *** High.

La formule est on ne peut plus simple à relire et comprendre, honnêtement, je ne vois pas comment ça ne peut pas fonctionner chez toi (sauf si tu es en Excel 97, je n'ai aucune idée de l'existence de cette formule dans une version antérieure à 2000).

Je compte le nb de caractère dans la cellule B2, idem, s'il y a un espace ou une ' dans la cellule, ça fausse forcément la formule.

Molenn
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
29 août 2006 à 10:30
Re,

Mea culpa c'est moi le blaireau
=> j'ai teste en collant comme un gland (mais en C1 et et en testant dans B1 )

Autre question si tu as 600 lignes tu dois te taper 600 la formule? si oui ne vaut il mieux pas passer par le code directement?

@+,   Ju£i?n
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 17
29 août 2006 à 10:39
Re Julien,

je pense que tu peux étendre la formule (par le coin inférieur droit de la cellule) jusqu'à la ligne 600.
Les bonnes valeurs s'incrémenteront automatiquement.

++
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
29 août 2006 à 10:42
Effectivement, la formule ne contrôle qu'une seule cellule, mais ça dépend des besoins.

Si c'est ponctuel, ça peut être utile : Par exemple, tes données sont toutes dans la colonne B, recopier la formule dans la colonne C sur toutes les lignes prend chrono en main 3 secondes (ce qui prend le plus de temps, c'est de venir avec la souris sélectionner la première cellule ^^).
L'inconvénient, mais ça, c'est typique de toutes utilisations Excel, plus il y a de lignes, plus ton fichier s'alourdit, et c'est toujours un peu lourd quand le nb de lignes varient d'un export à l'autre, mais ça se corrige bien.

Ca dépend toujours du besoin, mais je suis toujours dans une optique au boulot : en règle générale, je fournis des fichiers Excel ou Access a des collègues, je leur prépare des fichiers pour le traitement des données. Je vais toujours au plus simple parce que le jour où ils ont un pb, ils arrivent à se débrouiller tout seul en recopiant les formules, etc ...
Avec du code VB, si un jour il y a un msg de debug, c'est la fin : je suis toujours dérangé ^^

Après, en code, c'est sûrement plus propre dans le sens où tu peux adapter à une taille aléatoire de données, sans être obligé de rajouter des lignes, etc ...

Mais en fait, il y aurait même encore plus simple qu'une boucle, etc ...
Suffit de sélectionner toute la colonne, et de faire un ctrl+H : et de remplacer "***" par "High", puis **, etc ...
Tout est question de besoin ^^

Molenn
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
29 août 2006 à 15:33
Bonjour,

Merci pour vos réponses et remarques...
En fait, j'opte plutôt pour l'automatisme, c'est-à-dire que dans la BDD, ce sont des étoiles, mais qu'à l'affichage, il y a le texte.
Cela doit donc se passer entre l'extraction et l'affichage mais quelle formule utiliser ?

Merci.

Voici un bout de mon code :

' Fetch the content of the temporary table
    query = "select id ""N° Request"", type ""Type"", business_line ""Origin"", hub ""Hub"", open_date ""Request Date"", summary ""Summary"", task_est_effort ""Estimated Effort"", priority ""Priority"", task_status ""Task status"", wished_date ""Deadline"", comments ""Comments"" "
    query = query & "from tmp_change "    query query & "where user_id 'windows_login' "
    query = query & "order by open_date desc"
    cmd.CommandText = query
    Set rst = cmd.Execute




    ' Transfer the result set into the Excel worksheet
    For i = 0 To rst.Fields.Count - 1 Step 1
        Cells(1, i + 1).Value = rst.Fields(i).Name
    Next
    rst.MoveFirst
    Row = 2
    While Not rst.EOF
        For i = 0 To rst.Fields.Count - 1 Step 1
            Cells(Row, i + 1).Value = rst(i).Value
        Next
        Row = Row + 1
        rst.MoveNext
    Wend
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
29 août 2006 à 15:33
Bonjour,

Merci pour vos réponses et remarques...
En fait, j'opte plutôt pour l'automatisme, c'est-à-dire que dans la BDD, ce sont des étoiles, mais qu'à l'affichage, il y a le texte.
Cela doit donc se passer entre l'extraction et l'affichage mais quelle formule utiliser ?

Merci.

Voici un bout de mon code :

' Fetch the content of the temporary table
    query = "select id ""N° Request"", type ""Type"", business_line ""Origin"", hub ""Hub"", open_date ""Request Date"", summary ""Summary"", task_est_effort ""Estimated Effort"", priority ""Priority"", task_status ""Task status"", wished_date ""Deadline"", comments ""Comments"" "
    query = query & "from tmp_change "    query query & "where user_id 'windows_login' "
    query = query & "order by open_date desc"
    cmd.CommandText = query
    Set rst = cmd.Execute




    ' Transfer the result set into the Excel worksheet
    For i = 0 To rst.Fields.Count - 1 Step 1
        Cells(1, i + 1).Value = rst.Fields(i).Name
    Next
    rst.MoveFirst
    Row = 2
    While Not rst.EOF
        For i = 0 To rst.Fields.Count - 1 Step 1
            Cells(Row, i + 1).Value = rst(i).Value
        Next
        Row = Row + 1
        rst.MoveNext
    Wend
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
29 août 2006 à 15:40
Salut,

Mais rien de ce que nous t'avons propose ne te donne satisfaction ????


Si tu ne veux pas modifie rle recordset tu peux juste te faire un tableau du style


'a l initialisation
Dim Correspondance As New Collection


Call Correspondance.Add("low", "*")
Call Correspondance.Add("medium", "**")
Call Correspondance.Add("high", "***")

Ensuite (admettons que ce soit le champ 2 du recordet qui contiens les *)
            Cells(Row, i + 1).Value = Correspondance(Cstr(rst(i).Value))






@+,   Ju£i?n
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
29 août 2006 à 16:15
Si si, au contraire Julien,


L'émulation de groupe c'est énorme !!! Ca donne plein d'idée. Ca permet de voir des angles vus par certains mais pas d'autres.


Merci encore !!!
0
Rejoignez-nous