三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

XXXXXさんへ Excel VBA Asc関数 Chr関数 Offsetを使った泥縄デバッグ実演 仕様変更?追加依頼された時

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

↑余計なコードが入っていますが、参考となれば・・・

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)