エクセルの関数についてです。セルに1から15までの数字が「1,3,15」、「2,3」、「1,5,10」のように個数も数字もランダムにカンマに区切られて並んでいる列があります。特定のセルに、10が含まれている場合は1を、含まれていない場合は0を返すような関数を組むことは可能でしょうか。その際に、1~5については、10~15がセルに含まれている時に1~5が含まれていると解釈しないような関数を求めています。(もちろん、1と15両方ともセルに含まれている場合は、1で組んでも15で組んでも、含まれていると認識される必要があります。)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/04/18 22:22:17
  • 終了:2006/04/25 22:25:02

回答(6件)

id:alfa156ts No.1

alfa156ts回答回数53ベストアンサー獲得回数02006/04/18 22:57:21

ポイント27pt

A列にその数列がある場合、B列に下記のように記載します。

【例(B1)】=IF(FIND("10",A1),1,0)

ただし、見つからない場合にはエラーが出るので、Cの列にでもERROR.TYPE()を使って上手く0を表示してあげてください。

後半の問いは意味がわかりませんでした。

http://www.yahoo.co.jp

id:owl No.2

owl回答回数165ベストアンサー獲得回数152006/04/18 23:48:28

ポイント27pt

文意を読み解くのに少々手間取ってしまいました。

=IF(ISERR(FIND($B$1,A3)),0,IF(NOT(ISERR(VALUE(MID(A3&";",FIND($B$1,A3),LEN($B$1)+1)))),0,IF(NOT(ISERR(VALUE(MID(";"&A3,FIND($B$1,A3),LEN($B$1)+1)))),0,1)))

これでいかがでしょうか。

$B$1セルに、検索したい数値を入れておきます。

A3セルに、検索対象の文字列(「1,3,15」など)を入れておきます。

大まかに解説します。仮に「15」を探すとします。

最初の IF() 関数で、文字列の中に「15」があるか探します。FIND() 関数を使用します。無ければ、0 を返します。

ここではまだ「15」という文字列があるか無いか調べただけですので、それが「15」なのか「215」なのか「1500」なのかわかりません。

そこで、次に、FIND() 関数で引っ掛かった文字列に 1文字足して、それが数値として成り立つかどうか調べます。これには VALUE() 関数を使用します。

1文字後ろに足したとき「15,」になれば、VALUE() 関数ではエラーになります。この場合、数字が「150」などではないことがわかります。

同様に、頭に 1文字足して、その数字が「315」などでないことを調べます。

 

以上からお判りのとおり、この関数にも穴があります。

  • 対象文字列にスペースが入っていると結果が正しくならない。
  • 「015」は 15 として判定してくれない。
  • 数字の順番はソートされている必要がある。つまり、「30,3」となという文字列からこの関数で「3」を探した場合、0 を返す。
    →必要な回数だけ関数を入れ子にすれば一応解決する。
  • 検索対象が「いくつ入っているか」までは調べられない。

 

他にもいい方法があるかもしれませんが、ワークシート関数で解くならば、こんな感じだと思います。

 

http://www010.upp.so-net.ne.jp/catwalk/lib/Answer1145366534....(約16KB)

Excel97 にて作成。ウィルスセキュリティ 最新パターンでチェック済みです。

id:owl No.3

owl回答回数165ベストアンサー獲得回数152006/04/19 05:09:54

ポイント26pt

大変申し訳ありません。先程の回答では質問の読み落としがありましたので、訂正かたがた追記させていただきます。先程の計算式では、「ランダムに」という条件をクリアしていません。また、小数が含まれていた場合には対応できませんでした。

そこで、1つの計算式にまとめるということにこだわらない方向で、もう 1案作成し、別シートにして再アップロード致しました。シート名「Answer1145366534 (2)」のほうです。

http://www010.upp.so-net.ne.jp/catwalk/lib/Answer1145366534....(約40KB)

(ウィルスチェック済み)※先程と同じファイル名での再UPです

数字を一旦セル毎に切り出し、判定しています。作例ではカンマで区切られた数字が 8個までという上限を置いています。

この切り出しにかなり煩雑な手順を要していますので、可能であれば Excelへデータを読み込む際に「カンマ区切りテキスト」として読み込めば、(HLOOKUP() の式だけでできるので)手間は相当省けるのではないかと思います。

 

拡張性を考慮したため少々面倒なことになってしまっています。数字の種類が15個しかないということでいいのなら IF() 関数の入れ子という力業で書き下せばいいかもしれません。

 

