- 締切済み
エクセルでフラグがたっている場合、そのレコードを抽出して別シートに表を作りたい
タイトルのとおりです A1 住所 A2 氏 A3 名 A4からA10 フラグ A11からA15 データ 以上の場合、A4からA10まではフラグで、 そのうち、ひとつのセルでも何か入力されておれば(つまり、フラグがたっている状態)そのレコード、 つまり、A1からA15までを別のシートに抽出して、フラグのたっているデータの表を新たに作成したいのです。 この場合の、関数など、作成方法などを教えてください。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- matsu_jun
- ベストアンサー率55% (146/265)
No.3のmatsu_junです。 > 削除したいのは、フラグ範囲のセルA4からA10に何も入力がない場合は、A1からA15は別のシートにコピーせず、 > B4からB10の間に1つでも何か入力されておれば、B1からB15を別のシートにコピーする 私の解釈と異なるのは、A列がタイトル列なのか(私の解釈)データ列なのか(taro0713様の解釈)という一点だけだと思うのですが。 下の問いにお答えくださいませ。なお、設問6以外は、以降私が回答するために必須の項目です。 1) 元のデータというのは、ある一つのブックのある一つのシートの中に入っているものですか? そうであればそのシート名を、そうでなければそれぞれのシート名を教えてください。 2) 元のシートには、一つ目のデータがAの列(A1~A15)、二つ目のデータがBの列(B1~B15)、三つ目のデータがCの列(C1~C15) 以降D列、E列、F列・・・と入っていっているものですか? もしくは複数のシートのA列だけを使っているのですか? 3) 移動先のシートは、元データの入ったブックと同じブック内でよろしいですか?「はい」か「いいえ」でお答えください。 4) 移動先のシートは1つでよろしいのですか?それとも例えばA4~A10のいずれかに何か入力されていた場合にA1~A15を 元データのあるシートとは別のシート(仮にSheetA)にコピーし、B4~B10のいずれかに何か入力されていた場合にB1~B15を 元データとSheetAとも違うシート(仮にSheetB)にコピーするといったことですか? いずれにしても移動先のシート名(もしくはシート名のリスト)をお教えください。 5) 移動先の列は、私がNo.3で答えているように右詰めしていくのでしょうか?それとも仮にA1~A15とB1~B15のデータが コピー対象でない(AとBのフラグが立っていない)場合でC1~C15のデータがコピー対象だった場合は 移動先のシートのC列にコピーすればよいのですか? 6) その他、No.3の私の解釈の違いについて、私がここで設問にあげなかったことがありましたらお教えください。 以上、よろしくお願いします。
- matsu_jun
- ベストアンサー率55% (146/265)
taro0713さん、こんにちは。一応作業行を利用すれば関数で解決できないこともないです。 Sheet1上の (注:等幅フォント(MSゴシックなど)で見てください) ┃A ┃B ┃C ┃D ┃E ┃F ┃G ┃H ┃I ┃J ┃ ━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋ 1 ┃住所│BB│CC│DD│EE│FF│GG│HH│II│JJ│ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 2 ┃名前│b │c │d │e │f │g │h │i │j │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 3 ┃名前│b │c │d │e │f │g │h │i │j │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 4 ┃フ1│フb1│ │ │ │フf1│ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 5 ┃フ2│ │フc2│ │ │ │ │ │ │フj4│ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 6 ┃フ3│ │ │ │ │フf3│ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 7 ┃フ4│ │ │ │ │フf4│ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 8 ┃フ5│フb5│ │ │フe5│ │ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 9 ┃フ6│ │フc6│ │ │ │ │ │フi6│ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 10 ┃フ7│ │フc7│ │ │フf7│ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 11 ┃デ1│B1│C1│D1│E1│F1│G1│H1│I1│J1│ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 12 ┃デ2│B2│C2│D2│E2│F2│G2│H2│I2│J2│ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 13 ┃デ3│B3│C3│D3│E3│F3│G3│H3│I3│J3│ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 14 ┃デ4│B4│C4│D4│E4│F4│G4│H4│I4│J4│ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 15 ┃デ5│B5│C5│D5│E5│F5│G5│H5│I5│J5│ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ から、フラグの一つも入っていない列(D、G、H列)を無視した残りの列(A~C、E、F、I、J列)を Sheet2に左寄せして、下図のように記入すればよろしいのでしょうか? ┃A ┃B ┃C ┃D ┃E ┃F ┃G ┃H ┃I ┃J ┃ ━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋ 1 ┃住所│BB│CC│EE│FF│II│JJ│ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 2 ┃名字│B │C │E │F │I │J │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 3 ┃名前│b │c │e │f │i │j │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 4 ┃フ1│フb1│ │ │フf1│ │ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 5 ┃フ2│ │フc2│ │ │ │フj4│ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 6 ┃フ3│ │ │ │フf3│ │ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 7 ┃フ4│ │ │ │フf4│ │ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 8 ┃フ5│フb5│ │フe5│ │ │ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 9 ┃フ6│ │フc6│ │ │フi6│ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 10 ┃フ7│ │フc7│ │フf7│ │ │ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 11 ┃デ1│B1│C1│E1│F1│I1│J1│ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 12 ┃デ2│B2│C2│E2│F2│I2│J2│ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 13 ┃デ3│B3│C3│E3│F3│I3│J3│ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 14 ┃デ4│B4│C4│E4│F4│I4│J4│ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ 15 ┃デ5│B5│C5│E5│F5│I5│J5│ │ │ │ ━━━╋──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼ (A列はタイトル列とし、実際のデータはB列以右に入っているとします。) でしたらまずは問題文を整理しますね。 「縦1列に1レコードを記録した表がSheet1上にあります。レコードの要素としては、 1行目:住所、2行目:名字、3行目:名前、4~10行目:フラグ1~フラグ7、 11~15行目:データ1~データ5となっています。 このうちフラグ1~フラグ5のいずれかのフラグが立っている(セルに値の記入がある)レコード(列)を摘出し、 それを別シート(Sheet2)に左詰めで転載するにはどのような関数を用いればよいでしょうか。 なおA列はタイトル列とし、Sheet1にもSheet2にもあるものとします。」 作業行として、転記先(Sheet2)の16行目、17行目を利用します。 1)セルB16に「=NOT(COUNTA(Sheet1!B4:B10))」と記入し、このセルの右下(マウスカーソルが+に変化するところ)で マウスの左ボタンを押しながら、セルIV16までドラッグします。 2)セルB17に「=MATCH(FALSE,OFFSET($B$16,0,A17,1,1):$IV$16,0)+A17」と記入し(Sheet2のセルA17には値を入れないで 下さい)、1)同様セルIV17までドラッグします。 3)セルB2に「=IF(ISERROR(B$17),"",OFFSET(Sheet1!$A1,0,$B$17,1,1))」と記入し、セルB15までドラッグします。 4)セルB2からB15それぞれの式の「$B$17」を「B17」に書き換えてください。 5)セルB2からB15までを選択し、セルB15の右下をつまんでセルIV15までドラッグします。 6)お好みに応じて、Sheet2の16行目、17行目を非表示にします。 一応これで完成しますが、Sheet2のセルB2~IV17まで数式が記入されますのでデータ量が大きくなってしまい、 お勧めは致しかねます。 定型作業で行う方法 オートフィルタを利用して必要なデータを選択(あるいは不要なデータを削除)すればよいのですが、 taro0713様のデータの場合、オートフィルタを利用するための行列の並びが逆になっているので そのままでは利用できません。よって、一度別のシートにtaro0713様の表を行列入れ替えてコピーし、 作業を行うのが適当で、上記の関数を利用する方法よりもデータ量が少なく済みます。 1)作業シートを仮に作ります(これをSheet3とします) 2)Sheet1の表を選択し、コピーします。 3)Sheet3のセルA1を選択し、右クリック-形式を選択して貼り付け(S)を選びます。 4)画面に表示されたメニューから、「行列を入れ替える(E)」にチェックをつけて「OK」をクリックします。 5)そのままの状態(Sheet3上で表が選択された状態)で、データ(D)-フィルタ(F)-オートフィルタ(F)を選択 6)D1(フラグ1)右のボタンをクリックして、(空白セル)を選択、以降J1(フラグ7)まで同様の操作を行います。 7)Ctrlキーを押しながらAを押してシート全体を選択した後、Ctrlを押しながらGを押します。 8)表示された「ジャンプ」ウィンドウから、「セル選択(S)」ボタンを押します。 9)表示された「選択オプション」ウィンドウから、「可視セル(Y)」にチェックし、OKボタンを押します。 10)メインメニューの「編集(E)」から、「行の削除(D)」を選択します。 11)すると、どこかのフラグにチェックが入ったデータだけが残ることになります。 12)残ったデータを選択し、コピーします。 13)Sheet2のセルB1を選択し、右クリック-形式を選択して貼り付け(S)を選びます。 14)画面に表示されたメニューから、「行列を入れ替える(E)」にチェックをつけて「OK」をクリックします。 お好きな方法をご選択ください。「定型作業で行う方法」をマクロ記録すると自動で出来上がります。 本当はWorkbook_SheetChangeイベントを利用してVBAを動作させるのが最も便利なのですので、 もしVBAでもいいのであれば、一度ご連絡くださいませ。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 No.1704596を見てきました。 「フラグが立っている」というプログラミング用語を使っていながら、単に、セルに値があるかどうかですと、意味が伝わってきませんね。用語の使い方が間違っていませんか? 「ひとつのセルでも何か入力されておれば」と「フラグが立てること」とは意味が違いますね。単に、A4~A10 に値が入力されていたら、別のシートに写せばよいのだと思います。 補助列を使って、 B4:B10 =IF(COUNTIF($A$4:$A$10)>0,TRUE,FALSE) で、TRUE をオートフィルタで抽出し、それをコピーします。そうでないなら、VBAのほうが楽でしょうね。
- imogasi
- ベストアンサー率27% (4737/17070)
前の質問で補足要求したものです。 焼きなおしましたね。私の例示でも上げてもらえれば、質問の意味が判りやすかったのではないかと思いましたが。 回答を考えようかなと思っていたところ締め切られたので、下記例は本質問とやや異なっていますが、修正してください。 imogasi方式でやれます。 これ以外の方法でも、関数だと相当難しいと思う。 -----前提整理 (1)A列で10行単位に、何かに関して、データが記録されている (2)次の10行との間に余白行はいれず、詰めるものとする。 (3)第1ブロック(A2:A11)で言えば、A2苗字、A3名前、A4-A8のはフラグ (4)A9,A10、A11は住所とします。 (5)第4-第8行に、どこでも最小1行、1を入れると、そのブロック 10行が表示対象行になる。以下「対象行」ということにする。 ----対象行に連番を振る Sheet1において D2に =IF(COUNTIF(OFFSET($A$2,INT((ROW()-2)/10)*10+2,0,5,1),"1")>=1,MAX($D$1:D1)+1,"") を入れて、最下行まで式を複写する。 そして A2,A3、A9,A10,A11 A12,A13,A19,A20,A21 A22,A23,A29,A30,A31 ・・・ に1を入れて、表示が変化しないことを確認する。 逆に、上記以外の A4-A8 A14-A18 ・・・ に1箇所でも1を入れると、そのブロックの行の全てに、 通し番号が振られることを確認する。 ーーーー あとはimogasi方式でSheet2に連続番号を振った行のみデータを写します。 Sheet2のA2に =INDEX(Sheet1!$A$1:$C$100,MATCH(ROW()-1,Sheet1!$D$1:$D$101,0),COLUMN()) と入れてC列まで+ハンドルを引っ張る・ A2:C2を範囲指定して, C3で+ハンドルを出し、づっとブロック数x10行下まで引っ張る。 第2と第4ブロックを指定したときの例 1 b1 y1 1 b2 y2 0 b3 y3 0 b4 y4 1 b5 y5 0 b6 y6 0 b7 y7 1 b8 y8 1 b9 y9 1 b10 y10 1 d1 u1 1 d2 u2 0 d3 u3 1 d4 u4 0 d5 u5 0 d6 u6 0 d7 u7 1 d8 u8 1 d9 u9 1 d10 u10 #N/A #N/A #N/A #N/A #N/A #N/A #N/Aを出さないようにすることは、省略。息切れした。
補足
説明不足で申し訳ありません。 >フラグの一つも入っていない列(D、G、H列)を無視した残りの列(A~C、E、F、I、J列)を Sheet2に左寄せして、下図のように記入すればよろしいのでしょうか? ではありません。 削除したいのは、フラグ範囲のセルA4からA10に 何も入力がない場合は、A1からA15は別のシートにコピーせず、B4からB10の間に1つでも何か入力されておれば、B1からB15を別のシートにコピーする・・・と、いうことなのです。 わかりにくくて申し訳ありません。