質問: application.match(range("c1") & range("d1"), range("a2:a13") & range("b2:b13"), 0) if iserror(row) then msgbox "該当データが見つかりません" else msgbox row & "番めのデータです" end if end sub
回答: こんにちは。 match関数は、vbaではよく使いますが、主に、1次元配列で使われるものですから、今回のようなものには不向きです。また、vbaでは、配列関数はほとんど使われません。なぜかというと不要だからです。macro3 をみてください。 この3つのマクロを比べてみてください。 ただし、該当するデータは複数入れてみるとよいです。 3 32 複数ある場合。 3 32 33 2 合わせると同じ文字になってしまう場合 本来は、これらを想定して作らなくてはならないはずです。 最後に、ユーザー定義関数(udf)を加えて置きましたが、これは、配列の出力がありますから、複数の場合は、index関数などが必要です。下手なマクロかもしれませんが、少しでも参考になればと思いました。 '--------------------- sub macro1() dim c as range dim a as variant dim b as variant dim adr as string a = range("c1").value b = range("d1").value for each c in range("a2", cells(rows.count, 1).end(xlup)) if c.value = a then if c.offset(, 1).value = b then adr = adr & "," & c.address(0, 0) end if end if next c if len(adr) > 1 then msgbox mid(adr, 2) else msgbox "該当のセルは見つかりません", vbexclamation end if end sub '------------------ sub macro2() dim rw as variant '=match(検査値,検査範囲,照合の種類) dim a as variant dim b as variant dim i as long dim ar1 as variant dim ar2 as variant ar1 = application.transpose(range("a2:a15").value) ar2 = application.transpose(range("b2:b15").value) a = range("c1").value b = range("d1").value for i = lbound(ar1) to ubound(ar1) ar1(i) = ar1(i) & "," & ar2(i) next i rw = application.match(a & "," & b, ar1, 0) if isnumeric(rw) then msgbox rw & "番めのデータです" else msgbox "該当データが見つかりません", vbexclamation end if end sub '--------------- sub macro3() dim i as variant i = evaluate("sum((a1:a15=c1)*(b1:b15=d1)*row(a1:a15))") if i <> 0 then msgbox i else msgbox "該当のデータが見つかりません", vbexclamation end if end sub '------------------ function searchmatch(ser1, ser2, rng1 as range, rng2 as range) 'これは配列関数です。 dim rwcnt as long: rwcnt = rng1.rows.count dim i as long, j as long dim ar as variant dim ret() as variant ser1 = trim(ser1) ser2 = trim(ser2) redim ar(1 to rwcnt) for i = 1 to rwcnt ar(i) = rng1.cells(i, 1).value & "," & rng2.cells(i, 1).value if ser1 & "," & ser2 like ar(i) then j = j + 1 redim preserve ret(1 to j) ret(j) = i end if next i if j > 0 then searchmatch = ret else searchmatch = "n/v" end if end function '// 配列の出力は、 例えば、このように出汁ます。 =index(searchmatch(c1,d1,a2:a14,b2:b14),,1) =index(searchmatch(c1,d1,a2:a14,b2:b14),,2) '2にする