出産前後の痔にはご注意!

表題の質問をさせていただきます。よろしくお願いいたします。

A列には商品名 B列には販売数があるとします。
商品には一回しか出てこない物や何度も出てくるものがあります。

そこで、販売数が最大値のみの重複しない商品データにする方法をお聞きしたいのです。
できれば非表示的な処理ではなく不要行削除が望ましいです。

例 下の場合
りんご 3(重複商品の最大値)
みかん 5(単独商品)
りんご 1
バナナ 6(単独商品)
りんご 2
イチゴ 2(重複商品の最大値)
イチゴ 1

↓にしたいのです。
りんご 3
みかん 5
バナナ 6
イチゴ 2

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

No2 merlionXXです。


myDic自身が配列だったのでもっと簡潔な書き方が出来ました。
ご参考のため各コードにコメントも付けておきました。

Sub test02()
Dim myDic As Object '変数宣言
Dim c As Range '変数宣言
Set myDic = CreateObject("Scripting.Dictionary") 'myDicを用意
For Each c In Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp)) 'A列の各データについて
If Not myDic.exists(c.Value) Then 'myDicになければ
myDic.Add c.Value, c.Offset(0, 1).Value '追加しB列データを結びつける
Else 'myDicにあれば
myDic(c.Value) = IIf(myDic(c.Value) < c.Offset(0, 1).Value, c.Offset(0, 1).Value, myDic(c.Value)) 'B列データの大きい方を結びつける
End If
Next c '繰り返し
Set ns = Worksheets.Add(After:=ActiveSheet) 'シートを追加
ns.Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Keys) 'A列にデータ
ns.Range("B1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Items) 'B列に結びつけデータ
Set myDic = Nothing
Set ns = Nothing
End Sub
    • good
    • 2
この回答へのお礼

お返事ありがとうございます。

前日のお礼時に書いた内容までは、まだ解決できていないのですが、当初質問させていただいた内容については無事に解決いたしております。
時間が掛かると申し訳ないので、いちど締め切らせていただこうと思います。
この度は本当にありがとうございました。

お礼日時:2009/03/16 20:31

VBAで行う一例です。



別シートを作成し、そこに抽出します。

Sub test02()
Dim myDic As Object
Dim c As Range
Dim myKey(), myItem()
Set myDic = CreateObject("Scripting.Dictionary")
For Each c In Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp))
If Not myDic.exists(c.Value) Then
myDic.Add c.Value, c.Offset(0, 1).Value
Else
myDic(c.Value) = IIf(myDic(c.Value) < c.Offset(0, 1).Value, c.Offset(0, 1).Value, myDic(c.Value))
End If
Next c
myKey() = myDic.Keys
myItem() = myDic.Items
' MsgBox Join(myKey()) & Join(myItem())
Set ns = Worksheets.Add(After:=ActiveSheet)
ns.Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myKey())
ns.Range("B1").Resize(myDic.Count, 1).Value = Application.Transpose(myItem())
Set ns = Nothing
End Sub
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

早速 試させていただき無事に動作が出来まして、今は勉強しながら既存シートへの上書きへの変更や商品名がA列に無いときなどの場合の実験をしているところでした。(ともに うまくできました)

するとお礼をする前に次のお返事が入っており感激しているところです。
しかも、コードの解説付きで大感謝です。
さらに、参考にさせていただきながら改造をしてみようと思っております。
のちほど追加の質問をさせていただこうと思いますので もしよろしければご教授の程よろしくお願いいたします。

ちなみに現在、格闘中の部分は 実際には列がたくさんあるので A・B以上の列の場合と 最大値がB列に無い場合への改造を試しております。

お礼日時:2009/03/15 13:12

案1


フィルタオプションの設定で重複レコードを削除し
配列数式で計算
=MAX(IF($A$2:$A$8=D2,$B$2:$B$8))
コピー&値の貼り付け

案2
ピボットテーブル案の最大値

案3
並べ替えて 集計を最大値で
は非表示なので没ですね
「エクセル 最大値データのある行のみを残し」の回答画像1
    • good
    • 1
この回答へのお礼

お返事いただきありがとうございます。

全て試させていただいたところ、案1が良さそうだったのですけど なかなか同じ動作が出来ずに いろいろと やっていたところ ご提案を参考にさせていただきながら以下の方法で解決できました。

商品名を第一優先で販売数を降順で並べ替えておく。
フィルタオプションの設定を選択範囲にしました。

すると どうにか思っていた結果に結びつけることが出来ました。
この度はありがとうございました、今後ともよろしくお願いいたします。

お礼日時:2009/03/15 08:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelで最大値の入っている数値の右側にある項目名を拾いたい。

Excelで最大値の入っている数値の右側にある項目名を拾いたい。

下のようなデータがあります。(A列は年、Bは何かの生産量・・とします)

1 2000 7
2 2001 11
3 2002 14
4 2003 10
5 2004 9
6 2005 8

生産量(B列)の最大値を求めるのは=MAX(B1:B7)で"14"が得られると思いますが、求めているのは"14"の入っている年の"2002"という数字を隣のC1に入れたいと思います。
どのような関数が必要でしょうか?

