
行列 A列 B列 C列 D列
1 No Kg 3 32
2 1 30
3 1 31
4 1 32
5 1 33
6 1 34
7 2 27
8 2 28
9 2 29
10 2 30
11 3 31
12 3 32
13 3 33
上表の通り、A列とB列がデータ(1行目はヘッダー)、セル番号C1とD1が検索条件です。
C1の検索条件はA列、D1の検索条件がB列です。
この2つの条件に合う行番号を取得できるようにVBAを作成しております。
上記例ですと、行番号(アウトプット)は12行目となります。
以下のようにMatch関数では複数条件での検索ができなそうです。
(以下は当然エラーとなってしまいます)
調べていると、IndexやFind 関数を使用している例も見ましたが、うまくいきません。
複数の条件から該当する行番号を返す方法をご教授いただきたくお願いします。
Sub test()
Dim row As Variant
row = 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
No.4ベストアンサー
- 回答日時:
こんにちは。
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にする
No.3
- 回答日時:
[No.2補足]へのコメント、
》 演算式で、*ROW(A1:A15)) を掛け算するというのが
》 理解できてないのですが・・・
お断りしておきますが、マクロ音痴の私は提示した演算式の意味についてしかコメントできません。
貴方の理解の一助になろうかと思ったのが添付図だけど、マクロが使える貴方なら「なるほど」と参考になるのでは?

No.1
- 回答日時:
こんにちは!
一例です。
いかにもVBAって感じでやってみました。
ちょっとまわりくどいかもしれませんが・・・
Sub Sample1()
Dim c As Range, myRng As Range, myFlg As Boolean
Dim myFound As Range, myFirst As Range
Set myFound = Range("A:A").Find(what:=Range("C1"), LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = Range("A:A").FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
For Each c In myRng
If c.Offset(, 1) = Range("D1") Then
myFlg = True
Exit For
End If
Next c
If myFlg = True Then
MsgBox c.Row & "番目のデータです"
Exit Sub
Else
GoTo EH
End If
Else
GoTo EH
End If
EH:
MsgBox "該当データなし"
End Sub
※ 単に一致した行番号をメッセーボックスに表示させているだけですので、
「○番目」というコトであれば
>MsgBox c.Row -1 & "番目のデータです"
としないといかないかも・・・
こんな感じではどうでしょうか?m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
このQ&Aを見た人はこんなQ&Aも見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
最強の防寒、あったか術を教えてください!
とっても寒がりなのですが、冬に皆さんがされている最強の防寒、あったか術が知りたいです!
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
【excelVBA】Findメソッドで検索対象を複数列
Excel(エクセル)
-
エクセルで複数列の検索をマクロで行いたい
Excel(エクセル)
-
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
-
4
vbaでworksheetfunctionでの複数関数がエラーになります
Visual Basic(VBA)
-
5
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
Excelマクロ 該当する値の行番号取得などのやり方について
Visual Basic(VBA)
-
8
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
-
9
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
10
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
11
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
12
Excel MATCH関数で検索範囲内に同じ値の検索値が複数ある場合
Access(アクセス)
-
13
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
14
Application.Matchで特定行の検索
Visual Basic(VBA)
-
15
ApplicationとWorksheetFunctionの違い
Visual Basic(VBA)
-
16
【Excel VBA】CSV取込時、数字の先頭の0を消えないようにするには?
Excel(エクセル)
-
17
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
18
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
19
条件にマッチする行を抽出するVBAを教えてください
経営情報システム
-
20
VBA 数値を文字列として貼付したい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで日付から日にちを削...
-
複数の条件に合う行番号を取得...
-
Excelで2行単位のソートの出来...
-
エクセルで、重複データを除外...
-
エクセルで1列に500行並んだデ...
-
excel:別シートの値を飛び飛び...
-
Excelの30個ずつの平均値の出し方
-
Countifよりも早く重複数をカウ...
-
Excelの関数でこんな処理ができ...
-
エクセルVBA C列に特定の文字列...
-
EXCELでの重複データカウント方...
-
500行の中から、多い順に抽出す...
-
エクセルで1つの会社名に対して...
-
【Excel】小計単位で並べ替えを...
-
不要な行を消したい
-
エクセルで横並びの複数データ...
-
VBA 数式を最終行までコピー
-
【エクセル】1列内に複数ある同...
-
エクセル2016にて、行挿入&コピ...
-
A1セルに入力したら、入力時間...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで日付から日にちを削...
-
Excelで2行単位のソートの出来...
-
複数の条件に合う行番号を取得...
-
エクセルで1列に500行並んだデ...
-
Countifよりも早く重複数をカウ...
-
excel:別シートの値を飛び飛び...
-
エクセルで、重複データを除外...
-
Excelの30個ずつの平均値の出し方
-
エクセルVBA C列に特定の文字列...
-
エクセルで横並びの複数データ...
-
エクセルで1つの会社名に対して...
-
VBA 数式を最終行までコピー
-
500行の中から、多い順に抽出す...
-
エクセル2016にて、行挿入&コピ...
-
不要な行を消したい
-
VBA 大きなtxtテキストファ...
-
【エクセル】1列内に複数ある同...
-
本日の日付を超えているものを...
-
Excel VBA 【QueryTables.Add】...
-
【Excel】フィルタの実行で重複...
おすすめ情報
回答ありがとうございます。
Dim ret As Double
ret = WorksheetFunction.SumProduct((Range("A1:A15") = Range("C1")) * (Range("B1:B15") = Range("D1")) * Row(Range("A1:A15")))
ROWのところで、「Sub又はFunctionが定義されていない」 とエラーが出ます。
この演算式で、*ROW(A1:A15)) を掛け算するというのが理解できてないのですが・・・