各セルの文字列から左カッコ以後を削除するには?

Question 74.4   Previous Next
はじめまして、全くの初心者です。 Excel VBAマクロを教えてください。
各セル内が "内容(数字)" というフォーマットの文字列において、"("以降の文字列を全て削除して "内容" の部分だけを残すようなマクロを教えてください。 どうぞ宜しくお願い致します。
例:
  各セル   マクロ実行後
  佐藤(32) ⇒ 佐藤
  山田(52) ⇒ 山田
  山下(36) ⇒ 山下
Answer   Copyright (C) 2005.7.14 永井善王
色々な方法が考えられますが、全くの初心者さんということですので、次の手順で考えてみましょう。
 1. セルの文字列の何文字目に "(" があるかを調べ、
 2. それより左の部分を取り出して、
 3. 別のセルにセットする。
まず、右図のように A2セルの文字列を処理して、結果をB2セルにセットするコードを作成します。

1.
位置 = Application.WorksheetFunction.Search("(", Range("A2"), 1)
  (4) (5) (1)    (2)         (3)  (   下記参照  )
  (1) Excelの
  (2) ワークシート関数の
  (3) Search関数で指定した文字列が最初に現れる位置(文字番号)を取得し
  (4) 変数「位置」に
  (5) 代入する
--- Search関数(ワークシート関数) ---
この関数は、指定された文字列をほかの文字列の中で検索し、その文字列が最初に現れる位置の文字番号を返してくれます。検索は指定された開始位置から始まります。
書式 SEARCH(検索文字列,対象,開始位置)
検索文字列: 検索する文字列を指定する     ・・・この例では "("
対象:     検索文字列を含む文字列を指定する・・・この例では A2セルの文字列
開始位置:  検索を開始する位置を指定する   ・・・この例では1文字目

2.
姓 = Left(Range("A2").Value, 位置 - 1)
  (2)(3) (1) (a)           (b)
(1) 次の括弧内の指定による文字列の左端から指定された文字数分を取得し
 (a) 文字列…A2セルの値
 (b) 文字数…変数「位置」に格納された値より1少ない値
(2) 変数「姓」に
(3) 代入する
--- Left関数(VBA関数) ---
文字列の左端から指定した文字数分の文字列を返してくれます。
構文 Left(string, length)
string: 文字列を指定する・・・Range("A2").Value "("
length: 文字数を指定する・・・この例では 位置 - 1

3.
Range("B2").Value = 姓
  (2)        (3) (1)
(1) 変数「姓」に格納されている値を
(2) B2セルの値として
(3) 代入する

次に、ここまでで作成した3行のコードは、A2セルとB2セルの処理に固定されていますので、2行目から4行目を繰り返し処理できるよう、次のコードのように改良します。
    For 行 = 2 To 4
        位置 = Application.WorksheetFunction.Search("(", Range("A" & 行), 1)
        姓 = Left(Range("A" & 行).Value, 位置 - 1)
        Range("B" & 行).Value = 姓
    Next
For...Nextステートメント
指定した回数だけ一連のステートメントを繰り返してくれます。フロー制御ステートメントの一種です。
構文 For counter = start To end [Step step]
      [statements]
    [Exit For]
      [statements]
    Next [counter]
counter :  カウンタに使う数値変数を指定する・・・この例では 行
start :    counter の初期値を指定する   ・・・この例では 2
end :     counter の最終値を指定する   ・・・この例では 4
statements : 繰り返し処理する一連のステートメント

さらに、A列のデータの下端の行番号を取得するコードを追加します。
  下端行 = Range("A65536").End(xlUp).Row
  (5)  (6) (1)       (3) (2)  (4)
(1) A65536セルから
(2) 上方向に移動して
(3) 領域の終端セルを取得し
(4) 行番号を
(5) 変数「下端行」に
(6) 代入する

それを For...Nextステートメントのcounter の最終値とするように改造します。
すると、仕上がったマクロが下記のようになります。
Sub 各セルの文字列から左カッコ以後を削除する()
    下端行 = Range("A65536").End(xlUp).Row       'データの下端行を取得
    For 行 = 2 To 下端行
        位置 = Application.WorksheetFunction.Search("(", Range("A" & 行), 1)
        姓 = Left(Range("A" & 行).Value, 位置 - 1)
        Range("B" & 行).Value = 姓
    Next
End Sub
なお、ここで作成したマクロは、動きを分かりやすくするために、左カッコ以後を削除した文字列をB列のセルにセットしています。 ご質問の主旨に沿うには、 Range("A" & 行).Value = 姓 に修正することになると思います。

以上の説明でも理解できない部分があるかと思いますが、VBAとExcelのヘルプを活用したり、このホームページ内のContentsページから関連ページを見つけて参考にしたりして、順に覚えて行かれるとよいかと思います。がんばってください。

Excel VBA Macro