Philには、テキストを含む一連のセルがあります。一部のテキストは長すぎるため、複数のセルに分割する必要があります。たとえば、セルに「クイックブラウンフォックス」が含まれていて、テキストを分割して12文字を超えないようにする必要がある場合、Philは簡単にそれを行うことができます。しかし、彼は、正確な12番目の文字ではなく、12番目の文字の前のスペースで分割が行われるようにしたいと考えています。フィルはこれを行う方法について途方に暮れています。

Excelの[テキストから列へ]ツールを使用できると思うかもしれませんが、このツールはその仕事には適していません。スペースなどの区切り文字に基づいてテキストを分割するようにツールを設定すると、各セルに1つの単語が表示されます。テキストを「固定幅」として分割するようにツールを設定した場合、単語はスペースで分割されません。各チャンクが指定したサイズであることを確認するだけです。

数式を使用して目的の結果を得ることができますが、そうすると、数式が驚くほど長くなります。たとえば、長すぎるテキストがセルA3にある場合、次の数式を使用して、12番目の文字の前のスペースでそのテキストの最初のチャンクを分割できます。

=IF(LEN($A3)>12,IF(ISERROR(FIND(" ",MID($A3,12,1)

&MID($A3,11,1)&MID($A3,10,1)&MID($A3,9,1)&MID($A3,8,1)

&MID($A3,7,1)&MID($A3,6,1)&MID($A3,5,1)&MID($A3,4,1)

&MID($A3,3,1)&MID($A3,2,1))),MID($A3,1,1),MID($A3,1, 13-FIND(" ",MID($A3,12,1)&MID($A3,11,1)&MID($A3,10,1)

&MID($A3,9,1)&MID($A3,8,1)&MID($A3,7,1)&MID($A3,6,1)

&MID($A3,5,1)&MID($A3,4,1)&MID($A3,3,1)&MID($A3,2,1))))

,RIGHT($A3,LEN($A3)))

覚えておいてください。これはすべて単一の式であり、最初のチャンクを取得するためだけのものです。 2番目、3番目、4番目、およびそれ以降のチャンクを取得する式はさらに長くなります。明らかに、数式を使用することは最善のアプローチではないかもしれません。

これにより、マクロを使用したままになります。マクロはテキスト文字列を調べて、必要な長さに簡単に切り刻むことができます。次のユーザー定義関数について考えてみます。

Function SplitMe(sSentence As String, iPos As Integer, Optional iLen = 12)

Dim sSegments() As String     Dim iSegments As Integer     Dim sRest As String     Dim sTemp As String     Dim iSpace As Integer     Dim J As Integer

iSegments = 0     sRest = sSentence     sTemp = Left(sRest, iLen + 1)

Do Until Len(sTemp) <= iLen         iSpace = 0         For J = Len(sTemp) To 1 Step -1             If Mid(sTemp, J, 1) = " " And iSpace = 0 Then iSpace = J         Next J         If iSpace > 0 Then             sTemp = Left(sRest, iSpace - 1)

sRest = Mid(sRest, iSpace + 1)

Else             sRest = Mid(sRest, Len(sTemp) + 1)

End If         iSegments = iSegments + 1         ReDim Preserve sSegments(1 To iSegments)

sSegments(iSegments) = sTemp         sTemp = Left(sRest, iLen + 1)

Loop     iSegments = iSegments + 1     ReDim Preserve sSegments(1 To iSegments)

sSegments(iSegments) = sTemp     If iPos <= iSegments Then         SplitMe = sSegments(iPos)

Else         SplitMe = ""

End If End Function

この関数は、2つまたは3つのパラメーターを取ります。最初のパラメーターは分割する文字列、2番目のパラメーターは文字列から必要なチャンク、3番目の(およびオプションの)パラメーターは各チャンクの目的の長さです。 3番目のパラメーターを省略した場合、関数は、各チャンクを最大12文字にする必要があると想定します。例として、テキストがセルA5にあると仮定すると、以下は、各チャンクの長さが最大12文字のテキストから2番目のチャンクを返します。

=SplitMe(A5,2)

この関数は、テキスト文字列内の各単語が各チャンクに指定されたターゲット長を超えない限り、良好な結果を返します。そうである場合は、完全な単語を含まないチャンクなど、奇妙な結果が得られます。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(3899)は、Microsoft Excel 97、2000、2002、および2003に適用されます。