Aベストアンサー

こんばんは!
一例です。

↓の画像でC2セルに表示するようになりますが・・・

C2セルの数式は
=INDEX($A$2:$A$1000,MATCH(MAX(B2:B1000),B2:B1000,0))
にしています。
(エラー処理はしていません)
A列の1000行目まで対応できるようにしていますが、
データ量によって範囲指定の領域はアレンジしてみてください。

以上、参考になれば幸いです。m(__)m

QEXCELの重複データから最大と合計を抽出する方法

現在EXCELで顧客の受注データの管理をしています。
リストは購入日毎の入力になっている為、同じ顧客が複数回注文した場合、データが複数存在します(例 Aさんが1/3、2/4、3/5に注文した場合、Aさんの名前で3つのデータが存在する)。

このデータの中から、Aさんのように購入データが複数存在する人を抽出した上で
(1)抽出した人それぞれの注文データの最大購入額
(2)抽出した人それぞれの注文データの合計購入額
の両方が分かる数式を探しています・・・

そんな便利な数式があるかどうかも分かりませんが、どなたか詳しい方がいらっしゃったら
教えて頂きたいと思います。
よろしくお願い致します。

Aベストアンサー

B列(B2セル以下)に名前が入力されていて複数回出現する人だけの一覧を作成するなら以下のような関数で表示できます。

=INDEX(B:B,SMALL(INDEX(((COUNTIF($B$2:$B$100,$B$2:$B$100)=1)+(MATCH($B$2:$B$100&"",$B$2:$B$100&"",0)<>ROW($B$2:$B$100)-1))*1000+ROW($B$2:$B$100),),ROW(A1)))&""

C列に金額が入力されているなら、その最大値は以下の式になります(F2セル以下に上記の関数を入力した場合)。
=IF(F2="","",MAX(INDEX(($B$2:$B$100=F2)*$C$2:$C$100,)))

合計は以下の式です。
=IF(F2="","",SUMIF($B$2:$B$100,F2,$C$2:$C$100))

Q最大値のあるセルの行番号のみを求めたいです。

エクセル2000を使用しています。
OSはXP HOMEです。
よろしくお願いします。

下のようになっているとします。
そこで二つの質問をさせていただきます。



    A        B    C
1    13
2    10
3    64
4    50
5    12

B5にA1:A5の最大値の行番号を表示させるには関数を用いてどのようにあらわせばよいでしょうか?
※上記の例ですとB5には「3」が表示されるはずです。

また、C5にはA1:A5の最大値が示されているセルの行番号からどれだけ隔たりがあるかを表示させたいと思います。
※上記の例ですとC5の行番号は「5」最大値のセルはA3ですので、行番号は「3」。
「5-3=2」となりC5には2が表示されるはずです。


お分かりの方がいらっしゃいましたらお願い申し上げます。

Aベストアンサー

B5の式は
=MATCH(MAX(A1:A5),A1:A5,0)
でしょうね。

QエクセルのMAX関数を複数条件で

エクセルのMAX関数を下記のような複数条件をつけて
使いたいのですが、自分で式を書いてもうまくいきません。
アドバイスをよろしくお願いします。

A1に「部署名」、B1に「受注個数」、C1に「受注日」と見出しをし
(A2:C9)にデータを入力した表があるとします。
部署名には営業1部、営業2部、営業3部のいずれかが入力されていて、
受注日には6月22日と、6月23日のいずれかの入力があるとします。
この表で「営業1部」であり、「6月22日」のものである受注個数の
最大の値を返したいのです。
日付「6月22日」は別途(E2)に参照用として入力したものを使いたいです。

=MAX(IF(AND(A2:A9="営業1部",C2:C9=E2),B2:B9,""))

これではダメでしょうか。
初歩的ですみません、よろしくお願いいたします。

Aベストアンサー

DMAX関数を使うことで、可能です。
(配列数式を使う方法もありますが、他にも流用したいという要望もあるようですので
 こちらのほうがよいでしょう)

DMAX(Database,フィールド,Criteria)
http://excel.onushi.com/function/dmax.htm

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

Qエクセルで重複しているデータの抽出のしかたを教えてください。

エクセルで重複しているデータを抽出したいのですが・・。なにぶん初心者なもので簡単な方法があればよいのですが・・。
A列に日付 B列に企業名このデータが300件ほどあります。

 Å列      B列
1月 1日    AAAA社
1月 4日   BBBB社
1月 8日   CCCC社
2月 1日   BBBB社
2月20日    DDDD社
3月 2日   AAAA社

と、あるとしてB列の企業名が重複しているものを抽出したいのですが・・・。この場合 AAAA社とBBBB社ですが。
これを簡単に抽出する方法はないでしょうか?
教えてください お願いいたします。

Aベストアンサー

