[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『クラブ希望調査表(上位から決定)』(しーたけ)
過去ログ「20070730142309」の(弥太郎)さんのマクロを試してみました。
[[20070730142309]] 『クラブの希望調査表』(fuki)
このマクロで学年を同じにした場合、各クラブの定員まで、まず第1希望で埋めて、 まだ定員未満の場合第2希望、第3希望で埋めていく結果になりました。 希望順(列優先)>並び順(行優先)
私の希望は、上位(行番号の低い順)から、決定していく方法です。 第1希望が定員超過なら第2希望で検討、第2希望も超過なら第3希望、 第3希望まですべて超過なら未決定として、次の順位(次の行)に移るというものです。 希望順(列優先)<並び順(行優先)
過去ログのように、学年で優先する必要はありません(単純に、優先順位で並べます)
過去ログのマクロを改良すればいいのでしょうが、力不足で先に進みません。
追加機能として、第1から第3希望のどれで決定したか、一目でわかるように、 決定したクラブ(過去ログの回答では、C〜E列)にもセルに色を付けたいです。
以上、2点について、教えていただけますでしょうか? よろしくお願いします。
Excel2007/Windows Vista
弥太郎さんのデータ形式をそのまま借用しました。 A列に名前、B列に学年、C、D、E列に希望 2行目以降にデータ H1以降にクラブ名、H2以降に定員
クラブ名は完全に一致しないと対象となりません(前後に余計なスペースがあったり 「ー」が「―」だったりはNG)。 希望のクラブがなかった場合はクラブ名が、 クラブの定員に漏れてしまった氏名が赤になります。
Sub 希望通り() Dim clubNum As Object Set clubNum = CreateObject("Scripting.Dictionary")
Dim c As Long Dim mxCol As Long mxCol = Cells(1, Columns.Count).End(xlToLeft).Column For c = 8 To mxCol clubNum.Add Cells(1, c).Value, CInt(Cells(2, c).Value) Next
Dim r As Long Dim mxRow As Long
mxRow = Cells(Rows.Count, 1).End(xlUp).Row Range("H3").Resize(Rows.Count - 2, mxCol).Clear Range("A2").Resize(mxRow - 1, 1).Interior.ColorIndex = 3 Range("B2").Resize(mxRow - 1, 5).Interior.ColorIndex = 2 Range("A1").Resize(mxRow, 5).Borders.LineStyle = xlContinuous
For c = 3 To 5 For r = 2 To mxRow If clubNum.exists(Cells(r, c).Value) Then If Cells(r, 1).Interior.ColorIndex = 3 Then If clubNum.Item(Cells(r, c).Value) > 0 Then Cells(r, 1).Interior.ColorIndex = 2 Cells(r, c).Interior.ColorIndex = 35 With Range("H1").Resize(1, mxCol - 7).Find(Cells(r, c).Value, lookat:=xlWhole) Cells(Cells(Rows.Count, .Column).End(xlUp).Row + 1, .Column) = Cells(r, 1).Value End With clubNum.Item(Cells(r, c).Value) = clubNum.Item(Cells(r, c).Value) - 1 End If End If Else Cells(r, c).Interior.ColorIndex = 3 End If Next Next End Sub
後から思いましたが、学年の列を同じ数値にしてしまえば元のコードでも できたのではないでしょうか。 (Mook)
Mookさん、ありがとうございます。
決定したクラブに、色が付き、結果が分かりやすくなりました。 最後のコメントの通り、学年は同値にすることで無視できる点は分かっております。
残念ながら、私のメインの希望が、このマクロでは叶えれれませんでした。
私の希望は、選考順上位の生徒の希望が優先 希望順(列優先)<並び順(行優先)
提示いただいたマクロでは、弥太郎さんのマクロと同様に、 希望順(列優先)>並び順(行優先)となりました。
下記がマクロを実行した結果の一部です。
氏名「あ〜え」は、第一希望が通り、囲碁・将棋は定員になります。 氏名「お」の場合、第1、2希望が定員なので、第3希望の「バドミントン」に決まるようにしたい。
弥太郎さん、Mookさんのマクロはともに、氏名「お」が選考漏れとなってしまいます。
この点を解決するには、どうすればいいのでしょうか? A B C D E 氏名 学年 第1 第2 第3希望 あ 4 囲碁 将棋 卓球 い 4 将棋 囲碁 バドミントン う 4 囲碁 将棋 バドミントン え 4 将棋 囲碁 卓球 お 4 囲碁 将棋 バドミントン か 4 将棋 囲碁 卓球 き 4 囲碁 将棋 卓球
G H I J K L M N 種目 野球 ソフト バレー 卓球 バドミントン 将棋 囲碁 定員 9 9 6 2 2 2 2
(しーたけ)
行優先というのは、 For c = 3 To 5 For r = 2 To mxRow を For r = 2 To mxRow For c = 3 To 5 ということでしょうか。 (Mook)
Mookさん ありがとうございます。 無事うまくいきました。 先ほどコメントした後に、マクロを読み解きながら、 ご指摘のところ換えればいける?と思い、これから試したところでした。
大変勉強になりました。 ありがとうございました。 (しーたけ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.