Manipulation de chaîne avec Excel - Comment supprimer une partie d'une chaîne s'il en existe une autre?

StackOverflow https://stackoverflow.com/questions/263225

Question

J'ai fait quelques recherches sur Google et je ne trouve rien, même si je ne cherche peut-être que les mauvais endroits. Je ne suis pas non plus très habile chez VBA, mais je suis sûr de pouvoir le comprendre avec les bons indicateurs:)

Je construis une chaîne qui est une concaténation de différentes cellules, en fonction de différentes conditions. Je frappe dans l'ordre.

=IF(A405<>A404,G405,G405&H404)

Ce que je veux faire est de revenir en arrière dans ma liste concaténée, en supprimant une valeur remplacée si le remplaçant est dans la liste.

Par exemple, voir la liste suivante:

A, D, G, Y, Z

Je souhaite supprimer D si et uniquement si Y est présent.

Comment pourrais-je m'y prendre? (VBA ou dans la cellule, bien que je préfère dans la cellule)

Était-ce utile?

La solution 7

Je viens tout juste de recevoir ceci comme solution possible par courrier électronique:

=IF(A15<>A14,G15,IF(OR(AND(G15="CR247, ",ISNUMBER(FIND("CR247, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR215, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR180, ",H14))),AND(G15="CR180, ",ISNUMBER(FIND("CR215, ",H14))),G15="CR113, "),H14,G15&H14))

(cela a les " vraies " valeurs avec des règles de priorité)

Il semble relativement similaire à La réponse de @ Joseph .

Y a-t-il une meilleure solution?

Autres conseils

Essayez:

=IF(ISERROR(FIND("Y",A1)),A1,SUBSTITUTE(A1,"D, ",""))

Mais cela suppose que vous ayez toujours la virgule et l'espace après le D.

Tout d'abord, pourquoi ne pas conserver un tableau de chaînes lorsque vous parcourez toutes les cellules, puis tout concaténer à la fin?

Sinon, vous utiliserez des fonctions de chaîne telles que INSTR et MID pour faire quelque chose comme:

start1 = instr(myLongString,"Y, ")
if start1 > 0 Then
    start2 = instr(myLongString,"D, ")
    if start2 > 0 then
        newLongString = left(myLongString, start2 - 1) & _
                        mid(myLongString, start2 + 3)
    end if
end if

Mais, comme je l'ai dit, je conserverais un tableau facile à parcourir, puis une fois que vous aurez toutes les valeurs que vous SAVEZ, vous les utiliserez, concaténez-les à la fin.

VBA : vous pouvez toujours utiliser l'objet regexp. Je pense que cela vous donne la possibilité de tester n'importe quoi sur votre script tant que vous construisez correctement l'expression régulière.

Découvrez: http://msdn.microsoft.com/en-us/library/yab2dx62(VS.85).aspx (pour une référence regexp)
et un outil simple pour tester vos expressions rationnelles: http://www.codehouse.com/webmaster_tools/regex/

Dans la cellule : vous pouvez le faire d'une manière plus conviviale:
supposons sur la colonne A: A vous avez les valeurs.
Vous pouvez ajouter une nouvelle colonne à l'endroit où vous effectuez la vérification.
if(indirect("A"&row()) <> indirect("A"&row()-1), indirect("G"&row()), indirect("G"&row())& indirect("H"&row()))
ou quelles que soient les valeurs. J'imagine cependant que sur une branche de l'instruction if, la valeur doit être vide. Ensuite, ne concaténez que les valeurs de la colonne B: B (en ignorant les blancs si nécessaire).

J'espère que cela vous aidera.

Il est probablement plus facile de commencer à la fin, de faire vos ajouts au début de la chaîne et d’ajouter D uniquement si Y n’est pas présent.

Je suppose que D pourrait apparaître n'importe où, alors que diriez-vous:

If InStr(strString, "Y") > 0 Then
   strString = Replace(strString, "d", "")
   strString = Replace(strString, "  ", "")
   strString = Replace(strString, " ,", "")
   strString = Replace(strString, ",,", ",")
End If

S'il n'y a pas trop de combinaisons à supprimer, vous pouvez utiliser = IF (FIND (& "; D &"; A2) > 0; REMPLACER (A2 ; 1; 3; & "; &"); A2).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top