Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
2段階の並び替え(ソート)について教えてください。
投稿日時: 21/05/28 16:21:06
投稿者: まま88

初心者で、どうしても分かりませんのでアドバイスをいただけないでしょうか。結論として、並び替え後の順番にソートできるようにしたいと思っております。
 
特にクラス全体をソートする方法ことが考え付きませんでした。
 
どうぞよろしくお願いいたします。
 
 
●前提
・クラスはAA〜DDまでの4つ
・生徒数は15名
・順位は足の速さ
 
●並び変えの条件
@クラスの一番足の速い人をそのクラスの代表とし、クラスごとにで順位を並び替え。
 
A且つ、クラス内でも順位を昇順に並び替え
 
 
●並び替え前           ●並び替え後    
順位    クラス        → 順位 クラス
07    AA        →        01    CC
06    AA        →        02    CC
08    AA        →        13    CC
11    BB        →        03    BB
12    BB        →        04    BB
03    BB        →        11    BB
04    BB        →        12    BB
01    CC        →        05    DD
02    CC        →        09    DD
13    CC        →        10    DD
15    DD        →        14    DD
05    DD        →        15    DD
09    DD        →        06    AA
10    DD        →        07    AA
14    DD        →        08    AA
 

回答
投稿日時: 21/05/28 17:44:49
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

●並び変えの条件
@クラスの一番足の速い人をそのクラスの代表とし、クラスごとにで順位を並び替え。
A且つ、クラス内でも順位を昇順に並び替え
 

この説明からsると
クラスごとに足の速い順に並べ替える
ということになるので、
説明の「後」の表は違うのではないでしょうか?
説明の「後」の表は、早い順位並べてあるだけです。
条件通りに、並べるとしたら
第1キー:クラス
第2キー:順位
となるのでは?
@Aは、並べ替えということでは、同じことですよね?
代表者を抽出することは別になります。
クラス内で、同タイムになると、1位は複数存在することになるが・・・・
どのように考えるのですか?
 
>特にクラス全体をソートする
これは、どのような意味ですか?
 
 
 
なお、なぜVBAで対応しようとしているんですか?
 
一般機能の並べ替えで充分対応できると思いますが・・・

回答
投稿日時: 21/05/28 17:49:02
投稿者: WinArrow
投稿者のウェブサイトに移動

疑問
 
並べ替え後の表について
 
どのような考え方をすると
このような表になるのでしょうか?

回答
投稿日時: 21/05/28 18:38:16
投稿者: simple

VBAでも出来ると思いますが、ワークシート関数とソートの組み合わせでできると思います。
 
(1)MINIFS関数を使って、そのクラスの「所属員の順位最小値」を求めます。(作業列に)
   例えば、こんな式で。
   =MINIFS($A$2:$A$16,$B$2:$B$16,B2) (範囲は修正ください。)
(2)・第1優先キーをその作業列のキー(昇順)
   ・第2優先キーを、各人の「順位」
   としてソートします。
 
(繰り返し実行するなら、マクロ記録とってマクロにすればよいと思います。)

回答
投稿日時: 21/05/28 18:45:29
投稿者: sk

引用:
@クラスの一番足の速い人をそのクラスの代表とし、

1. クラスごとに[順位]の値が最小である者を 1 人ずつピックアップする。
 
----------------------------------------
順位	クラス
----------------------------------------
07	AA
06	AA	←AA代表者
08	AA
11	BB
12	BB
03	BB	←BB代表者
04	BB
01	CC	←CC代表者
02	CC
13	CC
15	DD
05	DD	←DD代表者
09	DD
10	DD
14	DD
----------------------------------------

引用:
クラスごとにで順位を並び替え。

2. 1 でピックアップされた者同士を対象に、[順位]の昇順で
   それぞれ順位をつける(代表者同士でクラス対抗レースをさせる)。
 
----------------------------------------
順位	クラス	クラス対抗レース順位
----------------------------------------
06	AA	4
03	BB	2
01	CC	1
05	DD	3
----------------------------------------

引用:
A且つ、クラス内でも順位を昇順に並び替え

3. 2 で求めた順位(クラス対抗レースの結果)をクラス単位で
   (代表者およびその者と同じクラスに属する者全員に)適用する。
 
----------------------------------------
順位	クラス	クラス対抗レース順位
----------------------------------------
07	AA	4
06	AA	4
08	AA	4
11	BB	2
12	BB	2
03	BB	2
04	BB	2
01	CC	1
02	CC	1
13	CC	1
15	DD	3
05	DD	3
09	DD	3
10	DD	3
14	DD	3
----------------------------------------

