web-dev-qa-db-ja.com

Excelの数式で文字列分割関数をシミュレートする

私は多くのプログラミング言語でできるように、Excelの式で文字列を分割しようとしています.

_string words = "some text".split(' ');
_

問題は、セルに複数のWordがあることを確認できないことです。 FIND()またはSEARCH()関数を使用しようとすると、スペースがなければ_#VALUE_を返します。個々の単語を返すように文字列を分割する簡単な方法はありますか?最初の単語または他のすべて単語のいずれかを返すようにもっと良い方法はありますか?

25
a_m0d

最初の単語または他のすべての単語を返す式。

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

例と結果

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

式に関するコメント:

  • [〜#〜] trim [〜#〜]関数は、先頭および末尾のスペースをすべて削除するために使用されます。テキスト内の重複するスペースも削除されます。
  • [〜#〜] find [〜#〜]関数は最初のスペースを見つける
  • スペースがない場合は、トリミングされたテキストが返されます
  • そうでない場合、[〜#〜] mid [〜#〜]関数を使用して、最初のスペースの後のテキストを返します。
23
Robert Mearns

以下は、スペースで区切られたときにセルA1の最初のWordを返します(Excel 2003で動作します)。

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

これは、最初にセルにスペースが含まれているかどうかをチェックし、含まれている場合はスペースから最初の値を返し、そうでない場合はセルの値を返します。

編集

上の式に追加するだけで、セルに値がない場合は0を返します。メッセージまたはユーザーに空であることを伝える何かを表示したい場合は、次を使用できます。

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

一度にセルを記述すると、これらのことはより単純になる傾向があり、長い数式を小さな数式に分割して、途中で確認できます。その後、中間計算を非表示にするか、すべてを1つの式にまとめることができます。

例えば、ジェームズの式をとる:

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

これはExcel 2007以降でのみ有効です。

次のように分割します。

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

作業が少しずつ簡単になります(一度に1チャンクずつ)。完了したら、それを

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

あなたがとても望むなら。

3
Carl Manaster

一度だけ列に割り当てる必要がある場合、答えはMS Excelの「列へのテキスト」機能です。

MSヘルプ記事を参照してください: http://support.Microsoft.com/kb/214261

HTH

2
Toffix

他の回答では素晴らしいワークシートフーがいくつかありますが、ユーザー定義関数(udf)を定義し、シートまたは数式からこれを呼び出すことができることを見落としていると思います。

次の問題は、配列全体または要素のどちらで作業するかを決定することです。

たとえば、この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
_

1つのセルに次のものを含む単一の要素を許可します

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

または、セルのブロックを使用できます

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

1
S Meaden

セルを強調表示し、Dat => Text to Columnsを使用します。DELIMITERはスペースです。結果は、スプリットがスペースを見つけるのと同じ数の列に表示されます。

1
user4196835