• ベストアンサー

2つのリストの差集合を出したい

添付画像にあるように、B列とC列に単語のリストがあります。 B列とC列の差集合をE列に表示させたいと思っています。 なお、A列はB列の単語の頻度で、その数値をD列にも残したいです。 ちなみに、 =INDEX(A:A,SMALL(IF(COUNTIF(B:B,A$1:A$100),9999,ROW(A$1:A$100)),ROW(C1)))&"" というやり方でやっていたのですが、時間とマシンパワーを必要とするため、別の方法があったら、ぜひ教えていただきたいと思っています。 どうぞよろしくお願いしますm_ _m

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! >時間とマシンパワーを必要とするため・・・ とありますのでVBAでの一例です。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) 尚、データは1行目からあるとしています。 Sub test() 'この行から Dim i, k As Long Application.ScreenUpdating = False For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(Columns(3), Cells(i, 2)) = 0 Then k = k + 1 With Cells(k, 4) .Value = Cells(i, 1) .Offset(, 1) = Cells(i, 2) End With End If Next i Application.ScreenUpdating = True End Sub 'この行まで ※ 関数でないので、データ変更があるたびにマクロを実行する必要があります。 お望みの方法でなかったらごめんなさいね。m(_ _)m

junpei12
質問者

お礼

試してみたところ、とても短時間で処理することが出来ました。とても助かります。どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

No.2です。ごめんなさい、No.2で、数式中の数字を間違えました(行を削除した後の式を貼ってしまいました)。正しくは次の式です。 =countif($C$7:$C$10,b1)=0

junpei12
質問者

お礼

どうもありがとうございました。 ベストアンサーとさせて頂くか迷ったのですが、申し訳ありません。 教えていただいた式でも可能であることを確認しました。 色々な方法があることも分かって、とても勉強になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

一発で算出しなくてもいいなら、該当/非該当を表示する作業列を作り、非該当の行だけ削除するのが簡単かと。 D・E列に何も入力されていないものとして話を進めます。 (1)A1:B4とC1:C4の行番号が重ならないよう、C1:C4をワークシート内のよその行か、別シートに移動。今回はC7:C10に移したとする。 (2)新しく空白セルとなったC1セルに次式を入力。 =countif($C$5:$C$8,b1)=0 (3)オートフィルでC1:C4を埋める。計算結果として「TRUE」か「FALSE」が表示される。 (4)C1:C4をコピーし、D1:D4に値のみ貼り付け。 (5)D1:D4を選択した状態で、置換の機能(Ctrl+H)により、「false」→「」(未入力)の置換を実行。 (6)D1:D4を選択した状態で、ジャンプのダイアログ(Ctrl+G)を開き、「セル選択」ボタンの中の「空白セル」を指定して「OK」ボタンを押下。 (7)空白セルのみ選択された状態となっているので、削除のダイアログ(Ctrl+ -(マイナス))で、「行全体」を指定して「OK」ボタンを押下。

全文を見る
すると、全ての回答が全文表示されます。
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>時間とマシンパワーを必要とするため、別の方法があったら、ぜひ教えていただきたい 今の「その」配列数式で限界を感じているなら、多少の手入れをしてもどのみち劇的な改善はありません。 素直に D1: =IF(COUNTIF(C:C,B1),"",ROW(D1)) 以下コピー F1: =IFERROR(INDEX(A:A,SMALL(D:D,ROW(F1))),"") G1: =IFERROR(INDEX(B:B,SMALL(D:D,ROW(G1))),"") 以下コピー などのようにしてしまえば、ほとんどストレスなしに結果を得られるはずです。

junpei12
質問者

お礼