企業名がセルB2からセルB300まで入力されていると仮定します。
セルC2に IF(COUNTIF($B$2:B2,B2)>1,"*","") を入力し、セルC300までコピーして下さい。すると重複したデータの二番目以降に "*" のマークが付きます。
(注) 数式を下のセルまでコピーするため、COUNTIF($B$2 は絶対参照にして下さい。

QMAXIFはどうすればいい?

AVERAGEIFはありますが、maxでほしいのです。どうやって作れますか?

詳細:
B列が「あ」のデータだけ抜き出し、A列のmax値を得たいのです。
A    B
1   あ
2   い
4   あ
8   え
15  い
この例ではmax値は4です。

Aベストアンサー

>MAXIFはどうすればいい?
MAX関数の括弧内(配列)を前処理しなければなりません。
前処理の数式=(B1:B5="あ")*A1:A5
従って、=MAX(B1:B5="あ")*A1:A5 → MAX({1;0;4;0;0}) → 4
Excelでは計算結果を配列で返すことを要する数式を入力時にCtrlとShiftを押しながらEnterキーを打鍵することになっています。
確定した状態を数式バーで見ると{=MAX(B1:B5="あ")*A1:A5}のように数式を大括弧で括られています。

SUMPRODUCT関数の引数としてMAX関数の返り値を設定するとEnterキーで確定しても目的通りの値が返ります。
=SUMPRODUCT(MAX((B1:B5="あ")*A1:A5))
どのような数式を使っても結果が目的に合えば良いのでお好きな方法で解決してください。

QExcel > ピボットテーブル「(空白)」非表示

Excel 2003 で、ピボットテーブルを利用した際、元データにて未入力のセルは、ピボットテーブルでは「(空白)」と表示されてしまいます。

これを、任意の文字列や、空白のまま表示(「(空白)」を非表示)にする方法はありますか?

空白セルそのものを非表示する方法は、ピボットタイトル行の▼で「(空白)」をチェックオフすれば消えますが、これでは関係する行の他列も非表示になってしまいます。

ただ「(空白)」ではく、空白のまま表示したいだけなのですが、その方法が分かりません。

宜しくお願い致します。

Aベストアンサー

ピボットテーブルの行や列フィールドの「アイテム」(個々の「あ」や「い」,「A」「B」「1・2・3」,「(空白)」も同じ)は,作成したピボットテーブルの中で「(アイテムの)キャッシュ」として保持されています。
実際今回の「(空白)」だけでなく,たとえば列Bフィールドのアイテム「1」1セルを「1個」と書き換えてみると,レポート上のアイテム1が全部1個と表記されます。
レポートで行列アイテムを直接書き換えることで,キャッシュの中で「元データの1 = アイテム表記は1個」というデータを保持し,以後それを使って表示してくれるためです。


#余談ですが,たとえば「四半期」で日付をグループ化すると,エクセルでは1月から3月が第1四半期として集計されます。
これを日本の四月からの会計年度に合わせて「1-3月」は第4四半期に,そして「4-6月」を第1四半期として集計させたいような場合にも,この方法を利用することができます。

Qエクセル 最新データのみを表示させたい場合

エクセルに、名前と来訪日がのったシートがあったとします。
その名前の最終来訪日のみを表示させる、関数等はございますでしょうか?

   A列  B列 
1 佐藤 2008/10/5
2 鈴木 2008/1/20
3 上田 2008/5/25
4 鈴木 2008/9/15
5 小野 2008/3/7
6 上田 2008/2/3
7 佐藤 2008/10/16
8 鈴木 2008/11/13
9 佐藤 2008/9/8
    ・
    ・
    ・
シンプルに見えて、意外と難しく私の知識では対応できませんでした。
お手数ですが、お知恵をいただけますと幸いです。

Aベストアンサー

並べ替えてもいいのかな
1. タイトル行を設け
2. データ-並べ替え
 最優先 名前 : 昇順(降順)
 2番目 日付 : 昇順(降順)
3. [OK]

1. データ - 集計
 グループの基準 名前
 集計の方法 最大値
2. [OK]

3. [2]をクリック

QExcel MATCH関数で検索範囲内に同じ値の検索値が複数ある場合

MATCH関数で、検索した値が複数ある場合に1つしか出なくて困っています。
(例)
   A B C D
1 年月日 種類 番号 備考
2 4月1日 肉類 1
3 4月2日 野菜 2
4 4月3日 肉類 1
5 4月4日 果物 2
6 4月5日 野菜 1
7 4月6日 果物 3
8 4月7日 果物 2
9 4月8日 肉類 1

この表で、D9の備考の欄に「種類:肉類、番号:1」と同じものがあった時の日付を、新しい日付で取り出したいのです。

INDEX(A2:A8,(MATCH(B9,B2:B8,0)+MATCH(C9,C2:C8,0))/2)
としたのですが、本当は4月3日を取り出したいのですが、4月1日が出てきます。
どのようにしたら良いでしょうか?
Excel2003です。
よろしくお願いします。

Aベストアンサー

MATCH関数を使用しませんが、D9の書式を日付にして、
=MAX((A2:A8)*(C2:C8=1)*(B2:B8="肉類"))
と、入力してShift+Ctrl+Enterキーで入力完了してみてください(配列式になります)。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング