web-dev-qa-db-fra.com

Simuler la fonction de fractionnement de chaînes dans une formule Excel

J'essaie de diviser une chaîne dans une formule Excel, quelque chose comme je peux le faire dans de nombreux langages de programmation, par exemple.

string words = "some text".split(' ');

Le problème est que je ne peux pas être sûr qu'il y ait plus d'un mot dans la cellule. Si j'essaie d'utiliser les fonctions FIND() ou SEARCH(), elles renvoient #VALUE S'il n'y a pas d'espace. Existe-t-il un moyen simple de diviser la chaîne afin qu'elle renvoie les mots individuels (ou encore mieux, afin qu'elle renvoie soit les premiers mots ou tous les autres mots)?

25
a_m0d

Une formule pour renvoyer le premier mot ou tous les autres mots .

=IF(ISERROR(FIND(" ",TRIM(A2),1)),TRIM(A2),MID(TRIM(A2),FIND(" ",TRIM(A2),1),LEN(A2)))

Exemples et résultats

Text                  Description                      Results

                      Blank 
                      Space 
some                  Text no space                some
some text             Text with space                  text
 some                 Text with leading space          some
some                  Text with trailing space         some
some text some text   Text with multiple spaces        text some text

Commentaires sur la formule:

  • La fonction TRIM est utilisée pour supprimer tous les espaces de début et de fin. L'espacement en double dans le texte est également supprimé.
  • La fonction FIND trouve alors le premier espace
  • S'il n'y a pas d'espace, le texte coupé est renvoyé
  • Sinon, la fonction MID est utilisée pour renvoyer tout texte après le premier espace
23
Robert Mearns

Ce qui suit renvoie le premier mot dans la cellule A1 lorsqu'il est séparé par un espace (fonctionne dans Excel 2003):

=LEFT(A1, SEARCH(" ",A1,1))
9
RobS
=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)

Cela vérifiera d'abord si la cellule contient un espace, s'il le fait, il retournera la première valeur de l'espace, sinon il retournera la valeur de la cellule.

Éditer

Juste pour ajouter à la formule ci-dessus, en l'état, s'il n'y a pas de valeur dans la cellule, elle retournerait 0. Si vous cherchez à afficher un message ou quelque chose pour dire à l'utilisateur qu'il est vide, vous pouvez utiliser ce qui suit:

=IF(IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)=0, "Empty", IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3))
9
James

Ces choses ont tendance à être plus simples si vous les écrivez une cellule à la fois, en décomposant les formules longues en plus petites, où vous pouvez les vérifier en cours de route. Vous pouvez ensuite masquer les calculs intermédiaires ou les regrouper dans une seule formule.

Par exemple, en prenant la formule de James:

=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)

Ce qui n'est valable que dans Excel 2007 ou version ultérieure.

Décomposez-le comme suit:

B3: =FIND(" ", A3)
C3: =IF(ISERROR(B3),A3,LEFT(A3,B3-1))

C'est juste un peu plus facile à travailler, un morceau à la fois. Une fois cela fait, vous pouvez le transformer en

=IF(ISERROR(FIND(" ", A3)),A3,LEFT(A3,FIND(" ", A3)-1))

si vous le désirez.

3
Carl Manaster

Si vous avez besoin de l'allocation aux colonnes seulement une fois que la réponse est la fonctionnalité "Texte en colonnes" dans MS Excel.

Voir l'article d'aide MS ici: http://support.Microsoft.com/kb/214261

HTH

2
Toffix

Une grande feuille de calcul-fu dans les autres réponses, mais je pense qu'ils ont oublié que vous pouvez définir une fonction définie par l'utilisateur (udf) et l'appeler à partir de la feuille ou d'une formule.

Le problème suivant que vous avez est de décider de travailler avec un tableau entier ou avec un élément.

Par exemple, ce code de fonction UDF

Public Function UdfSplit(ByVal sText As String, Optional ByVal sDelimiter As String = " ", Optional ByVal lIndex As Long = -1) As Variant
    Dim vSplit As Variant
    vSplit = VBA.Split(sText, sDelimiter)
    If lIndex > -1 Then
        UdfSplit = vSplit(lIndex)
    Else
        UdfSplit = vSplit
    End If
End Function

permet des éléments uniques avec les éléments suivants dans une cellule

=UdfSplit("EUR/USD","/",0)

ou on peut utiliser un bloc de cellules avec

=UdfSplit("EUR/USD","/")

1
S Meaden

Mettez en surbrillance la cellule, utilisez Dat => Text to Columns et le DELIMITER est un espace. Le résultat apparaîtra dans autant de colonnes que le fractionnement trouvera l'espace.

1
user4196835