EXCEL VBA 


この業界の人間の中では比較的PCの扱いに慣れてはいるわけで、何かと重宝されることがあります。

(※もちろん、職業でコンピューター関係の開発に携わったことがある方に比べたら子供みたいなものですが。。)

気が付くと、これできる?とかチェックお願いします。とかの話が舞い込んできます。しかもプロで仕事をしているわけではないので収入に繋がることはなく、時間だけが消費されていくことになります。

で、今、とあるエクセルの集計プログラムをチェックおよび修正をしているわけです。

そうすると、こうやった方が便利だな。とか、こういう機能を付けておこう。とか考えてしまうわけです。

EXCELに計算式(関数)を入れることは良くやりますが、

ちょっと進んでマクロを設定してボタンを作って自動処理させよう。とか考えると、

さらに一般化させて他のシートでもできる様に。。なんてところまで行ってしまって、どうしてもそれ以上の知識が必要になります。

そうなると、VBAというプログラム言語を用いて処理をさせることになります。

もちろん職業で開発をしている方なら、難しくもないことだと思いますが、そこまで行くとなかなか大変ではあります。

普段使わないやり方(言葉)でEXCELを動かそうっていうだからね。

集中して事に当たっているときは、力を発揮しますが、こんなことが頻繁にあるわけではないのですぐに忘れます。

ってことで備忘録。。まずは

<<BIB順に並べ替えるプログラム>>

※ポイントは、カテゴリーによって人数が違うのでデータ数を調べてB列にあるBIB番号順に並べ替えるところ。

Sub BIB順並べ替え()

MaxRow1 = Rows.Count
MaxRow1 = Range(“B5”).End(xlDown).Row

ActiveSheet.Sort.SortFields.Clear
Range(“B5:AI” & MaxRow1) _
.Sort Key1:=Range(“B5”), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin

Range(“S5”).Select
End Sub

<<成績順に並べるプログラム>>

さっきと似た感じだけど、ソートのキーが三つあるところ。同じくデータ数を調べています。

Sub 成績順並べ替え()

MaxRow2 = Rows.Count
MaxRow2 = Range(“B5”).End(xlDown).Row

ActiveSheet.Sort.SortFields.Clear

Range(“B5:AI” & MaxRow2) _
.Sort Key1:=Range(“T5”), Order1:=xlDescending, Header:=xlNo, _
Key2:=Range(“Y5”), order2:=xlDescending, Header:=xlNo, _
Key3:=Range(“AD5”), Order3:=xlDescending, Header:=xlNo

Range(“S5”).Select

End Sub

<<条件を満たした人のみの順位で並べ替えるプログラム>>

さっきと違うのはソートのキーが4つになってる。VBAではソートは3つしか設定できない。4つ以上の場合は3つのかたまりに分けて下位のキーからソートをかけること。この例では、G>T>Y>ADの順でソートがかかる

Sub 条件を満たした人の順位()

MaxRow3 = Rows.Count
MaxRow3 = Range(“B5”).End(xlDown).Row

ActiveSheet.Sort.SortFields.Clear

Range(“B5:AI” & MaxRow3) _
.Sort Key1:=Range(“AD5”), Order1:=xlDescending, Header:=xlNo
Range(“B5:AI” & MaxRow3) _
.Sort Key1:=Range(“G5”), Order1:=xlDescending, Header:=xlNo, _
Key2:=Range(“T5”), order2:=xlDescending, Header:=xlNo, _
Key3:=Range(“Y5”), Order3:=xlDescending, Header:=xlNo

Range(“S5”).Select

End Sub

<<年齢カテゴリー別順位>>

これが一番大変だった。ソートのキー4つでさっきと同じなんだけど、データが数値ではなく文字列なこと。文字列を単純にソートすると年齢別ではなくひらがな順になるので、年齢順(小中高専大)という順に出力したかった。

そのためにCustomOrderという引数を使わなければならないが、そのためにSortFieldsオブジェクトを使う必要があり、そのために今開いているシートを調べるSelectedSheetsを使わなければいけなかった。

Sub 年齢別成績()

Dim sh As Worksheet

MaxRow4 = Rows.Count
MaxRow4 = Range(“B5”).End(xlDown).Row

For Each sh In ActiveWindow.SelectedSheets

sh.Sort.SortFields.Clear

sh.Sort.SortFields.Add Key:=Range(“J5:J” & MaxRow4), _
SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=”小学生,中学生,高校生,専門学校,大学生”, _
DataOption:=xlSortNormal

sh.Sort.SortFields.Add Key:=Range(“T5:T” & MaxRow4), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
sh.Sort.SortFields.Add Key:=Range(“Y5:Y” & MaxRow4), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
sh.Sort.SortFields.Add Key:=Range(“AD5:AD” & MaxRow4), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With sh.Sort
.SetRange Range(“B5:AI” & MaxRow4)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Next sh

Range(“T5”).Select
End Sub

残念なことに、一番最後のプログラムが最近のEXCELの機能になっているようなのでEXCEL2007以降でないと動かいようです。

同じソートでもキーが違ったりキーの個数が違ったり、キーの要素が違ったりで違うプログラムが出来上がりました。

まぁ~なんのこっちゃ?ってことですが、あくまで備忘録です。

ノートにメモするとメモを無くすので、web上にメモしておこうとしただけです。。

もっと簡単にできる方法もあるかもしれませんが、とりあえず予定通り動いているので良しとします。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください