• ベストアンサー

エクセルマクロで重複数値と以外の数値を抽出する

数値の表を作成しておりますが、 重複数値で困っております。マクロで教えてください。 A列11~20まで1.2.2.4.5.6.6.8.9.10とあるデータに 2と6が重複しています 重複数値2.6をB列2行目以降に、C列2行目以降にはそれ以外の1.4.5.8.9.10 を抽出したいのですが、マクロで教えてください。 (offsetを使ってできますか?) また、重複数値を抽出する自作関数ってできるでしょうか? よろしくお願いいたします。

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

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

こんばんは! 既存のワークシート関数でやってみました。 ↓の画像のように作業用の列を設けています。 作業列E2セルに =IF(AND(COUNTIF(A$11:A$20,A11)>1,COUNTIF(A$11:A11,A11)=1),ROW(A1),"") という数式を入れ、元データの行数分(10行)下へコピー! そしてB2セルに =IFERROR(INDEX(A$11:A$20,SMALL(E$2:E$11,ROW(A1))),"") C2セルに =IFERROR(INDEX(A$11:A$20,SMALL(IF(COUNTIF(A$11:A$20,A$11:A$20)=1,ROW(A$1:A$10)),ROW(A1))),"") ※ C2セルは配列数式になりますので、Ctrl+Shift+Enterで確定! この画面からコピー&ペーストする場合、 上記数式をドラッグ&コピー → C2セルを選択 → 数式バー内に貼り付け → そのまま(編集可能なまま) Ctrl+Shiftキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。 最後にB2・C2セルを選択 → C2セルのフィルハンドルで下へコピー! これで画像のような感じになります。 ※ 作業列の「2」と「6」はデータそのものではなく、 INDEX関数で範囲指定した行番号です。 尚、質問のタイトルが「マクロで!」というコトですので、ついでにVBAでの一例です。 シートモジュールにしてみてください。(当然のことながら作業列は不要です) Sub Sample1() Dim i As Long, c As Range Range("B2:C11").ClearContents For i = 11 To 20 '←A列11行目~20行目まで If WorksheetFunction.CountIf(Range("A11:A20"), Cells(i, "A")) > 1 Then Set c = Range("B:B").Find(what:=Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole) If c Is Nothing Then Cells(Rows.Count, "B").End(xlUp).Offset(1) = Cells(i, "A") End If Else Cells(Rows.Count, "C").End(xlUp).Offset(1) = Cells(i, "A") End If Next i End Sub こんな感じではどうでしょうか?m(_ _)m

wind14
質問者

お礼

tom04様 ご丁寧にご説明いただきましてありがとうございました。 感激。目からウロコでした。助かりました。 丁寧な解説で、だんだん解読できるようになりました。 まだまだ学習中ですので、またご質問させていただきますが、 よろしくお願いします。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

Microsoft Queryを追加インストールしてSQL投げる。 「外部データの取込」とあるが、EXCELへも接続できる SelectでCOUNTとって、HAVINGで識別 重複アリは>1だし、重複ナシは=1を捨えばOK これをVBAで記述

参考URL:
http://office.microsoft.com/ja-jp/excel-help/HA010099664.aspx
wind14
質問者

お礼

ご回答ありがとうございました。このような機能があることを初めて知りました勉強になります。 と同時にExcelの万能さに感動しております。まだまだ学習不足なので、またご質問させていただきますが、 よろしくお願いいたします。

