Excel : remplacer une chaîne par une autre

Résolu
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008
-
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008
-
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.

13 réponses

Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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.

++
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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"
<!--
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
>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
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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.

++
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
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
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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 !!!