あとは頑張ってみてください。

id:bonlife No.4

回答回数421ベストアンサー獲得回数752006/04/19 13:05:06

ポイント10pt

通常の関数ではちょっと無理があると思います。

マクロを使ったユーザ定義関数でよければ比較的スマートにご要望の機能を実現できそうです。

まず、EXCELのVBAで正規表現を使えるようにライブラリ参照の設定を行います。

以下のURLを参考にしてください。

VBAのマクロではユーザ定義関数というものを作成できます。

下記のようなマクロを作成します。

マクロの作成は以下のような手順で行います。

EXCELの[ツール(T)]-[マクロ(M)]-[Visual Basic Editor(V) Alt+F11]でMicrosoft Visual Basicの画面を開きます。

[挿入(I)]-[標準モジュール(M)]とし、標準モジュールの編集画面を開きます。

そこに以下の内容を貼り付けます。

Function numCheck(target As String, checkNum As Integer)
'
' numCheck
' カンマ区切りの数値データをチェックする独自関数
'
Dim re As New RegExp
'
' checkNumを含む正規表現のパターンを定義
'
re.Pattern = "(^|,)" & checkNum & "(,|$)"
'
' targetの値が正規表現にマッチする場合、1を返す
'
If re.test(target) = True Then
        numCheck = 1
Else
'
' targetの値が正規表現にマッチしない場合、0を返す
'
        numCheck = 0
End If
'
End Function

その後、保存してMicrosoft Visual Basicの画面は終了します。

これでユーザ定義関数の作成は完了です。

後は、EXCELのワークシート上で通常の関数と同様にユーザ定義関数を呼び出します。

使い方は以下の通りです。

=numCheck(対象となるセル,含まれているか確認する数字)

たとえば、A1というセルに"1,2,3,4,5"という値が入っている場合、

=numCheck(A1,3)

とするとそのセルには1がセットされます。

=numCheck(A1,6)

とするとそのセルには0がセットされます。

一度試してみてください。

参考になると幸いです。

id:Baku7770 No.5

Baku7770回答回数2832ベストアンサー獲得回数1812006/04/19 14:26:22

ポイント10pt

 6~15迄は#a1の通り、FIND関数で見つけられますが、1~5は簡単ではないですね。

 ケースを考えます、Xは求めたい値(1~5です)Aはセルの値とします。便宜上共に文字列とします。

 Aに数字が一つしか入っていない場合

A=Xなら1

 先頭にある場合

AがX&","で始まるなら1

 中間にある場合

Aの中に","&X&","があるなら1

 末尾にある場合

Aが","&Xで終わるなら1でそれ以外は0ですから

 セルA1にX、B1にAが入っているとして、

=IF(OR($A$1&","=LEFT(B1,LEN($A$1)+1),NOT(ISERR(FIND(","&$A$1&",",B1,1))),(","&$A$1=RIGHT(B1,LEN($A$1)+1)),$A$1=B1),1,0)

になります。

Excel(エクセル)基本講座:文字列の関数(1)

id:mestallajp No.6

mestallajp回答回数23ベストアンサー獲得回数62006/04/20 13:48:23

ポイント10pt

自作で関数を組んでしまうのが楽かと思います。サンプルを作成してみました。

Public Function kaeru(myNum As Integer, myStr As String) As String

'

' kaeru Macro

'

mySyr = Trim(myStr) '入力値から余分な空白を取る

myArray = Split(myStr, ",") '入力値を","で区切って配列をつくる

myAnswer = 0 'myAnswer(答え)に0を入れておく

For i = 0 To UBound(myArray) '配列を順番に開ける

If myArray(i) = myNum Then 'myNum(判定文字)が配列にあれば

myAnswer = 1 '答えに1を入れる

End If

Next

kaeru = myAnswer '関数kaeruに答えを返す

End Function

任意のセルに=kaeru(10,A5)というように括弧内に検索値と検索セルを指定します。

ココにサンプルファイルを置いておきます。マクロですので開くときに「ウイルスを含んでいる可能性があります」うんぬんいわれますが「有効」にして問題ありません。

  • メニューの[ツール]-[マクロ]-[Visual Basic Editor]に上記マクロを貼り付ける
  • サンプルファイルをベースにして自前のデータを貼り付ける
  • サンプルファイルを[アドイン]保存する(方法の参考に

のどれかで使用できると思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません