忍者ブログ
日常だったりネタだったり作品の進捗だったり……色々書きます。不定期に。
09
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 管理画面

    VBA「演習-学生名簿」続き5

    こんばんは若槻です。やっぱり今日もあんまり仕事なかったです。
    ただ、今日はいつもの別課の課長から修正依頼来たし
    総務の人の「フォントが反映されないから直して」っていうのも
    来たので昨日よりは?

    ちなみに総務の人の話は単純にExcel起動した後にフォントを
    入れたから反映されてなかっただけでした(笑
    ↑気付くのに結構かかったとかね


    さて、本日は久しぶりにVBAのおしゃべりです。
    正直今作ってる奴の方が実用的なんですが、始めちゃったから
    続けようかと!

    ※ちなみに会社で暇な時間に書いたものをコピペしただけなので
    何かおかしなところがあったら華麗にスルーしてください(-v-;)


    ====================================================
    ◎システム名 「演習-学生名簿」
    ====================================================
    ~現在ある内容~
    ・グループ分け       ←終了
    ・学年別  ←簡単1        ←終了
    ・学校別          ←終了
    ・性別ごと ←簡単2    ←終了
    ・配役配置
    ・試合
    ・検索
    ・選抜
    ・動き
    ・条件別グループ分け

    本日は配役配置をおしゃべりします。

     

    6.配役配置
    ○やりたいこと
    最初に決めた配役に人物を当てはめる。
    ※配役等の項目名はシートに入りっぱなしなので、
     そこに個別に入れていくソース。

    ※完成すればランダムに割り当てられるので楽しいけど
     作る時にはちまちましたプログラムになっています

     


    ○ソース
     ~~~~~~~ソース1.-ここから~~~~~~~~
    '======================================================
    '配役配置
    '======================================================
    Sub HaiyakuHaiti()
      SheetSet
      DontLook
     
      '=====WH2にWH1のデータをコピーして並び替え-ここから===========
      SyokiCopy
     
      Ramdam
      '=====WH2にWH1のデータをコピーして並び替え-ここまで===========
     ~~~~~~~ソース1.-ここまで~~~~~~~~ 

    ソース1でやっていること→各マクロの呼び出し
     ・シートセット
     ・画面のちらつきをなくす
     ・学生一覧から並び替え用のシートにデータをコピー
     ・ランダムで値を抜き出し(後述)

     

      ~~~~~~~ソース2.-ここから~~~~~~~~
    (長いですがほぼ同一のコードなので最初と最後だけ出します)
      'シンデレラ配置
      j = 3  ' WH7(配役配置)用
      Do Until j > 10
        Retu = "B"
        KakusyoHaiti
        j = j + 1
      Loop
     
      ・
      ・
      ・

      '七騎士物語配置
      Ramdam
      j = 84  ' WH7(配役配置)用
      Do Until j > 98
        Retu = "P"
        KakusyoHaiti
        j = j + 1
      Loop
     
      ~~~~~~~ソース2.-ここまで~~~~~~~~
     
    ソース2でやっていること→各所の配役に人を配置していく
     (変わっている点) 
       ・変数jとRetuの値(マクロ「KakusyoHaiti」で使用)


     
      ~~~~~~~ソース3.-ここから~~~~~~~~
      WH7.Select
     
     '列幅のオートフィット
      For i = 1 To 20
        WH7.Rows(i).EntireColumn.AutoFit
      Next

      WH7.Range("A1").Select
      OKLook
    End Sub
      ~~~~~~~ソース3.-ここまで~~~~~~~~

    ソース3でやっていること→列のオートフィットと画面のちらつきオン


      ~~~~~~~ソース4.-ここから~~~~~~~~
    '=====================
    'ランダム
    '=====================
    Sub Ramdam()
      WH2.Select
    [1]
      LG = WH2.Range("A65536").End(xlUp).Row
      WH2.Range("I2:I" & LG).Value = "=Rand()"
      WH2.Range("A2:I" & LG).Sort Key1:=Range("I2"), order1:=xlAscending
      WH2.Range("A1").Select

    [2]
      Randomize
      i = Int(Rnd() * LG) + 2 'WH2を回す用
      If LG <> 1 Then
        If i > LG Then
          Do Until i < LG
            Randomize
            i = Int(Rnd() * LG) + 2
          Loop
        End If
      End If
    End Sub
      ~~~~~~~ソース4.-ここまで~~~~~~~~

    ソース4でやっていること→ランダムに回してiの値を引っ張る
    [1]シート「並び替え」に入っている全ての行のI列に「=Rand()」を入れていきます。
      「=Rand()」はエクセル自体で使えるランダム関数です。
      なのでこれを格納するとその時点で0.いくつの値がI列に入ってきます。

      そしてそれを昇順に並び替え――――といっても、その通りに
      なることを期待してはいけません。何故ってこの並べ替えをした時点で
      I列の値はまた変わっているから。
      ※Randはシート上で変更があるたびに値を変えます

      じゃあなんで並べ替えてるかって言うと、単純にどこに誰がいるのか
      分からなくするためです。
      これをやることで次の動作の結果が非常に分かり辛くなります。

    [2]色々やっているように見えますが並び替えのシートの何行目を
     抜き出すかを決めているだけですね。
     今回はシートの1行目が項目名であることを踏まえ、0と1を避けるために
     iに+2しています。
     1)If LG <> 1 Then → LGが1じゃない。状態的にならないはずですが一応
     2)If i > LG Then → iの値がLGよりも大きかったら決めなおし
      ※LG = 最終行なので、最終行を超えてはいけない
     
    ※マクロ名が正しい英語になっていないことにつっこんではいけませんΣ

     

      ~~~~~~~ソース5.-ここから~~~~~~~~
    '=====================
    '各所配置
    '=====================
    Sub KakusyoHaiti()
    [1]
      Select Case Retu
        Case "B"
          WH7.Range("B" & j).Value = WH2.Range("B" & i).Value
          WH7.Range("C" & j).Value = WH2.Range("C" & i).Value
          WH7.Range("D" & j).Value = WH2.Range("D" & i).Value
          WH7.Range("E" & j).Value = WH2.Range("E" & i).Value
          WH7.Range("F" & j).Value = WH2.Range("F" & i).Value
        Case "I"
          WH7.Range("I" & j).Value = WH2.Range("B" & i).Value
          WH7.Range("J" & j).Value = WH2.Range("C" & i).Value
          WH7.Range("K" & j).Value = WH2.Range("D" & i).Value
          WH7.Range("L" & j).Value = WH2.Range("E" & i).Value
          WH7.Range("M" & j).Value = WH2.Range("F" & i).Value
        Case "P"
          WH7.Range("P" & j).Value = WH2.Range("B" & i).Value
          WH7.Range("Q" & j).Value = WH2.Range("C" & i).Value
          WH7.Range("R" & j).Value = WH2.Range("D" & i).Value
          WH7.Range("S" & j).Value = WH2.Range("E" & i).Value
          WH7.Range("T" & j).Value = WH2.Range("F" & i).Value
      End Select
     
    [2]
      WH2.Range(i & ":" & i).Delete
      LG = WH2.Range("A65536").End(xlUp).Row
      Randomize
      i = Int(Rnd() * LG) + 2
      If i = LG + 1 Then
        Do Until i < LG
          Randomize
          i = Int(Rnd() * LG) + 2
        Loop
      End If
    End Sub
      ~~~~~~~ソース5.-ここまで~~~~~~~~

    ソース5でやっていること→各所配置
    [1]メイン動作でRetuに入れた値によってSelect Caseをする。
     「Ramdam」で出したiの行から値を抜き出しWH7に格納。

    [2]並び替えのシートからi行目を削除し、再度iを求める
     


    このコードを実行するとこのように配役が割り振られます。
    自分のキャラクターなどで代用して遊ぶのが楽しみ方です(笑)

    図1.引きb1cbf48c.JPG





















    図2.アップ
    アップ














    以上で「配役配置」は終了です。

     


    ~おまけ~
    ○「Erase」の注意
     前回のおしゃべりの時に配列変数を初期化する「Erase」について
     お話したかと思います。
     本日は書き忘れていたEraseの注意をば。

     1.文字型  : Rac(4) As String
      この配列をEraseにかけると配列の中身は
      Rac(0)~Rac(4) = "" → 長さ0の文字列が入ります
     
     2.数値型  : Rac(4) As Integer
      この配列をEraseにかけると配列の中身は
      Rac(0)~Rac(4) = 0 → 数字の0が入ります

     3.動的配列 : Rac() As Variant
      ※Redim Rac(4)で再宣言したことを前提
      この配列をEraseにかけると配列が解除されます。
      どういうことかというと、Redimで「4」を定義したものを
      なかったことにしてるって話です。
      
      実際やってみると分かりますが、
      '-------------------------------
      Dim Rac() As Variant
      
      Sub sand()
        ReDim Rac(4)
        
        For i = 0 To 4
          Rac(i) = i
          Debug.Print Rac(i)
        Next
      End Sub
      '-------------------------------
      というプログラムを実行すると、イミディエイトウィンドウには
      Rac(i)の値ということで0~4の値が記述されます。

      ではこれをEraseにかけてもう一度。
      
      

    インデックスエラー
     








      
      はいこうなりました。

      デバッグで見てみると、Forの始まりでいきなり駄目になってます。
      

    494f6190.JPG













    fe84308c.JPG







      ということで、動的配列にEraseを使うとこんな目に遭うので
      気をつけましょう。
      中身をクリアしたい場合は、面倒ですがFor文で回して空白なり
      0なりを入れていくしかないかと(若槻のレベルではそれが限界)


    それでは本日はこれにて。

     

    拍手[1回]

    PR

    お名前
    タイトル
    文字色
    URL
    コメント
    パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
    非公開コメント
    この記事にトラックバックする:
    [461]  [460]  [459]  [458]  [457]  [456]  [455]  [454]  [453]  [451]  [450
    カレンダー
    08 2019/09 10
    S M T W T F S
    1 2 3 4 5 6
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    ブログ内検索
    最新コメント
    [05/27 きり]
    [01/13 きり]
    [06/06 わんこ]
    [03/30 サイトウ]
    [06/09 yu]
    カウンター
    アクセス解析


    フリーエリア
    コガネモチ


        ◆ graphics by アンの小箱 ◆ designed by Anne ◆

        忍者ブログ [PR]