忍者ブログ
日常だったりネタだったり作品の進捗だったり……色々書きます。不定期に。
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「演習-学生名簿」続き3

    こんばんは若槻です。
    ノリとテンションでモバイルPC買ってきてしましました! 
    ……あれおかしいな、ちょっと見に行ってきただけなのn(ry
    まあ良いんですがね、結構なお値段なのが在庫処分で安くなってた上に
    値切ったから元値に比べたら凄く安く買えたので。


    さて、本日は久々にVBAのおしゃべりです。
    前座なしにさくさくいきまーす!

    ====================================================
    ◎システム名 「演習-学生名簿」
    ====================================================
    ~現在ある内容~
    ・グループ分け
    ・学年別  ←簡単1        ←終了
    ・学校別
    ・性別ごと ←簡単2    ←終了
    ・配役配置
    ・試合
    ・検索
    ・選抜
    ・動き
    ・条件別グループ分け(作成中
     
    今日は学校別を解説してみましょう。


    4.学校ごと
    ○やりたいこと
    このマクロでやりたいのは学校ごとに人をまとめて並び替えることです。
    ついでに名前の50音順で並び換わるようにもしています。


    ○ソース

    ~~~~~~~ソース1.-ここから~~~~~~~~
    '====================================================================
    '学校別
    '====================================================================
    Sub GakkouWake()
      SheetSet
      DontLook
     
    [1]
      WH5.Cells.Delete

     
    [2]
      '=====WH2にWH1のデータをコピーして並び替え-ここから===========
      SyokiCopy
     
      WH2.Select
      LG = WH2.Range("A65536").End(xlUp).Row
      WH2.Range("A2:G" & LG).Sort _
                Key1:=Range("E2"), order1:=xlAscending, _
                key2:=Range("F2"), order2:=xlDescending, _
                key3:=Range("C2"), order3:=xlAscending
               
       WH2.Range("A1").Select
      '=====WH2にWH1のデータをコピーして並び替え-ここまで===========
     
    [3]
      i = 2  'WH2(並び替え)用
      LG = WH2.Range("A65536").End(xlUp).Row
      GakkouMei = WH2.Range("E2").Value
      GakkouSuu = 1  '学校数用
     
     
    [4]
      '================項目追加=========================
      WH5.Range("A1").Value = GakkouMei
      WH5.Range("A2").Value = "名前"
      WH5.Range("B2").Value = "よみ"
      WH5.Range("C2").Value = "性別"
      WH5.Range("D2").Value = "学年"
     
      WH5.Range("A1:D1").MergeCells = True
      WH5.Range("A1:D2").HorizontalAlignment = xlCenter
      WH5.Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous
      WH5.Range("A2:D2").Borders(xlEdgeBottom).LineStyle = xlDouble
      '=================================================

    ~~~~~~~ソース1.-ここまで~~~~~~~~

    ソース1でやっていること→初期動作
    [1]シートのクリア
    [2]書いてある通りですが、並び替え先のシートに元データをコピーして
      「学校名」「学年」「よみ」でソートしてます。
      ちなみに学校名は昇順、学年は降順、よみは昇順です。
    [3]使う変数の初期化
      i :並び替えのシートを回す用
      LG:最終行取得用
      GakkouMei:比較する学校名を格納
      GakkouSuu:いくつの学校があるか
    [4]A1:D2にそれぞれに対応する項目名を入れ、中央寄せやら罫線引き 

     

      ~~~~~~~ソース2.-ここから~~~~~~~~
    [1]
      GakkouGyou = 3  '配置する行
      GakkouRetu = 1  '配置する列
      MaxGyo = 0    '最大行
      TaikiGyo = 0  '現在が始まったときのMaxGyoの値
      Turn = 0  '行が変わったかどうか
      CNT = 0   '学生数カウント
     
      '本動作
      Do Until i > LG【α】
    [2]
       If WH2.Range("E" & i).Value = GakkouMei Then
          WH5.Cells(GakkouGyou, GakkouRetu).Value = WH2.Range("B" & i).Value
          WH5.Cells(GakkouGyou, GakkouRetu + 1).Value = WH2.Range("C" & i).Value
          WH5.Cells(GakkouGyou, GakkouRetu + 2).Value = WH2.Range("D" & i).Value
          WH5.Cells(GakkouGyou, GakkouRetu + 3).Value = WH2.Range("F" & i).Value
          GakkouGyou = GakkouGyou + 1
          CNT = CNT + 1
          If MaxGyo < GakkouGyou Then
            MaxGyo = GakkouGyou
          End If
        Else
          GakkouMei = WH2.Range("E" & i).Value
         
          '================合計値の格納========================
          WH5.Cells(GakkouGyou, GakkouRetu + 2).Value = "合計"
          WH5.Cells(GakkouGyou, GakkouRetu + 3).Value = CNT
          j = GakkouRetu
          ConvertToLetter (j)
          Retu2 = Retu
          j = GakkouRetu + 3
          ConvertToLetter (j)
          WH5.Range(Retu2 & GakkouGyou & ":" & Retu & GakkouGyou).Borders(xlEdgeTop).Weight = xlMedium
          CNT = 0
          '=====================================================
    [3]     
          If GakkouRetu = 11 Then
            TaikiGyo = MaxGyo
          End If
          GakkouSuu = GakkouSuu + 1
          If GakkouRetu = 11 Then
            GakkouGyou = MaxGyo + 5
            GakkouRetu = 1
            Turn = Turn + 1
          Else
            If Turn >= 1 Then
              GakkouGyou = TaikiGyo + 5
              GakkouRetu = GakkouRetu + 5
            Else
              GakkouGyou = 3
              GakkouRetu = GakkouRetu + 5
            End If
          End If
     
    [4]    
          '====================================項目名=============
          WH5.Cells(GakkouGyou - 2, GakkouRetu).Value = GakkouMei
          WH5.Cells(GakkouGyou - 1, GakkouRetu).Value = "名前"
          WH5.Cells(GakkouGyou - 1, GakkouRetu + 1).Value = "よみ"
          WH5.Cells(GakkouGyou - 1, GakkouRetu + 2).Value = "性別"
          WH5.Cells(GakkouGyou - 1, GakkouRetu + 3).Value = "学年"
          Select Case GakkouRetu
            Case 1
              WH5.Range("A" & GakkouGyou - 2 & ":D" & GakkouGyou - 2).MergeCells = True
              WH5.Range("A" & GakkouGyou - 2 & ":D" & GakkouGyou - 1).HorizontalAlignment = xlCenter
              WH5.Range("A" & GakkouGyou - 2 & ":D" & GakkouGyou - 2).Borders(xlEdgeBottom).LineStyle = xlContinuous
              WH5.Range("A" & GakkouGyou - 1 & ":D" & GakkouGyou - 1).Borders(xlEdgeBottom).LineStyle = xlDouble
            Case 6
              WH5.Range("F" & GakkouGyou - 2 & ":I" & GakkouGyou - 2).MergeCells = True
              WH5.Range("F" & GakkouGyou - 2 & ":I" & GakkouGyou - 1).HorizontalAlignment = xlCenter
              WH5.Range("F" & GakkouGyou - 2 & ":I" & GakkouGyou - 2).Borders(xlEdgeBottom).LineStyle = xlContinuous
              WH5.Range("F" & GakkouGyou - 1 & ":I" & GakkouGyou - 1).Borders(xlEdgeBottom).LineStyle = xlDouble
            Case 11
              WH5.Range("K" & GakkouGyou - 2 & ":N" & GakkouGyou - 2).MergeCells = True
              WH5.Range("K" & GakkouGyou - 2 & ":N" & GakkouGyou - 1).HorizontalAlignment = xlCenter
              WH5.Range("K" & GakkouGyou - 2 & ":N" & GakkouGyou - 2).Borders(xlEdgeBottom).LineStyle = xlContinuous
              WH5.Range("K" & GakkouGyou - 1 & ":N" & GakkouGyou - 1).Borders(xlEdgeBottom).LineStyle = xlDouble
          End Select
          '=============================================================
         
        End If
        i = i + 1
      Loop【α】
     
     ~~~~~~~ソース2.-ここまで~~~~~~~~
    ソース2でやってること→シート「学校別」に各学校ごとに格納
    [1]これも値の初期化ですね。今更ですが上でやれって話だw
       GakkouGyou:配置する行
       GakkouRetu:配置する列
       MaxGyo    :最大行
       TaikiGyo  :現在が始まったときのMaxGyoの値
       Turn    :行が変わったかどうかの判断。
       CNT      :各学生数カウント

    ※【α】のループ
     →並べ替え用のシートにある全てのデータを読み終わるまで

    [2]現在読んでいる行の学校名が変数GakkouMeiと一致するか
     (Then=正しい場合)
       GakkouRetuとGakkouGyouに一致するセルに対応する値を格納
       全ての値を入れ終わったら行をひとつプラスする。
       同一校なので生徒数であるCNTにも1をプラス
     
       ~「Cells」の使い方~
       シート名.Cells(行番号、列番号)
       →列名が分からない、という時は「Range」よりこっちがお勧めです。
       
     (Else=違っている場合)
       1.変数GakkouMeiに現在の行の学校名を格納
       2.CNTの値をそれまで見ていた学校の合計として
        その学校の最終行に追加。その後CNTを空にする
        ※ちなみに「ConvertToLetter (j)」は数字を列数に変えるマクロです。
         実はここで使う必要はなかった気がしてます←
         これは後ほどご説明しますね。

    [3]行の折り返し
      ・たくさん学校があると、そのまま横に入れていくととんでもなく
       横に長くなってしまいますね。
       若槻は縦に長いのは平気だけど横に長いのは嫌いなので
       3校が横に並んだらそこで折り返し最大行から5行分追加した
       位置から次の学校を出すようにしました。

      ・変数MaxGyoはそのための変数ですね。一番数の多い学校に
       あわせるために必要です。

      ・変数Turnは1行目に来る場合と折り返して2行目以降に
       来るかによって始まる位置が変わるのでそのために使ってます。

    [4]項目名の格納 → そのままです


     
      ~~~~~~~ソース3.-ここから~~~~~~~~
    [1]
     '================合計値の格納========================
      WH5.Cells(GakkouGyou, GakkouRetu + 2).Value = "合計"
      WH5.Cells(GakkouGyou, GakkouRetu + 3).Value = CNT
      j = GakkouRetu
      ConvertToLetter (j)
      Retu2 = Retu
      j = GakkouRetu + 3
      ConvertToLetter (j)
      WH5.Range(Retu2 & GakkouGyou & ":" & Retu & GakkouGyou).Borders(xlEdgeTop).Weight = xlMedium
      CNT = 0
      '=====================================================
     
     
      '列幅のオートフィット
      For i = 1 To 15
        WH5.Rows(i).EntireColumn.AutoFit
      Next
     
     
      WH5.Select
      WH5.Range("A1").Select
      OKLook
    End Sub
    ~~~~~~~ソース3-ここまで~~~~~~~~

    ソース3でやってること→最終処理
    [1]
      ・合計値の格納がまた出てきましたが、これは一番最後に見た学校の分です。
       これがないと最後の学校だけ合計値が出てきません。
       はぶられてます。それはよくない(何
      ・列幅のオートフォーマット。名前の長い人もいますものね
      ・最後はシートを選択してA1にカーソルを持ってきて終了です。

     
    結果はこうなるです↓
    93c03fa3.png
     

    学校名とキャラクターにつっこんじゃいけないww


    では本日はここまで。
    お疲れ様でしたー。

     

    ~おまけ~
    プログラムを作っていると「一文が長くなってしまう」ってこと、ありません?
    そんな時はこれ。

    「 _ 」

    ご覧の通り、アンダーバーです。
    使い方としてはこうなります。

    「 WH5.Range(Retu2 & GakkouGyou & ":" & Retu & GakkouGyou). _
        Borders(xlEdgeTop).Weight = xlMedium 」

    前のプログラムの後に半角スペースを挿入→アンダーバー、の順です。
    この半角スペースを忘れると怒られますからご注意くださいね。



    以下拍手返信です。
    また、無名の拍手の方々もありがとうございました。
    昨日の記事の内容からして励ましだと受け取らせていただきました!
     





    ~マコトさん~
    拍手&コメント&フラッシュの方ご覧くださりありがとうございました!
    どちらのルートも行っていただけたようで嬉しいです^^
    作った甲斐がありましたvvv
    「自由って何をしても構わないってことじゃない」って、
    まさにそうなんですよね。いまいち自分も誤解しがちなことが
    あるんですが、束縛があるからこその自由でもあるんですよね。


    ああー、ついにPC落ちちゃいましたか;
    うぅぅ、ご愁傷様です><
    環境が整わないんじゃ仕方ないですよね。
    次の機会に頑張ってくださいまし!
    あ、バトン受け取りありがとうございました(´∀`)



    ~きりちゃん~
    拍手&コメントありがとです。
    うにゃー、そうだよねやっぱり(・ω・`;)
    うん、読んでて「あ、うまい」とか思うことがあるのは
    実感として分かってるんじゃよ。
    うぅぅ、今週はちょっと読書週間にしようかにゃ……。

    拍手[1回]

    PR

    お名前
    タイトル
    文字色
    URL
    コメント
    パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
    非公開コメント
    この記事にトラックバックする:
    [389]  [388]  [387]  [385]  [384]  [383]  [382]  [381]  [380]  [379]  [378
    カレンダー
    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]