Boucle for et condition If

Bonjour à tous,

Je me permets de créer un nouveau forum car malgré mes recherches je n'arrive pas à trouver de solution à mon problème.

Je souhaite harmoniser différents dossiers et pour cela j'ai rédigé une macro qui doit venir voir dans une cellule si elle "trouve" un ou plusieurs mots clés et les remplace par une chaîne de caractères commune.

Voici le code que j'ai réalisé:

Sub GérerlesGEH()

Dim i As Integer
i = 5 ‘ definition de mon élément d’incrémentation
Dim contenancecase As String
contenancecase = ""  ‘ definition d’une chaîne de caractère tampon en quelque sorte 
Dim maxligne As Integer
maxligne = WorksheetFunction.CountA("B5:B1000") ‘ on vient verifier combien de ligne sont renseignées 

For i = 5 To maxligne

  If Range("E” & i) Like " soins"  Then  ‘ on vient verifier si dans la cellule Ei il y a présence des mots clés recherchés
   contenancecase = contenancecase + "Pôle Soins - Général/"  ‘ la chaîne de caractère ajoute ce qui remplacera le mot clé actuel
  End If

  If Range("E”&i)  Like "laboratoire" Then
   contenancecase = contenancecase + "Pôle Qualité - Laboratoire soins/"
  End If

  If Range("E”&i) Like "qualité" Then
   contenancecase = contenancecase + "Pôle Qualité - Général"
  End If

  If Range("E”&i) Like "logistique" Then
   contenancecase = contenancecase + "Pôle Logistique - Général/"
  End If

  If Range("E”&i)  Like "achat" Then
   contenancecase = contenancecase + " Pôle ACHAT - Général"
  Else
   contenancecase = "Général"  ‘ si aucune des conditions n’est respectée on inscrit Général
  End If

Range("E”&i) Value = contenancecase ‘ on remplace la valeur de la cellule par la chaîne de caractère contenancecase
Next
End Sub

Selon les petites variations que je réalise les erreurs proviennent de la boucle for ou des If.

En vous remerciant d'avance pour votre aide,

J'espère pouvoir monter rapidement en compétence et à mon tour apporter mon aide,

Cordialement,

Bonjour

Quelles erreurs avez-vous ?

Cordialement

Bonjour Loerat, Dan , le forum,

Essaies ainsi:

Sub GérerlesGEH()

Dim i As Integer
'i = 5        'definition de mon élément d’incrémentation
Dim valeur As String

Dim dl As Integer
    dl = Range("E" & Rows.Count).End(xlUp).Row

For i = 5 To dl

   x = Range("E" & i)
 valeur = x
 Select Case x
  Case Is = "soins"
   valeur = valeur + " Pôle Soins - Général/"
  Case Is = "laboratoire"
   valeur = valeur + " Pôle Qualité - Laboratoire soins/"
  Case Is = "qualité"
   valeur = valeur + " Pôle Qualité - Général"
  Case Is = "logistique"
   valeur = valeur + " Pôle Logistique - Général/"
  Case Is = "achat"
   valeur = valeur + " Pôle ACHAT - Général"
  Case Else
   valeur = " Général"
 End Select

    Range("E" & i).Value = valeur ' on remplace la valeur de la cellule par la chaîne de caractère valeur
Next i
End Sub
4classeur1.xlsm (19.36 Ko)

Cordialement,

Bonjour Dan,

Sur le code que j'ai renseigné dans mon message il n'affiche pas d'erreur il "tourne" mais les cases restent inchangées.

Bonjour xorsankukai, tout d'abord merci pour votre code!

J'ai essayé le code que vous m'avez donné mais celui ci transforme toute les cases en "Général" alors même que certaines contiennent le termes "soins " et "logistique" (Oui j'ai oublié de préciser que pour une même case il peut y avoir plusieurs termes dedans, c'est pour cela que je souhaité utilisé une variable "tampon" pour ne pas effacer mon contenu de cellule)

Est ce lié au fait que SELECT regarde si le terme "soins" est présent tel quel ? Et donc si il est présent avec d'autre caractère il n'est pas pris en compte ?

En vous remerciant d'avance,

Bien cordialement

Bonjour Dan,

Sur le code que j'ai renseigné dans mon message il n'affiche pas d'erreur il "tourne" mais les cases restent inchangées.

Bonjour xorsankukai, tout d'abord merci pour votre code!

J'ai essayé le code que vous m'avez donné mais celui ci transforme toute les cases en "Général" alors même que certaines contiennent le termes "soins " et "logistique" (Oui j'ai oublié de préciser que pour une même case il peut y avoir plusieurs termes dedans, c'est pour cela que je souhaité utilisé une variable "tampon" pour ne pas effacer mon contenu de cellule)

Est ce lié au fait que SELECT regarde si le terme "soins" est présent tel quel ? Et donc si il est présent avec d'autre caractère il n'est pas pris en compte ?

En vous remerciant d'avance,

Bien cordialement

Bonjour à tous,

Le code:

Select Case x
  Case Is = "soins"
   valeur = valeur + " Pôle Soins - Général/"
  Case Is = "laboratoire"
   valeur = valeur + " Pôle Qualité - Laboratoire soins/"
  Case Is = "qualité"
   valeur = valeur + " Pôle Qualité - Général"
  Case Is = "logistique"
   valeur = valeur + " Pôle Logistique - Général/"
  Case Is = "achat"
   valeur = valeur + " Pôle ACHAT - Général"
  Case Else
   valeur = " Général"
 End Select

Fait que si tu as plusieurs termes, tu finiras toujours dans le cas Else, car le test n'est pas "contient soins", mais "tout le contenu de la cellule est égal à soins".

Autre chose par rapport au Select Case, il s'arrêtera de tester la valeur de x si tu as déjà remplis une des conditions, donc si tu as soins, ta valeur va être changée et tu vas directement aller à la ligne "End Select", de ce que j'ai rapidement lu, ce n'est pas ce que tu souhaites, c'est ça?

Bonjour Ausecours,

Oui exactement, je cherche à tester la présence de certains mots clés dans la cellule sachant qu'il peut y en avoir plusieurs ou aucun. C'est pour cela que je cherchais à utiliser dans mon premier code des succession de IF pour retourner vérifier à chaque fois dans ma cellule si le mot clé suivant est contenu ou pas!

C'est pour cela que je combinais la fonction Like et IF, dans le code de mon premier message le code n'affiche pas d'erreur mais ne modifie pas les cellules.

Bien cordialement,

Re,

J'essaye de te proposer une solution qui mixe un peu celles des autres:

Sub GérerlesGEH()

Dim i As Integer
i = 5 'definition de mon élément d’incrémentation
Dim contenancecase As String
contenancecase = ""  'definition d’une chaîne de caractère tampon en quelque sorte
Dim maxligne As Integer
maxligne = WorksheetFunction.CountA("B5:B1000") 'on vient verifier combien de ligne sont renseignées

For i = 5 To maxligne
    If Range("e" & i) <> "" Then
        tableau = Split(Range("e" & i), " ") 'met chaques valeurs séparées par un espace dans une case du tableau
        texte = ""
        For h = LBound(tableau, 1) To UBound(tableau, 1) 'parcourt le tableau
            Select Case tableau(h)
            Case "soins"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Soins - Général/"
            Case "laboratoire"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Qualité - Laboratoire soins/"
            Case "qualité"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Qualité - Général"
            Case "logistique"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Logistique - Général/"
            Case "achat"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle ACHAT - Général"
            Case Else
                texte = texte & IIf(texte <> "", " ", "") & "Général"
            End Select
        Next h

        Range("E" & i) = texte 'on remplace la valeur de la cellule par la chaîne de caractère contenancecase
    End If
Next i
End Sub

Elle ne marchera que si tes mots sont bien séparés par un espace, si ce n'est pas le cas, il faudra me le dire

J'espère que ça fonctionnera!

Merci beaucoup de votre réponse,

Je vois donc vous venez prendre les termes d'une cellule que vous insérez dans un tableau pour pouvoir les lire indépendamment ?

Malheureusement comme il s'agit de fichier rempli manuellement des fois les termes sont séparés par le signe "/" et des fois par le terme "et".

Peut-on adapter le code en modifiant le critère de séparation comme ceci :

If Range("e" & i) <> "" Then

tableau = Split(Range("e" & i), " ","/","et") 'met chaques valeurs séparées par un espace dans une case du tableau

texte = ""

?

Merci d'avance,

Bien cordialement,

Rebonjour,

On ne peut pas faire de Split avec plusieurs délimiteurs, en revanche on peut avoir une astuce, quand tu mets et, ça donne bien "soins et logistique", et avec le slash, "soins / logistique"

Je peux essayer de remplacer " et " par " " et " / " par " " afin que ça fonctionne aussi

Rebonjour,

De même malheureusement cela dépend des lignes des fois on peut avoir "soins/logistique" ou bien "soins /logistique" ou bien "soins / logistique"... selon la personne qui renseigne la case :/

Merci de votre aide,

Bien cordialement,

Re,

Ah d'accord, difficile de savoir alors

Pour le "/" ça peut se gérer, par contre pour le "et", il vaut mieux que ça ne soit pas collé à d'autres mots...

Je te propose cette modification en espérant que ça fonctionne

Sub GérerlesGEH()

Dim i As Integer
i = 5 'definition de mon élément d’incrémentation
Dim contenancecase As String
contenancecase = ""  'definition d’une chaîne de caractère tampon en quelque sorte
Dim maxligne As Integer
maxligne = WorksheetFunction.CountA("B5:B1000") 'on vient verifier combien de ligne sont renseignées

For i = 5 To maxligne
    valeur = Range("e" & i)
    If valeur <> "" Then
        valeur = Replace(valeur, " et ", " ") 'remplace les " et "
        valeur = Replace(valeur, "/", " ") 'remplace les "/"
        tableau = Split(Range("e" & i), " ") 'met chaques valeurs séparées par un espace dans une case du tableau
        texte = ""
        For h = LBound(tableau, 1) To UBound(tableau, 1) 'parcourt le tableau
            Select Case Trim(tableau(h)) 'pour supprimer d'éventuels espaces indésirables
            Case "soins"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Soins - Général/"
            Case "laboratoire"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Qualité - Laboratoire soins/"
            Case "qualité"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Qualité - Général"
            Case "logistique"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle Logistique - Général/"
            Case "achat"
                texte = texte & IIf(texte <> "", " ", "") & "Pôle ACHAT - Général"
            Case ""

            Case Else
                texte = texte & IIf(texte <> "", " ", "") & "Général"
            End Select
        Next h

        Range("E" & i) = texte 'on remplace la valeur de la cellule par la chaîne de caractère contenancecase
    End If
Next i
End Sub

Pour voir si le problème vient des successions de IF j'ai testé un "petit code" dans lequel je ne regarde' que la présence de "soins". :

Sub Nouveau()

Dim i As Integer

i = 5

Dim chainecaractere As String

For i = 5 To 1000

If Range("E" & i) Like " soins" Then

chainecaractere = "POLE SOINS GENERAL"

End If

i = i + 1

Range("E" & i).Value = chainecaractere

Next

End Sub

Une fois que je lance la macro certaine ligne contenant soins disparaisses sans que la chaîne de caractère nouvelle soit insérée et d'autres qu contiennent également soins restent inchangées. Pourtant je spécifie bien : Range("E" & i).Value = chainecaractere la cellule devrait donc prendre la valeur de la chaîne de caractére ?

Re bonjour Ausecour,

Désolé je n'avais pas vu ton message avant de poster,

J'ai essayé ton code, il n'affiche pas d'erreur mais après avoir tourné toutes les cellules restent inchangées.

Je ne comprends pas car elles répondent pourtant aux nouveaux critères du code :/

Merci de ton aide,

Cordialement,

Re,

Pour ce que tu as fait, quand tu veux dire contient "soins" il faut écrire Like "*soins*", je suppose que tu ne peux pas nous transférer ton fichier pour que je puisse débuguer le bout de code que je t'ai passé?

Je peux te déposer une copie pour que tu regardes

Re

Desole de revenir seulement maintenant. J avais prepare quelque chose sur le coup de midi.

Je vous laisse avec Ausecour qui suit le sujet.

Cordialement

Pas de soucis merci de votre aide Dan et bonne journée à vous !

Je peux te déposer une copie pour que tu regardes

Bonjour,

Merci d'avoir envoyé un fichier pour voir à quoi il ressemble, malheureusement ça ne va pas beaucoup m'aider, j'aurais eu besoin de voir ton jeu de données avant macro afin de pouvoir tester le programme et trouver comment le faire fonctionner correctement, est-ce que tu pourrais me faire quelque chose comme ça?

Bonjour,

Comment cela le jeu de données avant macro ?

Dans le fichier que j'ai déposé il s'agit du fichier d'origine (moins les noms) la colonne E que je souhaite changer n'a pas été soumise à macro dans le fichier.

Le fichier est court mais j'en ai beaucoup beaucoup comme celui ci et plus long c'est pour cela que je cherche à faire une macro

Dites moi si vous avez besoin que je dépose un autre fichier

Merci de votre aide !

Re,

Désolé c'est juste moi qui vois mal, je ne voyais que les données transformées

Je vais tenter de faire quelque chose on va voir ce que ça va donner

Rechercher des sujets similaires à "boucle condition"