• ベストアンサー

=MATCH("*?",A1:A10&"",0)

ずばり!タイトルの関数の内容を教えてください。 A1:A10の1列の表があります A1~A3はブランクで、A4に数字が入った場合 「4」が表示されます A1~A10の間で、どこに数字が入力されたかを表示する関数のようです。 『"*?"』この部分と、『A1:A10&""』この部分が、どうしてもわかりません 前に教えてgooで教えてもらった関数なのです どうか、教えてください。よろしくお願いします。 ちなみに、そのときの質問です↓ http://oshiete1.goo.ne.jp/kotaeru.php3?q=720308

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 張本人なので説明します。 まず、この数式は配列数式です。 配列数式については、以下のページを熟読して下さい。 http://pc21.nikkeibp.co.jp/pc21/pc_10/hr_top.htm で、MATCH関数の第2引数「A1:A10&""」は、 {A1&""、A2&""、A3&""・・・A10&""} という各セルの値の末尾に「""」を付けた範囲を表しています。 そして、末尾に「""」を付けることで、データを文字列に変換しているのです。 次にMATCH関数の第1引数の「"*?"」ですが、「*」と「?」はワイルドカードというです。 ワイルドカードは、文字列を検索する時の不特定の値を検索するための文字です。 「*」は任意の文字列です。 つまり、検索範囲に何か文字列が入っていれば、ヒットします。 この場合は、「""」も長さ0の文字列と判断してヒットします。 試しに質問欄の数式から"?"を除いてみて下さい。 範囲内のどこに何を入力しても、「1」になるはずです。 これは範囲の先頭の「A1&""」の「""」がヒットしてしまうからです。 これを回避するために、「?」も付けています。 「?」は、任意の文字1文字です。 検索範囲に何か文字が1文字だけ入っているとヒットします。 そうすると、両方合わせた「*?」は、 「任意の文字列」+「任意の1文字」 を検索します。 つまり、文字が1文字でも入っていればヒットするわけです。 「""」は1文字とは見なされないので、「""」だけではヒットせず、 例えば「A1&""」なら、A1に何か1文字以上の文字列が入力されていないと、ヒットしません。 もう一度戻ると、ワイルドカードによる検索は、文字列しか出来ません。 したがって、MATCH関数の第2引数の検索範囲に「""」を付けて文字列に変換しているわけです。 それから、MATCH関数の第3引数に「0」を指定しているので、第2引数の範囲を先頭から検索して、初めてヒットした位置を返します。 ちなみに、A1:A10に1つもデータが入力されていなければ、「#N/A」のエラーになります。 以上で、分かりましたでしょうか?

参考URL:
http://pc21.nikkeibp.co.jp/pc21/pc_10/hr_top.htm
kurulin
質問者

お礼

こんにちわ!いつもすばやく的確な回答をありがとうございます! 未熟者なもので、すぐに「あぁ!なるほど!」とまでは行きませんが、理解のとっかかりが出来ました。 これからもう一度、作った表とこの説明を見比べながら勉強します(^-^) 参考URLも、ありがとうございました!お気に入りに入れてよく調べてみます!! また何かあったら、よろしくお願いします。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

ある列に「1桁の数字」が「初出する行」(番号)を出すやり方を配列数式を使わず考えてみました。何か似ていませんでしょうか。両者比べてみてください。 もしB列に、下記のC列に当たるところに、=IF(B1="",0,1)と入れて、下へ複写すれば良いと思います。 (データ) B列B1:B10に (B) 2 3 (B) as as df g 4 12 (B)は空白(DELキー押し状態) 余分な列1れつC列使い、C1に =COUNTIF($B$1:B1,"<"&"10")()内後半は"<10"でも可。 下へC1をC2からC10へ複写。C1:C10は 0 1 2 2 2 2 2 2 3 3となります。 初出行を出したいセルに =MATCH(1,C1:C10,0)と入れます。この場合2です。 B列の内容をいろいろ変えて試してみてください。 配列数式を使う方法は余分な列を使わない点で、すっきりします。

kurulin
質問者

お礼

アドバイスありがとうございました! 今回、タイトルの関数を使ったのは、1行でなく30行くらいの表だったので、1行ごとにimogasiさんの教えてくれた方法を取る事ができませんですが、他の機会に流用させていただきます!どうもありがとうございました。

関連するQ&A