[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こんばんは若槻です。やっぱり今日もあんまり仕事なかったです。
ただ、今日はいつもの別課の課長から修正依頼来たし
総務の人の「フォントが反映されないから直して」っていうのも
来たので昨日よりは?
ちなみに総務の人の話は単純に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を求める
このコードを実行するとこのように配役が割り振られます。
自分のキャラクターなどで代用して遊ぶのが楽しみ方です(笑)
~おまけ~
○「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の値が記述されます。
はいこうなりました。
デバッグで見てみると、Forの始まりでいきなり駄目になってます。
ということで、動的配列にEraseを使うとこんな目に遭うので
気をつけましょう。
中身をクリアしたい場合は、面倒ですがFor文で回して空白なり
0なりを入れていくしかないかと(若槻のレベルではそれが限界)
それでは本日はこれにて。