• 締切済み

エクセルで出来るんでしょうか?

下図の様のA列のデーターをB列に転記する際 C列で重複がないかをチェック、D列でB列に転記してない残りのNoを表示させる。 この様な作業を関数を使用できるものなのでしょうか?アドバイスお願いします。 できるんか、ぼけーレベルでしたらすみません;; 補足 ・B列には入力する順序規則はなし。 ・D列に表示する転記してないデーターの表示位置はD列ならどこに表示させてもかまいません。

みんなの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

>数式の意味が理解できず応用が効きそうではないです・・・  まず、 ROW() ですが、これは括弧内で指定した参照先のセルの行番号を求める関数で、この場合は括弧の中に参照先が指定されていないので、この関数が入力されているセルの行番号が返されます。  次に例えば、 INDEX($A:$A,ROW()) ですが、INDEX関数は INDEX(配列, 行番号, [列番号]) の形で表され、配列の部分で縦横に広がりのあるセル範囲を指定し、行番号の部分で、そのセル範囲の中の上から何番目であるかを指定し、列番号の部分で左から何番目であるかを指定する事で、配列の部分で指定したセル範囲の中にある、特定のセルに存在するデータを取り出す関数です。 INDEX($A:$A,ROW()) の場合は、配列で指定しているセル範囲は、縦方向に1列のみですから、列番号は指定する必要が無く、 $A:$A のセル範囲中で、上から数えて ROW() 番目のセルの値を返す関数となります。 $A:$A はA列の上端から下端までのセル範囲であり、 ROW() は関数が入力されているセルの行番号を返す関数なのですから、結局、 INDEX($A:$A,ROW()) は、その関数が入力されているセルと同じ行にある、A列のセルを参照する関数という事です。  それならば、例えば行番号が2のセルに入力する際に、A2と記述すれば良い様に思われるかも知れませんが、 御質問が重複チェックという事でしたので、重複したデータが存在するセルは削除されてしまう可能性があると予想しました。  そして、重複箇所を削除する際に、例えばA2セルをセルごと削除してしまいますと、A2セルが無くなり、元はA3セルだったセルがA2セルの位置に移動しますが、A2セルが消滅するため、関数で参照先を指定する際にA2と記述した場合には、その関数はエラーとなってしまいます。  又、参照先を指定する際にA2と記述した場合で、セルの切取りや挿入等の編集作業を行なうと、セルの位置関係が狂ってしまい、例えばA5セルのデータを変更したのに、その変更に反応したのはF6セルだった、という様な事が起こります。  これに対して、INDEX($A:$A,ROW())で指定した場合には、削除、切り取り、挿入等の編集作業を行なっても、必ずA列の 同じ行のセルを参照する事が出来ます。  ですから、F2セルの関数である =IF(INDEX($A:$A,ROW())="","",IF(COUNTIF($B:$B,INDEX($A:$A,ROW())),"",ROW())) は、動作上は =IF($A2="","",IF(COUNTIF($B:$B,$A2),"",ROW())) と同じ事ですが、元データに対して、削除、切り取り、挿入等の編集作業を行っても構わない関数という事です。  さて、 COUNTIF($B:$B,$A2) は、B列の中にA2と同じデータが幾つ存在しているかをカウントする関数です。  それが、IF関数の判定式の部分にあるのはどんな意味かと言いますと、IF関数では、判定式の部分の計算結果が数値の0の場合には、判定式が成り立っていないと見做し、判定式の部分の計算結果が0以外の数値の場合には、判定式が成り立っていると見做します。  つまり、 IF(COUNTIF($B:$B,$A2),"",ROW()) は、B列の中にA2と同じデータが1つでも存在している場合には何も表示せず、B列の中にA2と同じデータが無い場合には、関数が入力されているセルの行番号(この場合、F2セルに入力されている関数なので、行番号は2)を表示する関数となっています。  つまり、F列では、A列と同じデータが、B列中の何処にも存在していない場合(即ち、残りのNo.の場合)に、行番号が表示され、残りのNo.ではない場合には、何も表示されません。  又、 IF(INDEX($A:$A,ROW())="","", の部分は、動作上は IF($A2="","", と同じ事で、A列が空欄の場合には、何も表示しない様にする働きをしています。 次に、C2セルに入力する関数である =IF(INDEX($B:$B,ROW())="","",IF(COUNTIF($B$1:INDEX($B:$B,ROW()),INDEX($B:$B,ROW()))>1,"×","○")) は、 =IF($B2="","",IF(COUNTIF($B$1:$B2,$B2)>1,"×","○")) と同じ働きをします。 COUNTIF($B$1:$B2,$B2)>1 は、B列の、1番上から関数が入力されているのと同じ行までの間に、「関数が入力されているのと同じ行のB列のセル」と同じ値のセルが幾つあるかをカウントし、カウント結果が1を上回る(即ち、2個以上存在する)か否かを判定します。  ですから、 IF(COUNTIF($B$1:$B2,$B2)>1,"×","○") は、B列に同じ値が2つ以上存在している場合には×を表示し、1個以下しか存在しない(即ち、重複が無い)場合には○を表示する関数という事です。  最後に、D2セルに入力する関数である =IF(ROWS($2:2)>COUNT($F:$F),"",INDEX($A:$A,SMALL($F:$F,ROWS($2:2)))) ですが、この中で使われているROWS関数は、括弧内に指定されているセル範囲が何行あるのかという事を求める関数です。 ROWS($2:2) の部分では、括弧内にセル範囲$2:2が指定されていますが、これは2行目から2行目の範囲には、行が何行あるのかという事を求める関数となっています。  2行目から2行目の範囲には、行が1行だけ存在しますから、 ROWS($2:2) の部分は、数値の1を返す関数という事です。  この関数をD3セルにコピーしますと、$2:2の前半の$2の部分は絶対参照になっていますから変わりませんが、後半の2の部分は相対参照であるため、Excelの機能によって、3に書き換えられます。  すると、 ROWS($2:2) の部分は、 ROWS($2:3) に書き換えられますから、2行目から3行目の範囲には、行が何行あるのかという事を求める関数となり、計算結果は2となります。  この様に ROWS($2:2) の部分は、最初に関数を入力したD2セルから数えて、何行目に位置するのかという事を求める関数となっています。   そして、SMALL関数は、 SMALL(範囲, 順位) の形で表され、範囲の部分で指定されているセル範囲内に存在する数値の中で、「順位の部分で指定した数」番目に小さな数を求める関数です。   SMALL($F:$F,ROWS($2:2)) の部分では、範囲にはF列全体が指定されていて、順位には ROWS($2:2) という最初に関数を入力したD2セルから数えて、何行目に位置するのかという事を求める関数が入力されていますから、この関数をD2セルに入力した場合には、D2セルは、D2セルから数えて1行目に存在しますから、   SMALL($F:$F,ROWS($2:2)) の部分は、F列で1番小さな数値を返します。  これをD3セルにコピーしますと、   SMALL($F:$F,ROWS($2:3)) に書き換えられますから、F列で2番目に小さな数値を求める関数となります。  この様に、   SMALL($F:$F,ROWS($2:2)) の部分は、F列に存在する数値を小さい順に並べる関数となっています。  F列に入力されている関数は、残りのNo.の場合にのみ行番号を表示する関数なのですから、   SMALL($F:$F,ROWS($2:2)) の部分は、残りのNo.が存在する行の行番号を、小さい順に並べる事になります。  ですから、 INDEX($A:$A,SMALL($F:$F,ROWS($2:2))) の部分は、A列の中で、残りのNo.が存在する行に存在するセルの値を、行番号が小さい順に並べて表示する関数となります。  A列は元データであるNo.が入力されていますから、結局、 INDEX($A:$A,SMALL($F:$F,ROWS($2:2))) の部分は、残りのNo.を行番号が小さい順に並べて表示する関数となります。  そして、 COUNT($F:$F) は、F列の中で数値データが入っているセルの個数をカウントする関数ですから、 IF(ROWS($2:2)>COUNT($F:$F),"", の部分は、関数が入力されているセルにおいて、D2セルから数えた行数が、F列の中で数値データが入っているセルの個数を上回った場合には、何も表示させない様にしています。  このため、D列には残りのNo.だけが、上から順番に表示される事になります。

pb000
質問者

お礼

噛み砕いた説明もして頂きありがとうございました。 解説を読みながら数式を読み返すと納得でした。 答えを教えて頂いたうえに、ご指導までも・・・・(涙) 仕事をする上で入力ミス防止と作業性を考えた時、この数式を必要としてました。 感謝しています。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 作業列を設けると良い思います。  適当な使用していない列(ここでは仮にF列としますが、未使用の別のシートの列を作業列とすれば、余計な表示が見える事は無くなります)の2行目のセル(ここではF2セル)に次の数式を入力して下さい。 =IF(INDEX($A:$A,ROW())="","",IF(COUNTIF($B:$B,INDEX($A:$A,ROW())),"",ROW()))  次に、F2セルをコピーして、F3以下に貼り付けて下さい。  次に、C2セルに次の数式を入力して下さい。 =IF(INDEX($B:$B,ROW())="","",IF(COUNTIF($B$1:INDEX($B:$B,ROW()),INDEX($B:$B,ROW()))>1,"×","○"))  次に、D2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNT($F:$F),"",INDEX($A:$A,SMALL($F:$F,ROWS($2:2))))  次に、C2~D2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。  尚、もし、F列に余計な表示が現れて見苦しいと思われる場合には、F列全体を切り取ってから、適当な未使用のシートの適当な列の1行目のセル(例えば、Sheet2が未使用の場合には、Sheet2のA1セル等)を右クリックし、現れた選択肢の中にある[切り取ったセルの挿入]をクリックしますと、作業列がSheet2のA列に移動し、D2セルに入力した数式も、それに合わせて自動的に書き換わります。

pb000
質問者

お礼

遅くなって申し訳ありませんでした。 解決できてうれしい限りですが、数式の意味が理解できず応用が効きそうではないです・・・ 日々精進します。

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

ほぼCOUNTIF(範囲, 条件)関数だけで何とかなるような? C2だと、 C2:=IF(COUNTIF($A:$A, $B2)<=1, "○", "×") で、B2の数値をA列から探して数え上げて、重複が無い場合は1個か0個になるでしょうから、その場合は○とか。 D2だと、 C2:=IF(COUNTIF($B:$B, $A2)=0, $A2, "") で、A2の数値をB列から探して数え上げ、B列に無い場合は0になるでしょうから、その場合はA2の値を表示。

pb000
質問者

お礼

アドバイスありがとうございます。 しかし上記の式だとC列が全て○になってしまいます。 なにがおかしいくて○にななってしまうのか?を考えるのが私の宿題ですね。

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

関連するQ&A

  • エクセルIF関数について

    エクセルIF関数について エクセルのIF関数を利用して、重複するデータを抽出したいと思っています。 エクセルのIF関数を利用したことがないため、別の対応策があれば そちらも教えていただけませんでしょうか・・ 宜しくお願いいたします。 下記のようにA列に入っている1,2,3,4,5があり重複しているものをD列に一つにまとめ重複している1、5の合計分と重複していないものをEに表示させたいと思っています。     A  B     D   E 1  1  123    1  249 2  1  3      2  3 3  1  123    3  345 4  2  3      4  234 5  3  345    5  1665   6  4  234     7  5  555 8  5  555 9  5  555 D1、E1にはどのような関数で対応するのが適しているのでしょうか?

  • Excel VBAでピポットテーブルを作成していたらエラーがでて解決できません。

    こんばんは。 ExcelVBAで重複していないデータのみをSheet2に転記させたいのですが、どうしたらよいのでしょうか。 A行に重複するデータが入っいます。 A列の重複しないデータとB列に入っている名前を転記してマスタを作りたいと考えています。 A    B     12345  りんごA 12346  みかんB 12347  いちごC 12346  みかんB 宜しくお願い致します。

  • 【エクセル】抽出データを上に詰めて表示させたい。

    重複するデータを上に詰めて表示さセル方法が解らないです。 B列はA列の元データから重複分は表示しないようにしています。 C列はA列の元データから重複分の数を数えています。 │A │B    │C│ D │ 1│あああ │あああ │3│ 2│いいい │いいい │2│ 3│あああ │     │ │ 4│ええ  │ ええ  │2│ 5│おおお │おおお │1│ 6│ええ  │   │ │ 7│いいい │  │ │ 8│あああ │  │ │ 9│うううう│うううう│1│ ・ ・ 上記のような表で、A列が元データで、 B列にはセルB1から、=IF(COUNTIF($A$1:A1,A1)>1,"",A1)という関数を オートフィルで下まで伸ばしています。 C列は、=IF(COUNTIF($A$1:A1,A1)>1,"",COUNTIF($A$1:$A$100,A1))と いう関数を使用しています。 そこで、B列C列の何も表示されていないセルを詰めて、上に詰めて 表示させたいです。マクロは良くわからないのでなるべく関数で お願いします。ちなみに、今使用している関数も、こうしたほうが いいというのがありましたら。訂正してもらえると助かります。 解りづらいところがありましたら、補足します。 宜しくお願いします。

  • Excelの関数

    例えば、A1:A100にデータ(数字もしくは文字)があり、重複したデータがあった場合は、重複したデータをB列に表示するという関数はありますか。 うまく検索ができず、困っています。 わかりずらい文章ですいません。 宜しくお願いします。

  • Excelの日付の処理を教えてください。

     下図のように、B2→ 1985            C2→ 昭和60年と表示させています。             〔 C=DATE(B2,4,1) 〕4月1日の設定です。            D列は、数字を手作業で打ち込んでいます。        そこで、D列に数値でC列の年号の数値だけ表示する          関数式を教えてください。     

  • Excelで条件に合うデータをピックアップして合計を求めたい

    下記のような条件で合計を求めたいのですが、 SUM関数やSUMIF関数では、求めている合計が得られません。 例) 行/列 A   B    C  1|  No. 金額   氏名 2|  1  200,000  A 3|  1  200,000  B 4|  1  200,000  C 5|  2  150,000  A 6|  2  150,000  D 7|  3  180,000  B 8|  3  180,000  D 9|  3  180,000  E 10| 小計  上記のようなデータがあります。 B列には、Noごとに、それぞれ同じ金額が重複して入力してあります。 ここから、Noの最初の金額である200,000+150,000+180,000=530,000 という合計を10行目に求めたいのです。 現在は、自分でNoを確認しながら、その都度、 合計したいセルを選択して合計を求めているのですが、 データ数が多いため、何か別の方法がないかと思案しております。 どなたか、アドバイスの程、宜しくお願いします。

  • EXCEL VBA ポップアップを表示する方法

    ご質問させていただきます。 Sheet1のA2~A1701まで4桁の数字(各行で重複しない4桁の数字です)、 Sheet1のB2~B1701とSheet1のC2~C1701にはDDEで取り込んだリアルタイムデータ、 Sheet1のD2~D1701には、B2~B1701とC2~C1701のリアルタイムデータを使ってIF関数で条件判定をしてYESまたはNOを表示する関数式が入力されています。 やりたいことは、D列の条件判定でYESが表示された場合、YESが表示された行のA列の4桁の数字をポップアップで表示させることです。 このようなことはできるのでしょうか? メッセージボックスを使えば良いのかもしれませんが、当方VBA初心者のためメッセージボックスの使い方がよく分かりません。 どなたか教えていただけないでしょうか? よろしくお願いいたします。

  • エクセルでの集計

    A列に下記のようなデータが千件くらい入っています。 例:C-100/50/5/5   A-200/100/50/5   B-100/100/10/10   C-100/50/5/5   A-200/100/50/5   D-300/50/50       ・       ・ かなり重複もあります。 C列にA列のデータを以下の様に集計したいと思います。 例:A-200/100/50/5   B-100/100/10/10   C-100/50/5/5   D-300/50/50      ・      ・ 重複している場合は1行とし抜き出し、順番に集計したいのですが、 マクロか関数でする場合、どのような記述になるのでしょうか? よろしくお願いします。

  • エクセル 重複調べる

    エクセルの重複を調べる方法について何ですが、 a1,b1,c1に文字列が入っているのですが、 a1~c1の中に重複しているものが一つあったら(a1とc1が同じ、もしくはa1とb1が同じ、b1とc1が同じ)d1に1と表示して、重複無しだったら0と表示する関数はありますか?

  • エクセル関数について教えてください!!

    エクセル関数について教えてください!! エクセルファイルに以下のようなデータがあります。 A列 B列 C列 あ  A10 100  あ  A10 110 あ  B10 120 い  C10 100 い  D10 100 う  E10 100 あ  B10 120 い  C10 100 A列:販売店 B列:コード C列:売り上げ金額 (合計8000件程度) 販売店毎での売り上げ金額を求めたいのですが、B列のコードが重複しています。 販売店+重複コードは1つに纏めての金額を求める関数を教えていただけますでしょうか。 イメージ あ  A10 210 あ  B10 240 い  C10 200 い  D10 100 う  E10 100 よろしくお願いしますm(_ _)m

専門家に質問してみよう