4. 全データを[クラス対抗レース順位]の昇順、[順位]の昇順に並べ替える。
 
----------------------------------------
順位	クラス	クラス対抗レース順位
----------------------------------------
01	CC	1
02	CC	1
13	CC	1
03	BB	2
04	BB	2
11	BB	2
12	BB	2
15	DD	3
05	DD	3
09	DD	3
10	DD	3
14	DD	3
06	AA	4
07	AA	4
08	AA	4
----------------------------------------

 
普通に読めばこういうことでしょうね。
 
引用:
特にクラス全体をソートする方法ことが考え付きませんでした。

・実際のワークシート上に格納されているのは
 例示された表のデータが全てであるか。
 (表タイトルなどの余計なセルが含まれていないか)
 
・作業列を使用することが可能か(使用してもよいのか)。
 
・ACE を使用できる環境であるか。
 
以上のような条件等によるのではないでしょうか。

回答
投稿日時: 21/05/28 18:49:44
投稿者: simple

順位が文字列なら、数値に変換して下さい。(Copyして、0を加算の貼付とか)

回答
投稿日時: 21/05/28 18:51:31
投稿者: sk

訂正:
 
15 位の人の行位置がずれてました。
 

----------------------------------------
順位	クラス	クラス対抗レース順位
----------------------------------------
01	CC	1
02	CC	1
13	CC	1
03	BB	2
04	BB	2
11	BB	2
12	BB	2
05	DD	3
09	DD	3
10	DD	3
14	DD	3
15	DD	3
06	AA	4
07	AA	4
08	AA	4
----------------------------------------

回答
投稿日時: 21/05/29 15:02:23
投稿者: mattuwan44

引用:
●並び変えの条件
@クラスの一番足の速い人をそのクラスの代表とし、クラスごとにで順位を並び替え。
  
A且つ、クラス内でも順位を昇順に並び替え

 
Excelの操作的には、
1)順位の列を選択→昇順で並び替え
2)クラスの列選択→昇順で並び替え
 
となると思います。例示の例はふんわりのイメージですよね?

回答
投稿日時: 21/05/30 10:58:47
投稿者: simple

私の案を図解するとこうです。

順位	クラス	作業列		順位	クラス	作業列
 7	AA	6	→	 1	CC	1
 6	AA	6	→	 2	CC	1
 8	AA	6	→	13	CC	1
11	BB	3	→	 3	BB	3
12	BB	3	→	 4	BB	3
 3	BB	3	→	11	BB	3
 4	BB	3	→	12	BB	3
 1	CC	1	→	 5	DD	5
 2	CC	1	→	 9	DD	5
13	CC	1	→	10	DD	5
15	DD	5	→	14	DD	5
 5	DD	5	→	15	DD	5
 9	DD	5	→	 6	AA	6
10	DD	5	→	 7	AA	6
14	DD	5	→	 8	AA	6
						
		↑追加	     ↑第2優先        ↑第1優先
			       キー		キー

投稿日時: 21/05/31 11:14:17
投稿者: まま88

WinArrow さんの引用:
疑問
 
並べ替え後の表について
 
どのような考え方をすると
このような表になるのでしょうか?

 
 
 
WinArrow様ありがとうございます。
私の説明が分かりづらく申し訳ありません。
私がお伝えしたかったのはsk様がご説明いただいた通りです。
第1キー:クラスで並び替えすると、AAが一番上に来てしまいますので、
意図とは違う結果になってしまします。

投稿日時: 21/05/31 12:39:07
投稿者: まま88

simple さんの引用:
私の案を図解するとこうです。
順位	クラス	作業列		順位	クラス	作業列
 7	AA	6	→	 1	CC	1
 6	AA	6	→	 2	CC	1
 8	AA	6	→	13	CC	1
11	BB	3	→	 3	BB	3
12	BB	3	→	 4	BB	3
 3	BB	3	→	11	BB	3
 4	BB	3	→	12	BB	3
 1	CC	1	→	 5	DD	5
 2	CC	1	→	 9	DD	5
13	CC	1	→	10	DD	5
15	DD	5	→	14	DD	5
 5	DD	5	→	15	DD	5
 9	DD	5	→	 6	AA	6
10	DD	5	→	 7	AA	6
14	DD	5	→	 8	AA	6
						
		↑追加	     ↑第2優先        ↑第1優先
			       キー		キー

 
 simple様ありがとうございました。
MINIFS関数を使い、教えて頂いた手順で並び替えができました!
本当にありがとうございました!