1390178397 こんにちは

エクセル2007を利用しています。
関数に関する知識がほとんどないのですが、下記のように出来れば効率よくなるのでみなさんのお力をお借りしたくて質問いたしました。どうかよろしくお願いいたします。

添付画像のような表を作成していますが、例ではA14に検索する文字「木」を入れていますが、別シートに検索結果を表示できるようにしたいです。

シート1に表を作成しシート2に検索結果を表示できるようになればと思います。
検索文字を「木」と入力すれば画像のようにAさん、Bさん、Gさんの名前と同時にB列、C列の文字も同時に結果として表示したいのです。表のように列違いにある文字をピックアップして結果として出したいのでお手数掛けますがよろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/01/20 16:22:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント500pt

こういうのは VBA(マクロ)を使わないと難しいでしょう。

無理に関数でやる方法や 抽出処理をする方法もありますが、何度も繰り返しやるには 向いてないと思います。

以下のマクロでやればいいです。

Sub 抽出()
    Dim r As Long
    Dim f As Long
    Dim 位置 As Long
    
    シート1 = "Sheet1"
    シート2 = "Sheet2"
    
    曜日 = Worksheets(シート2).Range("A1")
    
    データ開始位置 = 2            'データの開始位置はA2からです。
    出力開始位置 = 3              '出力の開始位置はA3からです。
    
    If 曜日 = "" Then Exit Sub
    
    '初期化
    位置 = 出力開始位置
    If Worksheets(シート2).Cells(位置, "A") <> "" Then
        位置 = 位置 + 1
        If Worksheets(シート2).Cells(位置, "A") <> "" Then
            位置 = Worksheets(シート2).Cells(出力開始位置, "A").End(xlDown).Row
        End If
    End If
    
    For r = 出力開始位置 To 位置
        Worksheets(シート2).Cells(r, "A") = ""
        Worksheets(シート2).Cells(r, "B") = ""
        Worksheets(シート2).Cells(r, "C") = ""
    Next r
    
    
    '抽出
    位置 = データ開始位置
    If Worksheets(シート1).Cells(位置, "A") <> "" Then
        位置 = 位置 + 1
        If Worksheets(シート1).Cells(位置, "A") <> "" Then
            位置 = Worksheets(シート1).Cells(データ開始位置, "A").End(xlDown).Row
        End If
    End If
   
    f = 出力開始位置
    For r = データ開始位置 To 位置
        For b = 4 To 4 + 7
            If Worksheets(シート1).Cells(r, b) = 曜日 Then
                Worksheets(シート2).Cells(f, "A") = Worksheets(シート1).Cells(r, "A")
                Worksheets(シート2).Cells(f, "B") = Worksheets(シート1).Cells(r, "B")
                Worksheets(シート2).Cells(f, "C") = Worksheets(シート1).Cells(r, "C")
                f = f + 1
                Exit For
            End If
        Next b
    Next r

End Sub

以下の内容を適宜変更して使ってください。

    ↓シート名です。
    シート1 = "Sheet1"
    シート2 = "Sheet2"
    
    ↓抽出する曜日を指定する箇所です。
    曜日 = Worksheets(シート2).Range("A1") ← A1

    
    データ開始位置 = 2            'データの開始位置はA2からです。
    出力開始位置 = 3              '出力の開始位置はA3からです。

他4件のコメントを見る
id:taknt

やろうと思えば マクロで できます。
新たに質問したらいいですが、その際、何をやりたいか 詳しく書いてもらったほうが より ベターな回答を得られるでしょう。

2014/04/22 05:42:21
id:dejavu888i

きゃづみぃ 様

再度質問させて頂きました。また宜しくご指導お願いいたします。

2014/05/08 20:37:59
  • id:kaiton
    終了したけれど、回答したかった関数のみの方法です。

    一時的な計算領域をいくつか用意して解決します。
    M2 =MATCH($A$14,$D2:$J2,0) これを下にコピー その行に検索文字があるかどうか
    N2 =IF(ISNA(M2),"",ROW()) これを下にコピー M列で検索ありの場合、何行目か

    A17 =IF(ISERROR(INDEX($A$1:$C$8,SMALL($N$1:$N$8,ROW()-16),COLUMN())),"",INDEX($A$1:$C$8,SMALL($N$1:$N$8,ROW()-16),COLUMN()))
    これを右や下にコピー
    INDEX関数で、上の表から何行目の何列目を表示のようにしています。

    A17 =INDEX($A$1:$C$8,SMALL($N$1:$N$8,1),1)
    B17 =INDEX($A$1:$C$8,SMALL($N$1:$N$8,1),2)
    C17 =INDEX($A$1:$C$8,SMALL($N$1:$N$8,1),3)
    A18 =INDEX($A$1:$C$8,SMALL($N$1:$N$8,2),1)
    B18 =INDEX($A$1:$C$8,SMALL($N$1:$N$8,2),2)
    C18 =INDEX($A$1:$C$8,SMALL($N$1:$N$8,2),3)
    のようにしても良いのですが、列や行が増えると大変なので、行と列を表すrow,column関数を使い、エラー処理を含めて上の式にしました。

    似た例で、6年前の日経PC21のエクセル腕自慢コンテストで問題が出ています。
    日経BPのユーザ登録(無料)が必要ですが、記事を参照下さい。
    pc.nikkeibp.co.jp/article/NPC/20071218/289711/?P=3
    駅伝の大学・選手一覧から検索して表示する問題です。
    優秀賞などをダウンロードしてみてはどうでしょうか、いろいろ関数の勉強になると思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません