[[20160621143224]] 『複数一致した行の番号を調べる』(セリナ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数一致した行の番号を調べる』(セリナ)

複数の検索値と一致した行の番号をvbaを使用して調べたいです。

Book1 Sheet1
Book2 Sheet1

Book1↓

	A列   B列
1	名前	山田太郎						
2	方位	南			
3	番号	3		
・・・・・・
6	住所	〒×××−××××
7	電話番号090-××××−××××

Book2↓

	A列    B列	 C列	 D列		     E列
1	名前	 方位	 番号	 住所		     電話番号		
2	山田太郎 南	 2    〒×××−××××  090-××××−××××
3	山田太郎 南	 3
・・・・・・
6	住所	〒×××−××××
7	電話番号090-××××−××××

Book1は縦書き、Book2は横書きになっています。
Book1の名前はB1、方位はB2、番号はB3で固定です。
名前と方位と番号が全て一致するBook2の行の番号を調べたいです。
vbaでの調べ方を教えてください。わかりにくく申し訳ありませんがどうか宜しくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 Book1 には 1件だけが記載されていて、それと Book2に複数行記載されているものとのマッチングを行うということですね?
 また、Book2 のレイアウトサンプルの 6,7行目は 単なる アップ時のコピペミスで、本当は、このようなものは
 ないのですね?

(β) 2016/06/21(火) 15:13


 追加で。 

 マッチングすべきキーは 名前、方位、番号 ですか?
 それとも、名前、方位、番号、住所、電話番号 ですか?

(β) 2016/06/21(火) 15:26


β様

御回答ありがとうございます。
Book1には一つのセット(B1名前、B2方位、B3番号)のみ記載されています。
マッチングすべきキーは[名前][方位][番号]です。
住所、電話番号はです。紛らわしく申し訳ありません。

(セリナ) 2016/06/21(火) 15:47


 いろんな方法がありますね。
 きっと、数式一発でも求めることができますし、VBA処理内でも、その数式を使えば2〜3行のコードで
 結果がでると思います。
 VBA処理でも、もっともっとコード数の少ない書き方もできますが、なるべくわかりやすいループ判定コードにしました。

 ブックの構成ですが、Book1,Book2 とは別に マクロブックがあるということを想定したコードです。
 もし、いずれか一方のブックにマクロを記載して使うならそういうことも(もちろん)できます。

 また、行番号を知りたいということなので、とりあえす、行番号をメッセージで表示していますが
 もしかしたら、そうではなく、Book1の 6,7行目に、見つかったものをセットしたかったのでは?

 それならそれで、ちょこっとなおせば、できます。

 (5項目マッチングのままアップしてましたので入れ替えました 16:07)

 Sub Sample()
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim r As Range
    Dim n As Long
    Dim myName As String
    Dim myDir As String
    Dim myNum As Variant

    Set sh1 = Workbooks("Book1.xlsx").Sheets("Sheet1")
    Set sh2 = Workbooks("Book2.xlsx").Sheets("Sheet1")

    myName = sh1.Range("B1").Value
    myDir = sh1.Range("B2").Value
    myNum = sh1.Range("B3").Value

    With sh2.Range("A1").CurrentRegion
        For Each r In .Rows
            If r.Range("A1").Value = myName Then
                If r.Range("B1").Value = myDir Then
                    If r.Range("C1").Value = myNum Then
                        n = r.Row
                        Exit For
                    End If
                End If
            End If
        Next

        If n > 0 Then
            MsgBox n & "行目にありました"
        Else
            MsgBox "見つかりません"
        End If
    End With

 End Sub

(β) 2016/06/21(火) 15:55


 数式利用の例です。2〜3行にするとコードの1行が長くなりすぎるので、適当に分解して記述しました。

 Sub Sample2()
    Const BK1NM As String = "Book1.xlsx"
    Const BK2NM As String = "Book2.xlsx"
    Dim myForm As String
    Dim x As Long
    Dim z As Variant

    x = Workbooks(BK2NM).Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
    myForm = "MATCH([●1]Sheet1!$B$1&[●1]Sheet1!$B$2&[●1]Sheet1!$B$3,[●2]Sheet1!$A$1:$A$★&[●2]Sheet1!$B$1:$B$★&[●2]Sheet1!$C$1:$C$★,0)"
    myForm = Replace(Replace(Replace(myForm, "●1", BK1NM), "●2", BK2NM), "★", x)

    z = Evaluate(myForm)

    If IsNumeric(z) Then
        MsgBox z & "行目にありました"
    Else
        MsgBox "見つかりません"
    End If

 End Sub

(β) 2016/06/21(火) 16:32


β様
返信が遅くなり申し訳ありません。大変助かりました。
行番号を見つけた後の処理は自分で考えたいと思います。ありがとうございました。
(セリナ) 2016/06/22(水) 09:30

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.