Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7998 / 13644 ツリー ←次へ | 前へ→

【35601】MATCH関数について ぷうたろう 06/3/8(水) 13:39 質問[未読]
【35612】Re:MATCH関数について Kein 06/3/8(水) 15:20 回答[未読]
【35620】Re:MATCH関数について ぷうたろう 06/3/8(水) 16:49 質問[未読]
【35625】Re:MATCH関数について ぷうたろう 06/3/8(水) 18:12 質問[未読]
【35626】Re:MATCH関数について Kein 06/3/8(水) 18:38 回答[未読]
【35631】Re:MATCH関数について ぷうたろう 06/3/8(水) 19:47 お礼[未読]

【35601】MATCH関数について
質問  ぷうたろう  - 06/3/8(水) 13:39 -

引用なし
パスワード
   こんにちは、関数についてなんですけど質問させてください。
下記のような表があります。
  A    B  C  
1      150 335 (150より小さいならB列,335より小さいならC列)    
2  52.0  15  31  (52.0より小さいならここ)
3  65.5  14  30  (52.0より大きく65.5より小さいならここ)
4  79.0  13  29  (65.5より大きく79.0より小さいならここ)
5  92.5  12  28  (79.0より大きく92.5より小さいならここ)
6  106.0  11  27  (92.5より大きく106.0より小さいならここ) 
7  119.5  10  26  (106.0より大きく119.5より小さいならここ)
8  133.0  09  25  (119.5より大きく133.0より小さいならここ)
9  146.5  08  24  (133.0より大きく146.5より小さいならここ)
10 160.0  07  23  (146.5より大きく160.0より小さいならここ)

MATCH関数とINDEX関数を使って、
たとえば列検索値が「70」で行検索値が「147」なら
70は150より小さいのでB列
147は146.5より大きく160.0より小さいので10行目になり
INDEX関数を使って結果「07」と出したいのですが、
行の検索の数式を「=MATCH(A15,B1:C1,-1)」と入れてみたのですが
(A15には70を入れています)
照合の方法を-1にしても0にしても1にしても全部「#N/A」になってしまいます。
**より大きく**より小さいものというように検索するには
どうしたらよいのでしょうか?よろしくお願いします。

【35612】Re:MATCH関数について
回答  Kein  - 06/3/8(水) 15:20 -

引用なし
パスワード
   >照合の方法を-1にしても0にしても1にしても全部「#N/A」になってしまいます。
まず、検索値は A列・1行目 のどちらでもないセルに入れるか、InputBoxなどの
フォームへ入力するようにした方が良いでしょう。あと、検索の型はヘルプを
よく読むと分かりますが、1行目の並び方が昇順なら 1 を指定しなくてはならず、
その場合 B1 が 150 で最小なのに 70 を検索しようとすると"「検索値以下」の
最大値" という条件から外れてしまうのでエラーが返るのだと思われます。
よってそのような場合には、最小値 150 を検索値としたと仮定し、列番号 2 と
指定するようなコードを作ってみました。試してみて下さい。

Sub MyMatch()
  Dim SR As Single, SC As Single
  Dim x As Long, y As Long
 
  With Application
   SR = .InputBox("A列で検索する数値を入力して下さい", Type:=1)
   If SR = False Then Exit Sub
   SC = .InputBox("1行目で検索する数値を入力して下さい", Type:=1)
   If SC = False Then Exit Sub
   If SR < Range("A2").Value Then
     x = 2
   Else
     x = .Match(SR, Range("A:A"), 1)
   End If
   If SC < Range("B1").Value Then
     y = 2
   Else
     y = .Match(SC, Range("1:1"), 1)
   End If
  End With
  MsgBox Cells(x, y).Value
End Sub

【35620】Re:MATCH関数について
質問  ぷうたろう  - 06/3/8(水) 16:49 -

引用なし
パスワード
   Keinさん
ご回答くださり、ありがとうございます。
マクロを実行してみたところ、欲しい数値がちゃんとでました。
ただ、検索値がほかにもたくさんありどうしても関数でやりたいのです。

先ほど記述した表は数値割り当て表で、シート「座標」に入っています。
同じブック内のシート1に下記のような表があります。

    A     B      C       D       E      F  
1   名称   列位置   行位置   列番号   行番号   割り当て数値
2   A***   315    137.5
3   B***   125    205
4   C***   65     236.5
5   D***   75     115
6   E***   50     142
7   F***   240    209.5
8   G***   110    142
9   H***   75     169
10  I***   50     88
.
.
.

D列にMATCH関数を使ってB列を検索値にして
シート「座標」を検索し、1列目なのか2列目なのか
E列にMATCH関数を使ってC列を検索値にして
シート「座標」を検索し、何行目にあるのか
F列にINDEX関数を使ってどの数値が割り当てられるのか
を出したいのです。

最初のMATCH関数の記述でつまづいてしまって困っています。
すみませんが何かよい方法はないでしょうか?

【35625】Re:MATCH関数について
質問  ぷうたろう  - 06/3/8(水) 18:12 -

引用なし
パスワード
   よく考えたら、列番号は150より小さいか大きいかしかないので
IF関数で2列目か3列目かを返してやれば出来ますね。

難しいのは行のマッチングです...なにとぞよろしくお願いします。

【35626】Re:MATCH関数について
回答  Kein  - 06/3/8(水) 18:38 -

引用なし
パスワード
   D2 に入れる数式↓

=IF($B2<=座標!$B$1,2,3)

E2 に入れる数式↓

=IF(ISNA(MATCH($C2,座標!$A:$A,1)),2,MATCH($C2,座標!$A:$A,1))

F2 に入れる数式↓

=INDEX(座標!$A$1:$C$10,$E2,$D2)

で、D2:F2 を選択してフィルコピーで D10:F10 まで入力。
こちらでテストしたかぎりでは、うまくいきましたが。

【35631】Re:MATCH関数について
お礼  ぷうたろう  - 06/3/8(水) 19:47 -

引用なし
パスワード
   Keinさんへ
思ってた通りに出来ました、嬉しいです♪
ありがとうございました!(激感謝です)

7998 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free