関連するQ&A

  • エクセルで重複しないものだけを抽出したい

    下記のようなデータがあります。 A B C D 1 20 30 40 1 20 32 41 1 20 30 49 1 20 81 39 2 20 76 40 2 20 32 41 2 20 30 49 3 20 81 39 3 20 39 40 3 20 32 41 4 20 30 49 4 20 81 98 このうち、列Aの他と重複しない部分であり、かつ先頭行を抽出するにはどのようにしたらよいでしょうか? 上記の例で言うと、列Aの1から4までのそれぞれ1行目を選ぶという作業です。 抽出後 A B C D 1 20 30 40 2 20 76 40 3 20 81 39 4 20 30 49 vlookupなどの関数でできるのでしょうか?教えてもらえたらうれしいです。お願いします。

  • 重複データの抽出

    重複した数字のデータを抽出してまとめたいのですが教えていただけないでしょうか? 例えば A列    B列   1245     1365     1245 1398 1365 1155 1245 この表を      A列    B列   1245    1245 1365    1365 1245    1398 1398    1155 1365 1155 1245 のようにまとめたい A列の重複したデータを抽出しB列にまとめたいのですが、なるべく関数でやりたいのですが、良い方法をお願いいたします。

  • エクセルのマクロを知りたい

    エクセルで,たくさんのデータが入力された【シートa】があります。 新しく【シートb】を作成して,そこに空白の表(1)~(10)までを作成します。 (ちなみに表(1)は1行から始まり100行まで,表(2)は101行から始まり200行まで・・・・といった感じです) 【シートb】の表(1)には,【シートa】でA列に「1」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。同様に,表(2)には,【シートa】でA列に「2」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。・・・というのを表(10)まで続けます。 上記のような命令をボタン一つで操作できるようなマクロを教えて欲しいのです。 お願いします。

  • エクセルのマクロで重複データの削除

    横17列、縦、約1000行の表があります。 4行目が項目で、5行目以降は次のように並んでいます。 A列(日付)、B列~H列(各データ) I列(契約番号)J列~Q列(各データ) 縦の並び順は、ばらばらで、日付順ではありません。しかも結構重複があります。 そこで、I列の商品番号をキーにして、重複をチェックし、重複しているものは、日付が新しいものを生かし、古い方は削除しようと思います。 しかし、手作業でやるにはあまりに多すぎるため、出来ればマクロでやりたいのですが、このように高度なものは、わたしが出来るマクロの記録程度では手におえそうもありません。 どのようにやったらよいのかどなたかお教え願えませんでしょうか?

  • 重複するデータの抽出について(エクセル)

    エクセル2003にて重複するデータの取り出しをしたいのですが、 わからないので教えてください。 例えば   A列   B列   C列    D列    E列・・・ 1  色  1回目  2回目  3回目   4回目 2  赤   あ    a      A       0 3  白   い    b      B       1 4  黄   う    c      C       2 5  黄   え    d      D       3 6  黒   お    e      E       4 7  赤   か    f      F       5 : このデータの中から、別のシートのA1に 赤と入力したら、B1にD列のA・Fを抽出 黄と入力したら、B1にD列のC・Dを抽出をしたいです。 VLOOKUP関数を使用してみたのですが、 赤と入力すると、D列のA(1番上のデータ)のみしか抽出出来ず、Fが抽出されません。 重複するデータがあるのはA列のみで、D列には重複するデータはありません。 わかりにくい文章ですみませんが、よろしくお願いします。

  • エクセルで、データのある行だけを抽出したい。

    エクセルのSheet1にデータが入っており、セルが空白でない行のデータのみを、Sheet2に抽出したいと思っています。 Sheet2にあらかじめ関数を入れておく方法にしたいため、関数について教えてください。 タイムテーブルで予定を管理するような表で、A~Hまでにデータが入っています。 予定を入れる際にはE列には必ず入力をするため、E列が空白でない行のみを抽出したいです。 A|B|C|D|E|F|G|H 月|日|時間|… 11|22|10:00|… 11|22|10:30|… 時間枠は10:00~17:00の30分刻みで、1日15行使用するので、1年で5475行まで使用します。 1行目はタイトル行なので、データは2行目から入力しています。 フィルタオプションで抽出する方法や、それをマクロで登録しておく方法は分かったのですが、あとから予定を追加することがあるため、マクロを実行する度にデータが置き換わると困ってしまいます。 また、抽出したSheet2のI列以降には備考などを入力したいため、やはり後から列がずれると困るため、A~H列に関数を入れておく方法で実行したいと思います。 よろしくお願いいたします。

  • エクセル 指定の数値範囲を条件に抽出する関数マクロ

    表1があり、A列に氏名、B~E列に2桁の数値データが入っています。この中で検索値XXの{-3~+3}の範囲内に該当する数値を抽出したいです(検索値が33なら、30~36内の数字)。該当する数値をフォントやセルに色をつけて分かるようにできれば一番いいですが、できない場合は、該当するデータを含む人の氏名を表2に表示するとか、該当する人のF列に○印をつけるとかでもよいです。実際にはたくさんの違う検索値を使って抽出操作が必要になるので、フィルタオプションとかでやるのは面倒です。関数でもマクロでも良いので簡単な方法を教えてください。

  • excelの複数シートを検索対象にして重複行を抽出する方法

    ある値が重複する行を抽出したいのですが 抽出元データが600,000行近くあり、1sheetに入らず9シート程に分けました。 countifを使おうとしたのですが検索範囲に複数シート指定が出来ず(3D-参照の対象関数ではないようです)、 =COUNTIF('sheet1:sheet9'!$C:$C,C1)としてみたのですが、重複行があっても全て#VALUE!となってしまうので機能できていないようです。 具体的には sheet1~8に下記のようなデータがあり、C列が重複する行を抽出したい。 A列:id、B列:名前、C列:メアド、D列:xx 宜しくお願い致します。

  • Excelのオートフィルタでデータ抽出するマクロについて

    オートフィルタで指定した期間のデータ抽出のマクロを作成しているのですが上手くいきません。 例えばA列に 10月29日 11月1日 11月3日 11月5日 と日付を入力しており、B列、C列にデータを入力していたとして D列1行目に10月31日、D列2行目に11月4日と入力し D列1行目からD列2行目までと指定したデータを抽出するマクロを教えていただけませんか。 マクロ初心者で、困っております。どうかよろしく御願いします。

  • エクセル 行内の重複する数値

    よろしくお願いします1列の中で重複する数値の削除は データーから重複の削除で可能ですが 表全体では無理でしょうか。 表の中の重複する数値またはセルを 空白にするもしくは削除したいのですが・・・ また A1からS1までのように1行の中にある重複する数値を削除する方法はありませんか Win10 Office2010です