- ベストアンサー
統一性のない書き方の適用の項目からある名前を抜き取って表示したい
A1セルでB1セルに、 下の左の名前から右の名前にして抜き取りたいです。 左は適用の項目です。 右はそこから抜き取りたいと思っている、項目名です。 適用は、名前は入っているけど、書き方に統一性がありません。 A1セル B1セル 「1月分給料 田中真一」 は 「真一」 「田中真一 仮払い」 は 「真一」 「1月分給料 鈴木孝明」 は 「孝明」 「鈴木孝明 賞与」 は 「孝明」 「1月分給料 山田晶子」 は 「晶子」 「山田晶子 仮払い」 は 「晶子」 「1月分保険料 西田一郎」 は 「一郎」 「西田一郎 貸付金」 は 「一郎」 それ以外は、 「その他」 みたいにして、表示したいです。 どうしたらいいのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
質問の例では名前を抜き出すのは「真一」「孝明」「晶子」「一郎」の4名で、それ以外は「その他」とするとなっています。 抜き出す対象が数個なら、 =IF(ISNUMBER(FIND("真一",A1)),"真一",IF(ISNUMBER(FIND("孝明",A1)),"孝明",IF(ISNUMBER(FIND("晶子",A1)),"晶子",IF(ISNUMBER(FIND("一郎",A1)),"一郎","その他")))) で抜き出すこと(合致するものがあるかの判定)が可能です。 もう少し個数が多い場合はIF関数の繰り返しではできませんが、「名前」のリストを作成しておくことで、同様に可能です。 でもそのリストすら作るのが困難なくらい名前の数が多いなら、#01さん、#02さんの言われるように難しいと思います。
その他の回答 (5)
- maron--5
- ベストアンサー率36% (321/877)
◆作成途中で誤って回答してしまいました ◆改めまして A B C D 1 1月分給料 田中真一 真一 真一 2 田中真一 仮払い 真一 孝明 3 1月分給料 鈴木孝明 孝明 晶子 4 鈴木孝明 賞与 孝明 一郎 5 1月分給料 山田秋子 その他 6 山田晶子 仮払い 晶子 7 1月分保険料 西田一郎 一郎 8 西田一郎 貸付金 一郎 ★D列に該当する名前をあらかじめ入力しておきます ★名前抽出の式:B1 B1=IF(A1="","",IF(SUMPRODUCT(COUNTIF(A1,"*"&$D$1:$D$4&"*")),LOOKUP(1,0/FIND($D$1:$D$4,A1),$D$1:$D$4),"その他")) ★下にコピー
お礼
ありがとうございます。 それで、すみません、 (COUNTIF(A1,"*"&$D$1:$D$4&"*")),の *には、何を入れればいいのでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 ワークシートの関数でもできると思いますが、その場合は、一旦、メニューのデータの「区切り位置」で、空白で切り分けして、A列,B列に分けます。 E1: =SUMPRODUCT(COUNTIF(A1,"*"&{"給料","払い","貸付金","賞与","保険"}&"*")) F1: =SUMPRODUCT(COUNTIF(B1,"*"&{"給料","払い","貸付金","賞与","保険"}&"*")) G1: =IF(E1=0,RIGHT(A1,2),IF(F1=0,RIGHT(B1,2),"その他")) として、フィルをドラッグしてコピーすれば出来上がります。 {"給料","払い","貸付金","賞与","保険"} のリストは、名前ではないと感知できるレベルの単語を並べてください。 そういう作業が面倒ならば、以下のような「ユーザー定義関数」が考えられます。 以下のリストも、ご自身で、名前ではないと感知できるレベルの単語を入れてください。 すべてでなくてよいです。 標準モジュールへの取り付け方: Alt + F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。 次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、以下のコードを貼り付けて、 Alt + Q で、画面を閉じます。 後は、 =PickupName(A1,2) のように入れてあげれば、名前が出てきます。引数の2は、2文字ということです。 '----------------------------------------------------------------- 'Option Explicit 'ユーザー設定 Private Const LIST As String = "給料|払い|貸付金|賞与|保険" Function PickupName(rng As Range, num As Integer) Dim strText As String Dim buf As String Dim Matches As Object 'Matches If IsEmpty(rng.Value) Then PickupName = "": Exit Function strText = Replace$(Trim$(rng.Value), " ", " ", , , vbTextCompare) With CreateObject("VBScript.RegExp") .Pattern = "[^ ]*(" & LIST & ")[^ ]*" .Global = False If .Test(strText) = False Then PickupName = "その他": Exit Function Set Matches = .Execute(strText) buf = Matches(0) buf = Replace$(strText, buf, "") End With If Len(buf) > 0 Then PickupName = Right$(Trim$(buf), num) Else PickupName = "" End If End Function
- maron--5
- ベストアンサー率36% (321/877)
A B C D 1 1月分給料 田中真一 真一 真一 2 田中真一 仮払い 真一 孝明 3 1月分給料 鈴木孝明 孝明 晶子 4 鈴木孝明 賞与 孝明 一郎 5 1月分給料 山田秋子 その他 6 山田晶子 仮払い 晶子 7 1月分保険料 西田一郎 一郎 8 西田一郎 貸付金 一郎
「書き方に統一性」がないのなら無理かと。 「左の名前から右の名前」ですって?何処までが「左」で、何処からが「右」かはどうやって判断させるのですか? 例:「東海林太郎」は「東海 林太郎」か「東海林 太郎」か?
- merlionXX
- ベストアンサー率48% (1930/4007)
人間が手でやるのなら、人名から名前の部分だけ抜き出すのはたやすいでしょう。しかし、コンピュータにそれを求めてもなんらかの規則性がなければまだ無理です。 呈示された例だけであれば、スペースで別れた二つの文字列集団のうち4文字であるほうの後ろから2文字を抜き出すということなら数式で可能です。でもそれじゃ意味無いんですよね?
補足
文字列集団の書き方に規則性が無いので、後ろから2文字を抜き出すということは、意味が無いです。
お礼
このやり方で解決しました。 どうも、ありがとうございました。