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