[PR]上記の広告は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にカーソルを持ってきて終了です。
学校名とキャラクターにつっこんじゃいけないww
では本日はここまで。
お疲れ様でしたー。
~おまけ~
プログラムを作っていると「一文が長くなってしまう」ってこと、ありません?
そんな時はこれ。
「 _ 」
ご覧の通り、アンダーバーです。
使い方としてはこうなります。
「 WH5.Range(Retu2 & GakkouGyou & ":" & Retu & GakkouGyou). _
Borders(xlEdgeTop).Weight = xlMedium 」
前のプログラムの後に半角スペースを挿入→アンダーバー、の順です。
この半角スペースを忘れると怒られますからご注意くださいね。
以下拍手返信です。
また、無名の拍手の方々もありがとうございました。
昨日の記事の内容からして励ましだと受け取らせていただきました!