忍者ブログ
日常だったりネタだったり作品の進捗だったり……色々書きます。不定期に。
11
  • 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
  • 管理画面

    [PR]

    ×

    [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

    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 」

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



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

    拍手[1回]

    PR

    なんか……

    こんばんは若槻です。別部署の人たちが大抵みなさん電話を切る時に
    「ガチャンッッ」って切るから怖くて仕方ないです。
    もっと優しく切ってよ、お客様にもそれってどうなのさ……(・ω・。`)


    さて本日はちょっと自分の執筆能力に疑問。
    隠しますので泣き言聞きたくない方はバック推奨です。

    拍手返信はちょっと明日に持ち越しで……ごめんなさいorz|||

    拍手[3回]

    忍題終わったああ!!

    こんばんは若槻です。なんだかひとつ終わるごとにひとつやることを
    増やしている気がします(笑)


    さて、午前中に母と買い物に行ったりと若干席を外しもしましたが、
    何とか忍題「自由」が完成しました。

    フラッシュ作品で、今回は前回から学びファイル容量も小さめです。
    そして今回は選択式にしてみました。
    選んだ選択肢によって最後が変わります。

    はじめてIF文とか変数とか使いましたがそんなに難しくなくて
    よかったです(*´∀`)=3

    というわけで、よければごらんくださいまし!

    【リンク】



    ■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
    1周年企画について。以下受諾

    ・ろっきーさん

    お久しぶりですろっきー^^
    ご参加ありがとうございます。
    応募受け付けさせていただきます。
    (残り25タイトル。。。)
    ■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□


    以下拍手返信です。

    拍手[1回]

    忍題が終わらないぃぃ!!

    皆さんこんばんは若槻です。
    久々に休憩と光合成(何)がてら散歩に行ってきました。
    歩くのはやっぱり楽しいなぁ。


    ……なんてことやってたら忍題が終わらなかった!
    前回に学んだから手際は悪くないけどお話打ちながらは
    きつかったか……!?

    とにかく今からも続けますので本日はこの辺りで。
    拍手返信は明日辺りにでもやります(汗/慌)ノ

    拍手[0回]

    1周年企画再通知

    こんばんは、そろそろ忍題のお題を仕上げたいなと考え中の若槻です。

    今回のお題は「自由」。
    最初は小説とイラストで「宮内の日常」的なものにしようと
    思ってたんですが、この土壇場に別のものを思いついたので
    久々にフラッシュで作品作りといこうかと。


    さて、本日の本題は1月に通知した1周年企画についてです。
    あまりに集まりが悪いので(え? 人徳の問題? 分かってますってΣ)
    再度募集通知をいたします。
    一度ご応募くださった方もよろしければぜひ。

    詳細はサイトの方をご参照ください(下記リンク先)。
    色々書いてありますがそんな大層なことではないので
    お気軽にご応募くださいましo(_ _)o

    【リンク】


    拍手[0回]


    [191]  [192]  [193]  [194]  [195]  [196]  [197]  [198]  [199]  [200]  [201
    カレンダー
    10 2024/11 12
    S M T W T F S
    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
    ブログ内検索
    最新コメント
    [05/27 きり]
    [01/13 きり]
    [06/06 わんこ]
    [03/30 サイトウ]
    [06/09 yu]
    カウンター
    アクセス解析


    フリーエリア
    コガネモチ


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

        忍者ブログ [PR]