どうもありがとうございました。 ベストアンサーとさせて頂くか迷ったのですが、申し訳ありません。 色々な方法があることも分かって、とても勉強になりました。 大変感謝しております。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • A列が1から始まる連番で、C列を合計欄として結合

    添付画像のようにA列が1から始まる連番で、C列を合計欄として結合し、結合したC列に隣り合う、B列の合計を出す場合のC列の関数を =IF(INDEX($A:$A,ROW())="","",SUM(INDEX($B:$B,ROW()):INDEX($B:$B,IF(COUNTIF(INDEX($A:$A,ROW()+1):INDEX($A:$A,ROWS($A:$A)),"*?"),MATCH("*?",INDEX($A:$A,ROW()+1):INDEX($A:$A,ROWS($A:$A)),0)-1+ROW(),ROWS($A:$A))))) とした場合画像の左のように合計が合いません。 画像の右のようにC列を計算するには =IF(INDEX($A:$A,ROW())="","",SUM(INDEX($B:$B,ROW()):INDEX($B:$B,IF(COUNTIF(INDEX($A:$A,ROW()+1):INDEX($A:$A,ROWS($A:$A)),"*?"),MATCH("*?",INDEX($A:$A,ROW()+1):INDEX($A:$A,ROWS($A:$A)),0)-1+ROW(),ROWS($A:$A))))) をどのように修正すればいいのでしょうか?

  • ExcelのSMALL関数について

    ExcelのB列(B2:B50)にフラグ「0」または「1」が入力されています。 フラグ「0」が入力されている行番号を関数を使用して取得したいと思っています。 B列のフラグは順次更新されており、フラグ「0」の個数は複数あります。 下記の関数式(以下多めにオートフィル)で上記のことができるようになったのですが、 =IF(COUNTIF(B$2:B$50,0)<ROW(A1),"",SMALL(INDEX((B$2:B$50<>0)*10^5+ROW(B$2:B$50),),ROW(A1))) SMALL関数式の部分↓↓の意味がよくわかりません。 SMALL(INDEX((B$2:B$50<>0)*10^5+ROW(B$2:B$50),),ROW(A1)) どなたかご教授いただけないでしょうか。

  • 別シートに勉強時間の集計結果を表示 仕組みが・・・

    お世話になっています 質問No.9097443 及び 質問No.9089695 でご指導いただきました。 勉強時間を集計したシートA列:科目 B列:開始日 C列:開始時刻 D列:終了日 E列:終了時刻 の記載があるsheet1には終了時刻から開始時刻を差し引いた作業時間を表示する列がない。 sheet1に差引の作業時間列を追加することなく、別のシートで各科目の勉強時間を集計する方法を教えてもらいました。 レクチャー頂いた内容は ************************************************************************************* Sheet3のA列とB列を作業列として使用して、Sheet2に科目ごとの勉強時間の合計を集計するものとします。 Sheet3のA2セルに次の関数を入力して下さい。 =IF(INDEX(Sheet1!$A:$A,ROW())="","",IF(COUNTIF(Sheet1!$A$1:INDEX(Sheet1!$A:$A,ROW()),INDEX(Sheet1!$A:$A,ROW()))=1,ROW(),"")) Sheet3のB2セルに次の関数を入力して下さい。 =IF(OR(INDEX(Sheet1!$B:$B,ROW())="",INDEX(Sheet1!$C:$C,ROW())="",INDEX(Sheet1!$D:$D,ROW())="",INDEX(Sheet1!$E:$E,ROW())=""),"",IF(ISERROR(1/(YEAR(INDEX(Sheet1!$B:$B,ROW()))>1904)/(INDEX(Sheet1!$C:$C,ROW())+0>=0)/(INDEX(Sheet1!$C:$C,ROW())+0<1)/(YEAR(INDEX(Sheet1!$D:$D,ROW()))>1904)/(INDEX(Sheet1!$E:$E,ROW())+0>=0)/(INDEX(Sheet1!$E:$E,ROW())+0<1)),"",IFERROR(TEXT(INDEX(Sheet1!$D:$D,ROW())+INDEX(Sheet1!$E:$E,ROW())-INDEX(Sheet1!$B:$B,ROW())-INDEX(Sheet1!$C:$C,ROW()),"[h]:m:s")+0,""))) Sheet2のA2セルに次の関数を入力して下さい。 =IF(ROWS(A$1:A2)>COUNT(Sheet3!$A:$A),"",INDEX(Sheet1!$A:$A,SMALL(Sheet3!$A:$A,ROWS(A$1:A2)))) Sheet2のB2セルに次の関数を入力して下さい。 =IF($A2="","",TEXT(SUMIF(Sheet1!$A:$A,$A2,Sheet3!$B:$B),"[h]:m:s")+0) ************************************************************************************* 実践できたものの、仕組みが複雑でわかりません。 Sheet3のA2では、IF関数の中で、COUNTIF関数が使われていますが、なんのためなのかわかりません。 Sheet3のB2セルには関数の中に">1904"と数値の1904より大きい値を指定する関数が組み込まれたいますが、なんのためか理解できていません。 Sheet2のA2では、「Sheet2のA1:A2がSheet3のA列より大きい」という条件に適合しなかった場合、最小値を求める計算をしていますが、何のために行っているのかわかりません。 Sheet2のB2では、A2に適合しなかった場合、Sheet1のA列から何かを何かの条件に一致したものを合計して時間表示していますが、よくわかりません。 簡単でいいので、解説をお願いできませんでしょうか? すみません、理解力が乏しいもので申し訳ありませんが、よろしくお願い致します。

  • エクセル 関数式の応用

    こんにちは エクセル2010を使っています。 画像の様なデータがあって、次のような式を教えてもらいました。 =IFERROR(INDEX($B$1:$B$7,SMALL(IF($A$1:$A$7=C$1,ROW($A$1:$A$7)),ROW(A1))),"") 画像では A列 B列の データが7行目までなのですが、これを3万行まで広げようと次のような式に変更してみましたが上手く行きません。(空白が返される) =IFERROR(INDEX($B$1:$B$30000,SMALL(IF($A$1:$A$30000=C$1,ROW($A$1:$A$30000)),ROW(A1))),"") 詳しい方、教えていただけませんか? よろしくお願いします。

  • エクセル、毎回2づつ増えいくデーターの式?

    よろしくお願いいたします。エクセルで別表からA2、B2に ともに145行までデーターが入っていて、C1に各当するものをA列から引っ張ってくる式が下の数式です。 【=IF(ROWS($2:2)>COUNTIF($A:$A,$C$1),"",INDEX($B:$B,SUMPRODUCT(ROW($A$2:$A$145)*($A$2:$A$145=$C$1)*(COUNTIF(OFFSET($A$2,,,ROW($A$2:$A$145)-ROW($A$2)+1),$C$1)=ROWS($2:2))))) 】 行数が一定で、中だけ数値が変化する分にはいいんですが、毎回2行分データーが増えていきますので、毎回A145の式を147に変えて、手数がかかって、なんかいい式がないもんかとのお伺いなんです。 よろしくお願いいたします。

  • 別シートに勉強時間の集計結果が表示されない

    こんばんは。 http://okwave.jp/qa/q9089695.html 質問No.9089695 上記前回質問でお世話になりました。 勉強時間を集計したSheet1には Sheet1にA列:科目 B列:開始日 C列:開始時刻 D列:終了日 E列:終了時刻 の記載があります。 終了時刻から開始時刻を差し引いた作業時間を表示する列がありません。 頂いたアドバイスとして、 *********************************************************************************************************** Sheet3のA列とB列を作業列として使用して、Sheet2に科目ごとの勉強時間の合計を集計するものとします。 Sheet3のA2セルに次の関数を入力して下さい。 =IF(INDEX(Sheet1!$A:$A,ROW())="","",IF(COUNTIF(Sheet1!$A$1:INDEX(Sheet1!$A:$A,ROW()),INDEX(Sheet1!$A:$A,ROW()))=1,ROW(),"")) Sheet3のB2セルに次の関数を入力して下さい。 =IF(COUNT(INDEX(Sheet1!$B:$E,ROW(),))=4,IF(ISERROR(1/(INDEX(Sheet1!$B:$B,ROW())=TEXT(INDEX(Sheet1!$B:$B,ROW()),"yyyy/m/d")/(INDEX(Sheet1!$B:$B,ROW())>=1))/(INDEX(Sheet1!$C:$C,ROW())=TEXT(INDEX(Sheet1!$C:$C,ROW()),"h:m:s")+0)/(INDEX(Sheet1!$D:$D,ROW())=TEXT(INDEX(Sheet1!$D:$D,ROW()),"yyyy/m/d")/(INDEX(Sheet1!$D:$D,ROW())>=1))/(INDEX(Sheet1!$E:$E,ROW())=TEXT(INDEX(Sheet1!$E:$E,ROW()),"h:m:s")+0)),"",IFERROR(TEXT(SUM(INDEX(Sheet1!$D:$E,ROW(),))-SUM(INDEX(Sheet1!$B:$C,ROW(),)),"[h]:m:s")+0,"")),"") Sheet3のA2~B2セルをコピーして、Sheet3のA列~B列の3行目以下に貼り付けて下さい。 Sheet2のA2セルに次の関数を入力して下さい。 =IF(ROWS(A$1:A2)>COUNT(Sheet3!$A:$A),"",INDEX(Sheet1!$A:$A,SMALL(Sheet3!$A:$A,ROWS(A$1:A2))))。 Sheet2のB2セルに次の関数を入力して下さい。 =IF($A2="","",TEXT(SUMIF(Sheet1!$A:$A,$A2,Sheet3!$B:$B),"[h]:m:s")+0) *********************************************************************************************************** 上記のアドバイスを実行しましたが、項目は表示されましたが、時間が表示されません。 時間が表示されない理由はどんなことが考えられますか? よろしくお願い致します。

  • Excelのデータ種類の出力方法【再質問】

    Excelで、例えばA1から下に「あ」「い」「う」「あ」「い」「い」「う」「う」「う」とデータが入力されている状態で、(1)『この列には「あ」と「い」と「う」の3種類のデータがある』、(2)『「あ」は2個、「い」は3個、「う」は4個データがある』という2点を出力させる方法をご存知の方がいらっしゃいましたら宜しくお願い致します。 (1)については、以前、下の方法を教えていただき解決できたのですが。。。 A1から下に文字が入力されているとします。 B1に =IF(COUNTIF($A$1:A1,A1)=1,ROW(A1),"") C1に =IF(COUNT(B:B)<ROW(A1),"",INDEX(A:A,SMALL(B:B,ROW(A1))))

  • 別シートに勉強時間の集計 これに集計期間を指定

    お世話になっています 質問No.9097443 質問No.9089695  質問No.9104294でご指導いただきました。 ◎希望条件 勉強時間を集計したシートA列:科目 B列:開始日 C列:開始時刻 D列:終了日 E列:終了時刻 の記載があるsheet1には終了時刻から開始時刻を差し引いた作業時間を表示する列がない。 sheet1に差引の作業時間列を追加することなく、別のシートで各科目の勉強時間を集計する方法を教えてもらいました。 ************************************************************************************* ◎レクチャー頂いた内容は Sheet3のA列とB列を作業列として使用して、Sheet2に科目ごとの勉強時間の合計を集計するものとします。 Sheet3のA2セルに次の関数を入力して下さい。 =IF(INDEX(Sheet1!$A:$A,ROW())="","",IF(COUNTIF(Sheet1!$A$1:INDEX(Sheet1!$A:$A,ROW()),INDEX(Sheet1!$A:$A,ROW()))=1,ROW(),"")) Sheet3のB2セルに次の関数を入力して下さい。 =IF(OR(INDEX(Sheet1!$B:$B,ROW())="",INDEX(Sheet1!$C:$C,ROW())="",INDEX(Sheet1!$D:$D,ROW())="",INDEX(Sheet1!$E:$E,ROW())=""),"",IF(ISERROR(1/(YEAR(INDEX(Sheet1!$B:$B,ROW()))>1904)/(INDEX(Sheet1!$C:$C,ROW())+0>=0)/(INDEX(Sheet1!$C:$C,ROW())+0<1)/(YEAR(INDEX(Sheet1!$D:$D,ROW()))>1904)/(INDEX(Sheet1!$E:$E,ROW())+0>=0)/(INDEX(Sheet1!$E:$E,ROW())+0<1)),"",IFERROR(TEXT(INDEX(Sheet1!$D:$D,ROW())+INDEX(Sheet1!$E:$E,ROW())-INDEX(Sheet1!$B:$B,ROW())-INDEX(Sheet1!$C:$C,ROW()),"[h]:m:s")+0,""))) Sheet2のA2セルに次の関数を入力して下さい。 =IF(ROWS(A$1:A2)>COUNT(Sheet3!$A:$A),"",INDEX(Sheet1!$A:$A,SMALL(Sheet3!$A:$A,ROWS(A$1:A2)))) Sheet2のB2セルに次の関数を入力して下さい。 =IF($A2="","",TEXT(SUMIF(Sheet1!$A:$A,$A2,Sheet3!$B:$B),"[h]:m:s")+0) ************************************************************************************* ◎☆今回は、このシートに集計期間を設定したいのですが、 可能でしょうか。  上記のやり方だと、Sheet1の全ての日付の項目を集計してしまいます。  そこで、  D3に集計指定期間開始日  E3に集計指定期間終了日 を設定するなどしてできないでしょうか。  sheet!1に指定期間日を設定しないやり方でしたら、Sheet2でもSheet3にでもどちらでもいいのですが。  よろしくお願いします。

  • 該当月に同文字列が複数又は1つの時それぞれ一つ

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 参照図で説明します。 C1 =DATE(D1,E1,1) E1 に 9 を入力すると、 A列の中から9月に該当するIDを D2 : D6 のように抽出したいのですが どんな数式なのか御指導を仰ぎたいです。 よろしくお願いします。 参考に 下記で月毎の条件がないまでなんとかわかっているのですが B列 日付 I2 =IF(COUNTIF($B$2:B2,B2)=1,ROW(),"") L2 =IF(COUNT($I$1:$I$20)<ROW($A1),"",INDEX($B$1:$B$20,SMALL($I$1:$I$20,ROW($A1))))

  • INDEX関数を使用した関数の意味を教えてください。

    INDEX(sheet2!C:C,SMALL(INDEX((sheet2!$B$1:$B$100<>$B$18)*10^4+ROW($1:$100),),ROW(A1)))&"" sheet2にある表のB列に検索時に使用する文字列があり、sheet1のB18にその検索したい文字列を入力すると、一致したB列と同じ行のC列のデータを抽出する式です。 表のデータは今後も増加しますが、どの程度増加するは不明です。 INDEX関数やSMALL関数など一つ一つの関数の意味はわかっているつもりですが、なぜ上記のセルが選択されているのかわかりません。 特にSMALLの後の式がわかりません。 エクセル関数にはあまり詳しくないので、この式の意味をできれば詳しく教えていただけないでしょうか? (式の意味は人から聞いたものですが、違っていたらすいません)

このQ&Aのポイント
  • パソコンとプリンターを接続しようとした際にエラーが発生し、デバイスのダウンロードが完了しない場合、どのように対応すれば良いでしょうか?
  • パソコンと接続したプリンターの設定時にエラーが発生し、デバイスのダウンロードができない状況になった場合、どのように解決すれば良いのでしょうか?
  • プリンターとパソコンを接続したいが、エラーが起きてデバイスのダウンロードが完了しない場合、どのように対処すればいいですか?
回答を見る

専門家に質問してみよう