Excel VBAでAsc関数 Chr関数 Offsetを使って
処理を変更してみました。
前回作成のサンプル
ken3memo.hatenablog.com
に追加の要望がきました。
追加の要望:
前回の質問時は満足していたのですが
本日色々と試してみると
ランダム数値の区分がグループ分けした後
確認できればと思ってしまいました
後出しですみませんが、
引き続きご教示よろしくお願いします
【問題】
班 人数
A 20
B 15
C 8
D 90
E 16
【答え】
班 人数
1グループ A 20
B 13
2グループ B 2
C 8
D 23
3グループ D 33
4グループ D 33
5グループ D 1
E 16
かなりややこしい内容になると思いますが
よろしくお願いします
に対して、泥縄式でデバッグ・修正作業を開始してみました。
いつもの動画解説
Excel VBA Chr関数 Asc関数 Offsetで相対参照 泥縄VBAデバッグ実演 仕様変更?追加依頼された時、あなたなら?どうする・・・ - YouTube
www.youtube.com
06:40 ~ Asc関数,Chr関数を使用してA-Zの文字を作る
23:50 ~ Offsetを使って相対座標で管理、修正を楽にしてみた。
作成したコード
Option Explicit Sub test20181118() Dim Gorup_Max As Integer '最大の座席数 33 Dim Group_no As Integer '結果 1グループ目、2グループ目を管理 Dim Group_amari As Integer '残りの座席 Dim Group_yy As Integer '結果の書き込み先の行 11/18 Dim y As Integer 'Y行目 Dim n As Integer '列管理、内訳n個目の管理、 Dim Next_noruhito As Integer '次に乗る人 A列から取得 Dim Noretahito As Integer '実際に乗れた人 Const 人数基準 = "A1" '班と人数の位置 見出し付き左上 Const 結果基準 = "C1" '結果書き込み位置 見出し付き左上 '初期化処理 Gorup_Max = 33 '一台のMAX人数 Group_no = 0 Group_yy = 0 '結果の行 11/18 追加 '結果を消す Range(Range(結果基準).Offset(1, 0), Range(結果基準).Offset(999, 2)).Clear y = 1 'A列1行目からチェックする Next_noruhito = Int(Range(人数基準).Offset(y, 1)) '次の人数を初期化といってもa1だけど Group_amari = Gorup_Max '一番最初は全席空いてます、トリガー?で初期化 'A列乗る人がゼロになるまでループ While Next_noruhito > 0 '乗る予定の人が0以上、次に乗る人が居る間ループする '全席空いていたら、次のグループを用意する If Group_amari = Gorup_Max Then '空席=もMAXかチェックする 'B列にグループ見出しを書き込む Group_no = Group_no + 1 'グループの通し番号を増やす Group_yy = Group_yy + 1 '書き込み先の行を増やす 11/18 Range(結果基準).Offset(Group_yy, 0) = Group_no & "グループ" Group_yy = Group_yy + 1 '書き込み先の行を増やす 11/18 n = 0 'グループ内の列管理を0にする Group_amari = Gorup_Max '新しいグループは全席空いてます、あっいらないか End If '席に座る処理 '次に乗る希望人数が全員乗れるか?空いている席と比べてチェックする If Next_noruhito <= Group_amari Then '乗りたい人と空席を比べる '希望者全員乗れたのでグループに乗った人数を書き込む 'Range(結果基準).Offset(y, 1) C1 Range(結果基準).Offset(Group_yy, 0) = Range(人数基準).Offset(y, 0) '班の名前 11/18" Range(結果基準).Offset(Group_yy, 1) = Next_noruhito 'D列人数 11/18 n = n + 1 '次のセット位置に移動したいので Group_yy = Group_yy + 1 '11/18 '乗った人の分空席が減る Group_amari = Group_amari - Next_noruhito '単純に空席を減らす '全員無事に乗れたので次の人数を次の行から取得する y = y + 1 '次の行 Next_noruhito = Int(Range(人数基準).Offset(y, 1)) '次の人数をセットする Else '座席が足りなかった時※乗りたい人が多かったとき Noretahito = Group_amari '乗れた人は空席の数だけ乗れた '次に乗る予定の人を計算(今乗れなかった人) Next_noruhito = Next_noruhito - Noretahito '乗る予定から乗れた人を引くと次乗る人 '↑ここで、ぴったり乗れた時は、次に乗る人が0の時は次のA列から取得したい If Next_noruhito = 0 Then y = y + 1 '次の行 Next_noruhito = Int(Range(人数基準).Offset(y, 1)) '次の人数をセットする End If '乗れた人をグループに記入する 11/18 Range(結果基準).Offset(Group_yy, 0) = Range(人数基準).Offset(y, 0) '班の名前 11/18" Range(結果基準).Offset(Group_yy, 1) = Noretahito 'D列人数 11/18 n = n + 1 '次のセット位置に移動したいので Group_yy = Group_yy + 1 '11/18 '空席が無くなったので、次のグループを準備する、トリックしかけ Group_amari = Gorup_Max '新しいグループは全席空いてます '↑全席空いているをフラグ代わりに使ったトリック End If Wend End Sub
↑余計なコードが入っていますが、参考となれば・・・