- 締切済み
Excelでデータ リスト内の縦のセルの比較
Excelでグループ毎の縦のセルの比較 マクロにせず実現することはできますでしょうか。 A列 B列 C列 ------------------------ 1 A みかん ○ 2 A みかん ○ 3 B りんご ○ 4 B ぱなな × 5 B りんご ○ 6 C ばなな ○ 7 C ばなな ○ 8 D なし ○ 9 D いちご × 10 F いちご ○ 11 F いちご ○ 上記のようなA列B列の表のシートがあるのですが、 A列のグループ毎にB列同士を比較します。 比較は、グループ内で、一番最初の値を基準として比較し、 基準となった値は、”○”とし、他は、一致したかしないかで ”○”と”×”をC列に表示します。 例でいうと A列のA1~A2は同じAなので、 B1は、最初なので”○”、B2は、B1と同じなので”○” A列のA3~A5は同じBなので、 B3は、最初なので”○”、B4は、B3と違うので”×”、B5は、B3と同じなので”○” とやりたいのですが、 マクロを使わすに関数の組み合わせで実現することはできます でしょうか。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
作業列を使わない方法はないか、一晩考えた。しかし今朝、確認すると、#1のご回答と実質は同じであった。 なぜ、Match関数が使われるかの理由でも記しておくので参考にしてください。 MATCH関数やVLOOOKUP関数は、その列で出現した最初の行のデータしか指し示さない。普通はこれで困ることも多いが、今回はそれを逆手に取る発想です。 例データ A2:C12 C列は本件関数の結果。 A列 B列 C列 A みかん 〇 A みかん 〇 B りんご 〇 B ぱなな x B りんご 〇 C ばなな 〇 C ばなな 〇 D なし 〇 D いちご x F いちご 〇 F いちご 〇 C2セルの関数式 =IF(B2=INDEX($B$2:$B$12,MATCH(A2,$A$2:$A$12,0),1),"〇","x") 下方向に式を複写。 今考えているA列の語句について、A列で出た語句の最初の行のB列と、いま考えている行のB列が一致したら〇という意味の式になる。
- SI299792
- ベストアンサー率47% (772/1616)
C1: =IFERROR(IF(VLOOKUP(A1,A:B,2,0)=B1,"○","×"),"") 下へコピペ。 既にに回答は上がっていますが、このようなやり方もあります。 データが増えた時の事を考えれば、範囲は指定しない方がいいです。 OFFSETは揮発性関数。使わなくていいなら使わない方がいいとされています。(私もよく使いますが) https://blueclearblog.com/excelvolatilefunctions/
お礼
ありがとうございます。 OFFSETを使わない点がよいかと 教えて頂いた方法で実現できました。
- imogasi
- ベストアンサー率27% (4737/17069)
既出の#1のご回答には、作業列を使う点で、及びませんが、何とか別回答がないか 考えました。 データ例 A2:D12 C,D列は下記回答式の結果を先取りして掲出したもので、当初はありません。 A列 B列 C列 D列 A みかん 1 〇 A みかん 1 〇 B りんご 3 〇 B ぱなな 3 x B りんご 3 〇 C ばなな 6 〇 C ばなな 6 〇 D なし 8 〇 D いちご 8 x F いちご 10 〇 F いちご 10 〇 ーーー C2に式 =IF(COUNTIF($A$2:$A2,A2)=1,ROW()-1,C1】を入れる。作業列です。 意味は、A列の区分の先頭(上行から見て最初)出現行を各行に出している保持。 下方向に式を複写。結果は上記C列。 ー D2に式 =IF(B2=OFFSET(B$1,C2,0,1,1),"〇","x") 下方向に式を複写。結果は上記D列。
お礼
ありがとうございます。 作業列を作る処理が増えてますが、 OFFSETとでの範囲指定が楽になったようなきがします。 教えて頂いた方法で実現できました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No.1の修正 OFFSET(A1,0,1) は単に B1で良かった =IF(B1="","",IF(OFFSET($A$1,MATCH(A1,$A$1:$A$20,0)-1,1)=B1,"○","×"))
お礼
ありがとうございます。 こちらの訂正の方でも 教えて頂いた方法で実現できました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
C1に以下の式を入れて下にコピーして試してみてください。 とりあえず範囲はA1からA20までにしてます。 =IF(B1="","",IF(OFFSET($A$1,MATCH(A1,$A$1:$A$20,0)-1,1)=OFFSET(A1,0,1),"○","×"))
お礼
ありがとうございます。 範囲指定しないいけないと思いついたのですが、 その関数がでてきませんでいた。 OFFSETを使うのですね。 ですが、範囲指定は付きまとってきます。 教えて頂いた方法で実現できました。
お礼
ありがとうございます。 matchやindexは使用したことがありますが、 確かに、最初の行のデータしか指し示さなので 普通はこれで困ることがありました。 今回はそれを逆手に取る発想ですか。 その発想にはおよびませんでいた。 教えた頂いた方法で実現できました。