Pieterの列Aには、テキストを含むセルがたくさんあります。具体的には、セルにはそれぞれ数文のテキストが含まれています。彼は文を個々のセルに分割したいと考えています。彼は、Text to Columnsツールを使用できることを知っていますが、文が異なる句読点で終わる可能性があり、一部の句読点が文の途中で使用される可能性があるため、完全に役立つわけではありません。 (Mr.やMs.のようなタイトルの後のピリオドなど)Pieterは、文を異なるセルに分割するためのより良い方法があるかどうか疑問に思います。

このタスクを手動で実行するには、いくつかの方法があります。

まず、ヘルパー列を使用してデータを操作できます。たとえば、この数式をセルB1に入れることができます:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"Mr.", "Mr#"), "Mrs.", "Mrs#"), "Ms.", "Ms#")

次に、必要なセルの数だけ数式をコピーします。最終的には、共通のタイトル(Mr.、Mrs。、およびMs.)が一意の文字シーケンス(Mr#、Mrs。、およびMs#)に置き換えられます。列Bの結果を値として列Bにコピーして戻し(数式が削除されるように)、列Bの[テキストから列へ]を使用します。最後に、[検索と置換]を使用して、#文字のすべてのインスタンスをピリオドに変更します。

これの欠点は、数式が期間の3つの一般的な使用法しか考慮していないことです。この場合、実際にはさらに多くの使用法を処理する必要があります。たとえば、文にDr.などのタイトルやPh.Dなどの資格情報が含まれている場合があります。またはEsq。このような期間のある略語のリストは、かなり長くなる可能性があります。そのような場合、次の方法で手動で変更を加えることができます:

。検索と置換を使用して、テキスト内のすべてのピリオドを検索し、文の終わりではないピリオドをマーカー文字(上記の手法では#)に置き換えます。

。テキストから列へのツールを使用して、文を分割します。

。検索と置換を使用して、マーカー文字のすべてのインスタンスをピリオドに戻します。

繰り返しになりますが、文が終了しない期間がたくさんある場合、このプロセスが完了するまでにかなりの時間がかかる可能性があります。

もちろん、これらのアプローチは実際には複雑なトピックを扱います。

本当の問題は、どのように文を定義するかです。英語では、文を終了する句読点は、ピリオド、感嘆符、疑問符の3つだけです。ただし、これにはバリエーションと例外があります。たとえば、文が引用符で終わる場合がありますが、その引用符の前には常に3つの句読点のいずれかがあります。さらに、すでに述べたように、ピリオドを使用して略語をマークすることもできます。

検索と置換を使用してこれらの句読点と例外をすべて処理し始めると、複雑な一連の手順にすぐに遭遇する可能性があります。マクロを使用して分割を実行することをお勧めします。ほとんどの文と略語を適切に処理するものは次のとおりです。

Sub SplitSentences()

Dim c As Range     Dim sException(8) As String     Dim sReplacement(8) As String     Dim sTerm(6) As String     Dim sTemp As String     Dim J As Integer     Dim sExp As Variant

' These are the valid ways for a sentence to end     sTerm(1) = ". "

sTerm(2) = "! "

sTerm(3) = "? "

sTerm(4) = "." & Chr(34)

sTerm(5) = "!" & Chr(34)

sTerm(6) = "?" & Chr(34)



' These are the exceptions to the rule     ' of a period ending a sentence     sException(1) = "Mr."

sException(2) = "Mrs."

sException(3) = "Ms."

sException(4) = "Dr."

sException(5) = "Esq."

sException(6) = "Ph.D."

sException(7) = "a.m."

sException(8) = "p.m."



' Set up the replacements for the exceptions     For J = 1 To 8         sReplacement(J) = Replace(sException(J), ".", "[{}]")

Next J

For Each c In Selection         sTemp = c.Value

' Convert all the exceptions         For J = 1 To 8             sTemp = Replace(sTemp, sException(J), sReplacement(J))

Next J

' Demarcate sentences with a tab         For J = 1 To 6             sTemp = Replace(sTemp, sTerm(J), Trim(sTerm(J)) & Chr(9))

Next J

' Split sentences into an array         sExp = Split(sTemp, Chr(9))

For J = 0 To UBound(sExp)

' Replace the code for valid periods             sExp(J) = Replace(sExp(J), "[{}]", ".")

' Place sentences into adjacent cells on row             c.Offset(0, J).Value = Trim(sExp(J))

Next J     Next c End Sub

許容される文の終了はsTerm配列に示され、許容される略語はsException配列にあることに注意してください。テキストに他の略語が含まれている可能性がある場合は、sException配列を展開してそれらを含めることをお勧めします。

マクロは、選択したセルをステップスルーし、受け入れ可能なすべての例外を置き換えます。次に、受け入れ可能なすべての文の終了を、その終了の後にタブ文字が続くものに置き換えます。

次に、タブ文字の位置に基づいて文を分解します。最後に、略語にあったすべての有効な期間を復元し、同じ行の隣接するセルに文を配置します。

マクロは選択されたセルにあったものをすべて置き換えますが、文を保存するために選択の右側に多くのセルが必要であることに注意してください。このため、セルの範囲を選択してマクロを実行する前に、元のワークシートを必ず保存しておくことをお勧めします。

最後に、マクロが完全ではないことに注意してください。文を終わらせるための略語の文法学者の観点からは完全に受け入れられます。これが発生すると、適切な句読点により、次の2つの短い文のように、省略形の最後のピリオドが文の終了ピリオドとしても機能するようになります。

Sheila earned her Ph.D. She was very happy.

ここで、次の1つの文について考えてみます。

Sheila earned her Ph.D. from an Ivy League school.

2つの例(2つの文と1つの文)を比較すると、プログラムで博士号を取得するかどうかを識別する方法はありません。次の単語が大文字で始まるか、引用符で始まり、大文字が続くかを確認せずに、文を終了するか、文の途中で発生するかどうか。これは非常にすぐに複雑になる可能性があります。さらに、これは博士号だけでなく、すべての略語に適用されます。上記のマクロは、そのようなすべての発生を予測して処理しようとするのではなく、略語が文を終了するかどうかを識別しようとさえしません。単に、すべての略語を文の途中で発生するかのように扱います。

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

このヒント(12549)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice365のExcelに適用されます。