解決済みの質問
エクセルでのデータの表示
次のような表が在ります。
A列 B列
100 2
100 2
101 6
101 2
101 6
102 6
102 6
103 2
103 2
103 2
104 6
104 2
・ ・
・ ・
・ ・
これを、次のように、C列に「◎」と「×」を表示させるようにするには、どのようにすれば可いですか?
つまり、「A列のナンバーが重複していて、且つ、B列の数字が異なる二種類の場合は、C列に◎」、「A列のナンバーが重複していて、B列の数字は一種類の場合は、Cれつに×」と表示させたいのです。
A列 B列 C列
100 2 ×
100 2 ×
101 6 ◎
101 2 ◎
101 6 ◎
102 6 ×
102 6 ×
103 2 ×
103 2 ×
103 2 ×
104 6 ◎
104 2 ◎
・ ・ ・
・ ・ ・
宜しくお願い致します。
投稿日時 - 2010-02-05 19:14:02
こんにちは。 FarEyesです。
#2の数式がお役に立てたようで、こちらとしても幸いです。
#2の補足内容について、お答え致します。
1.キャプチャー映像のデータの件について
> それと、キャプチャー映像の中で、一つ、気になることがありました。14行の「101」「3」「◎」のこと
> なんですが、既述のように、今回の例示の場合、B列の数字データは、常に、「2」と「6」のみで、
> それ以外の数字データが使われることはありません。そして、キャプチャー画面では、14行に於いて、
> 「101」「3」「◎」という結果が表示されています。
> この部分だけは、わたしの希望の仕様とは異なる結果なので、困惑しています。
> A列の「101」は、既に、「A1~A3」で出ており、また、14行辺りでは重複はしていず、それなのに、
> C列に「◎」がついています。
> これは、どのように考えれば宜しいのでしょうか?
#2の添付画像での、14行目のC列が"◎"になっている理由は、
A列のデータが重複していて、
※ここでいう重複とは、連続行ではなく、行が離れていても同じ値だった場合は
重複としています。
かつ、B列のデータの種類の数が、『2種類以上』
※つまり、2種類でも、3種類でも同一の条件ということです。
の条件に該当するからです。
A列のデータは101ですので、これは、以下のように、A3~A5のデータ(=101)
と重複しています。
※行が離れていても、A列の値は同じなので、重複としています。
A列 B列
3 101 6
4 101 2
5 101 6
: : :
14 101 3
そして、このA列の値が同じ値になっている行の、B列のデータの種類は、
6、 2、 3
の3種類となります。
そして、数式では、A列のデータが同じものについて、B列のデータが
『2種類以上』
の場合に、"◎"を表示するようになっていますので、結果として、
A列 B列 C列
3 101 6 ◎
4 101 2 ◎
5 101 6 ◎
: : : :
14 101 3 ◎
上記のように、3行目~5行目と、14行目のC列は、"◎"になっている
ということです。
言い換えますと、3行目~5行目のC列が、"◎"になっているのは、
B列のデータが『2種類』のために、 "◎"になっている
のではなく、
B列のデータが『2種類以上』のために、"◎"になっている
ということです。
ですので、14行目のデータも、同一条件になるため、"◎"になっています。
2.空白データの件について
> >>◆1)A列、または、B列のセルが空白の場合 → 空白
>
> なお、上の件ですが、「空白」ということは、決して、ありません。
> それを勘案した場合、ご教示頂いた式から、「空白」に関する部分を削除することはできますか?
> それが可能でしたら、より一層、式が簡潔になりますので、その「空白」に関する部分だけ、削除
> したいのですが・・・。
#2の数式から、「空白」の処理を削除するだけなら、
=IF(SUMPRODUCT((A$1:A$20=A1)*(B$1:B$20<>B1))>0,"◎","×")
という数式になります。
ただし、この場合もしも、A列、または、B列のデータに空白があった場合、
空白もひとつの「データ」として扱われますので、
そのパターン(A列のみ空白、B列のみ空白、両方空白)及び、B列のデータ
によって、C列には、"◎"が表示されたり、"×"が表示されることになります。
3.下記の件について
> >>◆だとした場合で、さらに確認なのですが、
> 1)A列のデータが重複していない場合(=単独の値だった場合)
> 2)A列のデータが重複していて、かつ、B列のデータの種類が『3種類以上』
> だった場合
> については、それぞれどう表示すれば良いのでしょうか?
>
> 1)については、「×」で結構です。
> 2)については、現在のところ、「2種類」のみを扱っていますが、近い将来、「3種類」の数字データ
> をも扱う予定が在ります。「3種類」で、「3種類以上」ということは、決して、ありません。
> もし、宜しければ、この場合のも式も、ご提示・ご教示頂けると、大変、有り難いです。
> これは、「近い将来(多分、来月辺り)」のことで、急ぎません。お時間に余裕の有る時で結構です
> ので、宜しくお願い致します。
>
前項1.で述べたように、#2の数式では、『2種類以上』の場合に"◎"を表示
するようにしていますので、#2の数式を使用した場合は、『3種類』の場合でも、
"◎"が表示されることになります。
もしも、「2種類」の場合と、「3種類」の場合とで、C列の表示パターンを別々に
したい場合は、#2の数式(これと似たような数式も含む)では対応できません。
これを、ワークシート関数のみで行うには、ピボットテーブルの使用とか、配列
数式などの応用及び組合せ、または、作業用セルの使用等を行う必要がある
と思います。
申し訳ありませんが、当方は、ピボットテーブルとか、配列数式の応用とかには、
あまり詳しくなく、良い数式が思い浮かびません。(すみません)
しかし、代替案として、VBA(マクロ)による『ユーザー関数』を作ってみました。
以下の手順で、下記のマクロを、Excelブックに追加して下さい。
■マクロ(ユーザー関数)の追加手順
1)Excelブックを開いて、「Visual Basic Editor」(VBE)を起動して下さい。
注)現在使用しているExcelブックにマクロを追加する場合は、一旦、別名で保存
しておいて下さい。(マクロ追加前のバージョンを残しておきます。)
2)「VBA Project」に、「標準モジュール」を追加して下さい。
3)追加した「標準モジュール」のコード画面に、以下のマクロを貼り付けて下さい。
4)マクロ追加後は、念の為、コンパイルを行って、エラーがないか確認して下さい。
5)マクロ追加後は、Excelブックを、一旦保存して下さい。
■マクロ(ユーザー関数)
/////↓ここから//////////////////////////////////////////////////
'===============================================================
'関数名: GetPatern
'機 能: 特定条件のデータ種類のパターン取得
'引 数: ByRef rngArea As Range
' ・検索対象のセル範囲(Rangeオブジェクト)
' セル範囲の1列目が第1の検索範囲、2列目が第2の検索範囲
' ByVal vCmpKey As Variant
' ・検索キー(1列目の検索キー)
'戻り値: Variant
' ・種類パターン別の識別文字
' ="×":1列目のデータが複数かつ2列目のデータが1種類のみ
' または、
' 1列目のデータが単独
' ="◎":1列目のデータが複数かつ2列目のデータが2種類のみ
' ="△":1列目のデータが複数かつ2列目のデータが3種類以上
' =空白:上記以外(1列目or2列目が空白の場合)
'===============================================================
Function GetPatern(ByRef rngArea As Range, _
ByVal vCmpKey As Variant) As Variant
Dim i As Long '汎用ループ変数
Dim cnt As Long '汎用カウンタ
Dim nRowMax As Long '行数取得用
Dim vDicKey As Variant 'パターン辞書のキー
Dim objDic As Object 'パターン辞書のオブジェクト
'検索対象のセル範囲が2列未満の場合は戻る
If rngArea.Columns.Count < 2 Then
GetPatern = ""
Exit Function
End If
'パターン判定用の辞書オブジェクトを作成
Set objDic = CreateObject("Scripting.Dictionary")
'パターン辞書を初期化
objDic.RemoveAll
objDic.CompareMode = vbTextCompare
'== パターン辞書に種類パターンを登録 ==
nRowMax = rngArea.Rows.Count '検索セル範囲の行数取得
cnt = 0 '1列目データの一致カウンタをクリア
For i = 1 To nRowMax
'セルが空白でなく、かつ、1列目データが一致?
If Trim(rngArea(i, 1).Text) <> "" And _
Trim(rngArea(i, 2).Text) <> "" And _
rngArea(i, 1).Value = vCmpKey Then
cnt = cnt + 1 '1列目データの一致カウンタを+1
'2列目データをパターン辞書に登録&更新
vDicKey = rngArea(i, 2).Value
objDic.Item(vDicKey) = objDic.Item(vDicKey) + 1
End If
Next
'== 種類パターン別の識別文字を戻り値にセット ==
If cnt > 1 Then
'1列目データが重複の場合のパターン判定
Select Case objDic.Count
Case 1 'パターン種類が1種類
GetPatern = "×"
Case 2 'パターン種類が2種類
GetPatern = "◎"
Case Else 'パターン種類が3種類以上
GetPatern = "△"
End Select
ElseIf cnt = 1 Then
GetPatern = "×" '単独データの場合
Else
GetPatern = "" '空白データの場合
End If
'パターン辞書のオブジェクトを解放
objDic.RemoveAll
Set objDic = Nothing
End Function
/////↑ここまで//////////////////////////////////////////////////
上記マクロの追加後、下記のように、ワークシートに数式を設定します。
※下記は、#2で例に上げたワークシート構成の場合の設定例です。
C1セルに以下の数式を設定します。
=GetPatern($A$1:$B$20,A1)
C列の他のセルには、C1セルの数式をコピーして下さい。
■マクロ(ユーザー関数)の補足
1)関数の引数について
・1番目の引数には、A列+B列のセル範囲(=セルアドレス)を
指定して下さい。
注)アドレスは、「絶対参照」形式のアドレスを指定して下さい。
・2番目の引数には、その行のA列のセル(=セルアドレス)を
指定して下さい。
関数には、指定セルの値が渡されます。
注)アドレスは、「相対参照」形式のアドレスを指定して下さい。
2)関数の処理について
この関数では、
1. A列のデータが重複していて、かつ、
B列のデータの種類の数が「1種類のみ」の場合 → "×"
2. A列のデータが重複していて、かつ、
B列のデータの種類の数が「2種類のみ」の場合 → "◎"
3. A列のデータが重複していて、かつ、
B列のデータの種類の数が「3種類以上」の場合 → "△"
4. A列のデータが単独(重複なし)の場合 → "×"
5. 上記以外の場合 → 空白
・これは、『A列、または、B列のセルが空白の場合』
に該当します。
をそれぞれ表示するようにしています。
3)上記2)の「判定条件」及び「表示パターン」を変更する場合
「判定条件」及び「表示パターン」を変更する場合は、マクロ内の下記部分
の「条件式」及び「表示文字」を希望のものになるように変更して下さい。
'== 種類パターン別の識別文字を戻り値にセット ==
If cnt > 1 Then
'1列目データが重複の場合のパターン判定
Select Case objDic.Count
Case 1 'パターン種類が1種類
GetPatern = "×"
Case 2 'パターン種類が2種類
GetPatern = "◎"
Case Else 'パターン種類が3種類以上
GetPatern = "△"
End Select
ElseIf cnt = 1 Then
GetPatern = "×" '単独データの場合
Else
GetPatern = "" '空白データの場合
End If
<上記部分の各変数の意味・内容>
◎変数 cnt の値は、A列のデータの重複個数になっています。
[cntの値] [A列データの状態]
0 A列、または、B列のセルが空白のとき
1 A列のデータが単独(重複なし)の時
2以上 A列のデータが重複ありで、それが2行以上(2箇所以上)ある
◎変数 objDic.Count の値は、B列のデータの種類の数になっています。
この値は、A列のデータが重複しているものについてセットされます。
[objDic.Countの値] [B列のデータの種類]
1 1種類のみ
2 2種類のみ
3以上 3種類以上
◎変数 GetPatern には、この関数の戻り値(=C列に表示される文字)
をセットします。
※添付画像は、上記マクロを実装したExcelシートのキャプチャ画像です。
■参考サイト
Excel VBAの操作、マクロの構文などについては、下記サイトが参考になるかと
思います。 宜しければ、ご覧になってみて下さい。
Excelでお仕事!「VBA基本」
http://www.asahi-net.or.jp/~ef2o-inue/menu/menu04.html
Excel(エクセル)VBA入門:目次
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/index.html
以上です。
投稿日時 - 2010-02-08 03:47:45
お礼
大変、詳しく説明して頂き、ありがとうございます。
お陰さまで、解決致しました。
返事が大幅に遅れましたことを、深く、お詫びいたします。
申し訳ありません。
投稿日時 - 2011-03-29 18:22:10
2人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(4件中 1~4件目)
解決に向かってそうですね。。
・・・もう必要ないかも知れないですが、質問に答えます。
>そのまま、「2」「6」としてはダメなんですか?
そのままでもOKです。
実験過程でいろいろやっていくなかでそーなっちゃったんですけど。。。
結局、数字でもOKでした。。
またB列の順序もソートしてますが、こちらもソートしてなくても大丈夫でした。
>各列には、上の式ををそのまま入れて実行すればいいのですか?
そうです。
あと頑張れば、作業用の列を減らすまたは無くすことも可能かと思います。。。
投稿日時 - 2010-02-09 00:35:45
お礼
たびたびのご回答、ありがとうございます。
お陰さまで、解決致しました。
お礼がこれほどに遅くなりましたことを、深く、お詫び致します。
申し訳ありません。
投稿日時 - 2011-03-29 18:25:34
こんにちは。 #2です。
すみません。解釈違いをしていたようです。
仰っている条件を確認しますと、
A列のデータが重複しているものについて、
B列のデータの種類の数が1種類の場合 → "×"
B列のデータの種類の数が2種類の場合 → "◎"
をC列に表示するということでしょうか?
だとした場合で、さらに確認なのですが、
1)A列のデータが重複していない場合(=単独の値だった場合)
2)A列のデータが重複していて、かつ、B列のデータの種類が『3種類以上』
だった場合
については、それぞれどう表示すれば良いのでしょうか?
暫定案ですが、以下の数式ではどうでしょう?
注)データが、1行目~20行目まであった場合とします。
=IF(OR(A1="",B1=""),"",IF(SUMPRODUCT((A$1:A$20=A1)*(B$1:B$20<>B1))>0,
"◎","×"))
・上記は、C1セルに設定する数式です。
・上記は、表示の都合上2行で記述していますが、実際は1行で入力して下さい。
・C列の他のセルには、C1セルの数式をコピーして下さい。
上記数式は、
1)A列、または、B列のセルが空白の場合 → 空白
2)A列のデータが重複していて、かつ、
B列のデータの種類の数が「2種類以上」の場合 → "◎"
3)上記以外の場合 → "×"
これには、
・A列のデータが重複していない場合
・A列のデータが重複していて、かつ、B列のデータの種類の数が1種類の場合
が含まれます。
を表示するようにしています。
※少し、条件を簡略化してみました。
※添付画像は、上記数式を設定したExcelシートのキャプチャ画像です。
以上です。
ご希望のものでなかった場合はすみません。
投稿日時 - 2010-02-07 11:18:07
補足
先ほど、ご教示頂いた式を試してみましたところ、見事に、希望通りの結果が出ました。
ありがとうございました。
ついては、補足説明、補足質問と、新たな要望を書かせてください。
>>◆A列のデータが重複しているものについて、
B列のデータの種類の数が1種類の場合 → "×"
B列のデータの種類の数が2種類の場合 → "◎"
をC列に表示するということでしょうか?
その通りです。
>>◆だとした場合で、さらに確認なのですが、
1)A列のデータが重複していない場合(=単独の値だった場合)
2)A列のデータが重複していて、かつ、B列のデータの種類が『3種類以上』
だった場合
については、それぞれどう表示すれば良いのでしょうか?
1)については、「×」で結構です。
2)については、現在のところ、「2種類」のみを扱っていますが、近い将来、「3種類」の数字データをも扱う予定が在ります。「3種類」で、「3種類以上」ということは、決して、ありません。
もし、宜しければ、この場合のも式も、ご提示・ご教示頂けると、大変、有り難いです。
これは、「近い将来(多分、来月辺り)」のことで、急ぎません。お時間に余裕の有る時で結構ですので、宜しくお願い致します。
>>◆1)A列、または、B列のセルが空白の場合 → 空白
なお、上の件ですが、「空白」ということは、決して、ありません。
それを勘案した場合、ご教示頂いた式から、「空白」に関する部分を削除することはできますか?
それが可能でしたら、より一層、式が簡潔になりますので、その「空白」に関する部分だけ、削除したいのですが・・・。
それと、キャプチャー映像の中で、一つ、気になることがありました。14行の「101」「3」「◎」のことなんですが、既述のように、今回の例示の場合、B列の数字データは、常に、「2」と「6」のみで、それ以外の数字データが使われることはありません。そして、キャプチャー画面では、14行に於いて、「101」「3」「◎」という結果が表示されています。
この部分だけは、わたしの希望の仕様とは異なる結果なので、困惑しています。
A列の「101」は、既に、「A1~A3」で出ており、また、14行辺りでは重複はしていず、それなのに、C列に「◎」がついています。
これは、どのように考えれば宜しいのでしょうか?
なお、くどいようですが、ご教示頂いた式を、わたしの希望通りのデータで試してみた結果は、上々でした。
このまま、使えるとは思いますが、上の件、少し、気になっています。
お手数ですが、ご説明を、宜しくお願い致します。
投稿日時 - 2010-02-07 21:35:32
お礼
先ほどの補足質問の文言中に、間違いが在りましたので、訂正します。
末尾の文言中の、「A101~A103」は間違いで、正しくは、「A103~A105」でした。
済みません。
投稿日時 - 2010-02-07 21:43:15
こんにちは。
以下、見当違いだった場合はすみません。
まず、確認ですが、ご提示の条件だとした場合、
> 101 6 ◎
> 101 2 ◎
> 101 6 ◎
上記の提示例の「A列=101、B列=6」の行は、
> 「A列のナンバーが重複していて、B列の数字は一種類の場合は、Cれつに×」
に該当すると思いますので、以下のように"◎"ではなく、"×"になるのではないで
しょうか?
101 6 ×
101 2 ◎
101 6 ×
さて、問題の対処法ですが、以下は設定の一例です。
多少、数式が長くなってしまいましたが、「IF、SUMPRODUCT、COUNTIF」の各関数の
組合せで数式を作ってみました。
前提として、A1:B20のセル範囲に、参照するデータが入力してあったとします。
C1のセルに以下の数式を入力します。
=IF(OR(A1="",B1=""),"",IF(SUMPRODUCT((A$1:A$20=A1)*(B$1:B$20=B1))>1,"×",
IF(COUNTIF(A$1:A$20,"="&A1)>1,"◎","○")))
注)上記は、表示の都合上2行で記述していますが、実際は1行で記述して下さい。
C列の2行目以降のセルには、C1セルを選択して、マウス操作でオートフィルにより、
下方向にドラッグして数式をコピーして下さい。
注)罫線などの書式を設定してある場合は、「形式を選択して貼り付け」で「数式」を
選択してコピーして下さい。
<数式の簡単な説明>
1)A列、または、B列のセルが空白の場合は、空白を表示する。
IF(OR(A1="",B1=""),""
の部分です。
2)「A列で値が一致する」かつ「B列で値が一致する」セルの個数が2個以上なら、
"×"を表示する。
IF(SUMPRODUCT((A$1:A$20=A1)*(B$1:B$20=B1))>1,"×"
の部分です。
ご提示の記述で言うと、
> 「A列のナンバーが重複していて、B列の数字は一種類の場合は、Cれつに×」
に該当します。
3)上記1)、2)以外の場合で、「A列で値が一致する」セルの個数が2個以上なら、
"◎"を表示する。
IF(COUNTIF(A$1:A$20,"="&A1)>1,"◎"
の部分です。
ご提示の記述で言うと、
> 「A列のナンバーが重複していて、且つ、B列の数字が異なる二種類の場合は、
> C列に◎」
に該当します。
4)上記以外の場合(=A列で一致するものがない場合)は、"○"を表示する。
数式の最後の
,"○"
の部分です。
これは、ご提示の条件にはありませんが追加してみました。
この条件を言い換えると、
「A列のナンバーが重複していない場合」(=単独のナンバーの場合)
となります。
※添付画像は、上記数式を設定したExcelシートのキャプチャ画像です。
以上です。参考になれば幸いです。
投稿日時 - 2010-02-06 11:43:22
補足
丁寧なご回答、ありがとうございます。
お尋ねの件について、補足説明をさせて頂きます。
101 6 ×
101 2 ◎
101 6 ×
ご覧のように、A列は、「101」が重複しており、それに対応するB列は、3つの数字が在りますが、種類は、「2」と「6」で、「二種類」になります。
それゆえ、この「2」と「6」には、全て、「◎」を付ける・・・。
こういう風にしたい訳です。
A列に対応するB列の数字が、「2」のみ、とか、「6」のみとかいう風に、一種類でしたら、常に「×」にする訳です。
FarEyesさんのご教示なされた方法は、No.1さんの方法よりも簡潔で、使い勝手が良さそうですので、是非、上記の補足説明に添う形で、修正された式を改めてご教示頂けると、とても助かります。
お手数ですが、宜しくお願い致します。
投稿日時 - 2010-02-06 23:18:03
エクセル式でやるということですよね。
まだ最適化してないですけど、できました。
(前提条件)
・A列、B列 でソートされていること (A列は絶対だけど、B列は大丈夫かも)
・B列の種類は2と6のみであること
・文字列としたかったので語尾にA列はa,B列はbを付加 (今のところ)
各列の式
C2 =IF(D2=0,C3,IF(AND(H2,I2),"◎","×"))
D2 =IF(A2=A3,0,1)
F2 =IF(F$1=$B2,1,0)
G2 =IF(G$1=$B2,1,0)
H2 =IF($D1=0,IF(OR(H1,F2),1,0),F2)
I2 =IF($D1=0,IF(OR(I1,G2),1,0),G2)
F1 = 2b
G1 = 6b
イメージは添付の画像を参照ください。
(自分でやる場合は、ピボットやマクロでやってしまいますが、、、)
(なかなかの難問、面白かったです)
投稿日時 - 2010-02-06 02:31:34
補足
早速のご回答、ありがとうございます。
これから試してみますが、補足質問をさせてください。
「2」を「2b」に、「6」を「6b」に書き替えておられますが、そのまま、「2」「6」としてはダメなんですか?
それと、例示では、「2」と「6」の二種類の数字を用いていますが、この数字は、その都度、いろいろに替わります。
「3」と「7」とか、「1」と5」とか、「2」と4」とか・・・。
その場合、「F1」と「G1」に、「2b」と「6b」の代わりに、「3b」「7b」、「1b」「5b」、「2b」「4b」などの文字列を入れ、各列には、上の式ををそのまま入れて実行すればいいのですか?
投稿日時 - 2010-02-06 23:07:18
OKWaveのオススメ
おすすめリンク