- ベストアンサー
エクセルでのデータ検索方法について
- エクセルの集計シートにおいて、工場名を入力すると3人の担当者のシートと一致する工場名の行を表示させる方法について教えてください。
- 担当者の名称を入力すると、その担当の工事をすべて表示する方法について教えてください。
- 工場名と担当者名を入力すると、3人の担当者のシートに一致する工場名と担当者の行を表示する方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、各「担当者のSheet」のシート名を、担当者名と同じ名称となる様にして下さい。 次に、新しいシートを1枚設けて、そのシート名を 作業用 等として下さい。 次に、作業用シートのA1セルからC1セルにかけて、各「担当者のSheet」の"シート名"を入力して下さい。 次に、作業用シートのA2セルに次の様な関数を入力して下さい。 =IF(ISREF(INDIRECT("'"&A$1&"'!A1")),IF(IF(集計!$B$2="",集計!$B$3=A$1,AND(OR(集計!$B$3="",集計!$B$3=A$1),INDIRECT("'"&A$1&"'!A"&ROW())=集計!$B$2)),COLUMNS($A:A)*10000000+ROW(),""),"") 次に、作業用シートのA2セルをコピーして、作業用シートのB2~C2の範囲に貼り付けて下さい。 次に、作業用シートのA2~C2の範囲をコピーして、同じ列範囲の3行目以下に貼り付けて下さい。 次に、集計シートのA7セルに次の様な関数を入力して下さい。 =IF(ROWS($7:7)>COUNT(作業用!$A:$C),"",IF(INDEX(INDIRECT("'"&INDEX(作業用!$A$1:$C$1,INT(SMALL(作業用!$A:$C,ROWS($7:7))/10000000))&"'!A:C"),MOD(SMALL(作業用!$A:$C,ROWS($7:7)),10000000),COLUMNS($A:A))="","",INDEX(INDIRECT("'"&INDEX(作業用!$A$1:$C$1,INT(SMALL(作業用!$A:$C,ROWS($7:7))/10000000))&"'!A:C"),MOD(SMALL(作業用!$A:$C,ROWS($7:7)),10000000),COLUMNS($A:A)))) 次に、集計シートのA7セルをコピーして、集計シートのB7~C7の範囲に貼り付けて下さい。 次に、集計シートのA7~C7の範囲をコピーして、同じ列範囲の8行目以下に貼り付けて下さい。 以上で準備は完了で、後は集計シートのB2セルに工場名や担当者名を入力しますと、集計シートのA列~C列の7行目以下に、3人の担当者シートにあるデータの中で、該当する全てのデータが表示されます。
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 関数でやってみようと作業用の列・Sheetを使用して試みましたが 数式が長くなるのであきらめました。 お望みでないVBAになってしまいますが、一例です。 ↓の画像の左側が「集計Sheet」でSheet見出しの一番左側にあり、Sheet2~Sheet4のSheet名は ああ・いい・うう のように担当者名になっているという前提です。 まず、Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてください。 Dim k As Long, lastRow As Long, str As String, wS As Worksheet 'この行から Sub Sample1() Set wS = Worksheets(1) For k = 2 To 4 '←Sheet見出しの左から2番目~4番目のSheet With Worksheets(k) .Range("A1").AutoFilter field:=1, Criteria1:=wS.Range("B2") If wS.Range("B3") <> "" Then .Range("A1").AutoFilter field:=3, Criteria1:=wS.Range("B3") End If lastRow = .Cells(Rows.Count, "A").End(xlUp).Row If lastRow > 1 Then Range(.Cells(2, "A"), .Cells(lastRow, "C")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End With Next k End Sub Sub Sample2() Set wS = Worksheets(1) str = wS.Range("B3") On Error Resume Next With Worksheets(str) If wS.Range("B2") <> "" Then .Range("A1").AutoFilter field:=1, Criteria1:=wS.Range("B2") End If lastRow = .Cells(Rows.Count, "A").End(xlUp).Row If lastRow > 1 Then Range(.Cells(2, "A"), .Cells(lastRow, "C")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End With End Sub 'この行まで 次にExcel画面に戻り、 Sheet見出しの一番左側にある「集計Sheet」のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペースト → Excel画面に戻り、B2・B3セルにデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim endRow As Long If Intersect(Target, Range("B2:B3")) Is Nothing Then Exit Sub endRow = Cells(Rows.Count, "A").End(xlUp).Row If endRow > 6 Then Range(Cells(7, "A"), Cells(endRow, "C")).ClearContents End If If Target.Address = "$B$2" Then If Target <> "" Then Call Sample1 Else Call Sample2 End If ElseIf Target.Address = "$B$3" Then If Target <> "" Then Call Sample2 Else Call Sample1 End If End If End Sub 'この行まで おそらくお望み通りの動きになると思います。 >マクロは苦手です。関数でなんとかなりませんか? というコトですので、 ご希望の方法でない場合は無視してください。m(_ _)m
- marimo44
- ベストアンサー率11% (13/116)
ピボットテーブルでできると思いますよ。
補足
やりかたがよくわかりません。 できましたら、やり方を教えて下さい。 素人なもので。 関数でなんとかなりませんか?
お礼
ご丁寧にらありがとうございました。 チャレンジしてみます。