Manikのワークシートには、列Aに、「mikeDAVIS」形式のテキスト値があります。この場合、人の名は小文字で、姓は大文字です。彼は、テキストの場合に応じて、名前を2つの別々の列に分割したいと考えています。

これは、マクロの式を使用して実行できます。使用するアプローチに関係なく、重要なのは、テキストが小文字から大文字に切り替わる場所を特定することです。これは、文字列内の各文字を調べることによってのみ実行できます。したがって、数式によるアプローチを使用する場合は、配列数式を使用する必要があります。次の配列数式は、セルA1にあるものの姓を返します。

=MID(A1,MATCH(1,(CODE(MID(A1,ROW($1:$255),1))>=65)

* (CODE(MID(A1,ROW($2:$255),1))<90),)+1,255)

これは配列数式であるため、Ctrl + Shift + Enterを押して入力する必要があることに注意してください。見つかった最初の大文字から始まるセル内のすべてを返します。したがって、「mikeDAVIS」では「DAVIS」を返し、「mikeDavis」では「Davis」を返します。セルB1で配列数式を使用すると仮定すると、次を使用して名を決定できます。

=SUBSTITUTE(A1,B1,"")

これは通常の数式であり、配列数式ではありません。

ほぼ同じタスクを実行できる同様の配列数式が多数あります。たとえば、この配列数式は、セルA1にあるものすべての名(最初の大文字までのすべての文字)を返します。

=LEFT(A1,MAX((CODE(MID(A$1,ROW(INDIRECT("1:"& LEN(A1))),1))>96)*ROW(INDIRECT("1:"&LEN(A1)))))

次に、同じ通常の式(SUBSTITUTE関数を使用する式)を使用して姓を導出できます。

マクロアプローチを使用して名前を検索する場合は、テキストの最初の大文字の場所を返す数式を作成するだけです。次のコードは、この「変化点」をテキストで返します。

Function GetFirstUpper(MyCell As Range) As Integer     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetFirstUpper = 99     Else         GetFirstUpper = i     End If End Function

この関数を使用するために、名前がセルA1にあると仮定します。ワークシートで次の数式を使用して姓名を見つけることができます:

=LEFT(A1,GetFirstUpper(A1)-1)

=MID(A1,GetFirstUpper(A1),LEN(TRIM(A1))-GetFirstUpper(A1)+1)

マクロで実際の名前を返す場合は、次のマクロを使用して、最初の大文字の前のすべてを返すことができます。

Function GetFirstName(MyCell As Range) As String     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetFirstName = sCellValue     Else         GetFirstName = Left(sCellValue, i - 1)

End If End Function

マクロを使用するには、ワークシートのセルで以下を使用するだけです。 (これは、評価されるテキスト文字列がセルA1にあることを前提としています。)

=GetFirstName(A1)

マクロのマイナーなバリエーションにより、姓を同様にフェッチできます。姓は、最初に検出された大文字で始まるすべてのものであると見なされます。

Function GetLastName(MyCell As Range) As String     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetLastName = sCellValue     Else         GetLastName = Mid(sCellValue, i)

End If End Function

必要に応じて、マクロを1つの関数に組み合わせて、指定した内容に基づいて、姓または名を返すことができます。

Function GetName(MyCell As Range, sWanted As String) As String     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetName = sCellValue     Else         If LCase(sWanted) = "first" Then             GetName = Left(sCellValue, i - 1)

Else             GetName = Mid(sCellValue, i)

End If     End If End Function

この複合関数を使用するには、必要な名前を指定するだけです。

=GetName(A1, "First")

この方法でパラメーターとして渡された「First」という単語は、名(最初の大文字の前のすべて)を返します。 2番目のパラメーターとして渡されたその他の文字列(「Last」、「xxx」、「Rest」、さらには「」など)では、姓が返されます。

注:

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

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

このヒント(9089)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。