Jose's FANTASY SPORTS!

アメリカンフットボールを中心にスポーツ好きで、カントリーギター好きのJoseによる雑記帳です。

細かい事は分からんがVBAがやりたい-19-

2012年07月15日 23時00分00秒 | いきなりVBA(Excel)
[ いきなりVBA ]
いきなりVBA 第1回 LOG
突如再開、このコーナー。
今度こそ、本題。ユーザ定義関数決着編です。

さて、いよいよ待ちに待ったNFL方式のQBレーティング算出 ユーザ定義関数です。

もう、あれこれ言うのはやめましょう。
面倒だという方は、以下のコードをVBEに貼り付けて、Let's計算!

Function QBRATE(attempt As Long, complete As Long, yds As Long, td As Long, intercept As Long) As Double

'Comp%
Dim perComp As Double
perComp = (complete / attempt * 100 - 30) * 0.05

Select Case perComp
Case Is <= 0
perComp = 0

Case Is > 2.375
perComp = 2.375

End Select

'Yards%
Dim perYard As Double
perYard = yds / attempt
perYard = (perYard - 3) * 0.25

Select Case perYard
Case Is <= 0
perYard = 0

Case Is > 2.375
perYard = 2.375

End Select

'TD%
Dim perTD As Double
perTD = (td / attempt) * 100 * 0.2

Select Case perTD
Case Is <= 0
perTD = 0

Case Is > 2.375
perTD = 2.375

End Select

'INT%
Dim perInt As Double
perInt = intercept / attempt * 100
perInt = 2.375 - (perInt * 0.25)

If perInt < 0 Then
perInt = 0
End If

'結合最終計算
QBRATE = Round((perComp + perYard + perTD + perInt) / 6 * 100, 2)

End Function

これぞ、ユーザ定義関数にしてまでやる意味があるというもの。(自分は、これにマイナス値や未入力の場合のトラップもつけてますが、今日のところは根幹部分のみという事で。)

存分に計算してみてください。

ちょっと、それっぽい入力欄にして、こんな風にしてもいいですね。
<img src="http://blogimg.goo.ne.jp/user_image/0a/4a/e10a7459a29f810a2b21e51a6b39d9bb.png">
とあるNFLのQBの昨年の数字です。
誰の数字か、分かりますね?

Yahoo! Sportsの表示レーティングともちゃんと合ってました。えっへん。

これで、フラッグフットボールでも、各数字を引数に入れればQBレーティングが算出できますよ。(獲得ヤードとか、ビデオで見返してつけないといけないでしょうけど。)

BGM: Numbers / Kraftwerk
QBレーティングは、とにかく数字をあれこれイジって算出されています。
数値で実力は測れないとか、色々言われるむきもありますが、それなりにやっぱり目安になりますよね。
という訳で、今回のNFL式QBレーティングの算出関数を自分のExcelに組み込んで、いつでも出せるようにしておきましょう。
え? 出てるサイトを見ればいいんじゃ?って? まぁ、そうですね。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

細かい事は分からんがVBAがやりたい-18-

2012年07月14日 23時00分00秒 | いきなりVBA(Excel)
[ いきなりVBA ]
いきなりVBA 第1回 LOG
突如再開、このコーナー。
さて、いよいよ本題(?)です。
前回、前々回とやった内容を踏まえて・・・・・・アレ、やっちゃいましょう。
アメフトファン、永遠の憧れ計算式、QBレーティングです。

あれ、計算式が難しいと言われますが、内容を聞いて見ると、それでもなんとか理解できる範疇のものです。
だから、自作しちゃいましょう。

考慮されるのは、4つの要素です。
1.パス成功率
2.平均パス獲得ヤード
3.TD率
4.インターセプト率
これらを総合して判断します。

ユーザ定義関数を作る際。楽しいのはどういう引数を取るのが良いか、というのを考える事が大きな要素です。

必要な4つの要素をそのまま引数にとったのでは面白くありません。
率だし。
だから、以下のような引数をとりましょう。
パス試投
パス成功数
パス獲得ヤード
TD数
インターセプト数
率は、計算で出します。

4つの率を算出して、1~3を足し、4を引く。
これでQBレートが算出できます。(? って思っても、黙っててね。)

だから、こんな感じ。

Function QBRATE_C(attempt As Long, complete As Long, yds As Long, td As Long, intercept As Long) As Double

Dim CompPCT As Double
Dim avgYD As Double
Dim PCT_TD As Double
Dim PCT_INT As Double

CompPCT = complete / attempt * 100
avgYD = attempt / yds * 8.4
PCT_TD = td / attempt * 100 * 3.3
PCT_INT = intercept / attempt * 100 * 2

QBRATE_C = Round(CompPCT + avgYD + PCT_TD - PCT_INT, 1)

End Function


少し、自作する意味が出てきましため。

あれ?
計算があわない

そりゃそうですね。
アメフトファンはご存じの通り、NFLで算出しているQBレーティングというのは他のQBレーティングとは算出方法が違います。

NFLの算出方法はもっと複雑で、上限も設けているから、満点158.3だとかいう話をよく聞きますよね。

という訳で、次回。
NFL算出方法でのQBレーティングで、ユーザ定義関数シリーズをしめたいと思います。

BGM: Too High / Dave Matthews
このQBレーティングの数値は、NFL方式と比べると大抵高く出るみたい。
ランジェリー・フットボールのQBなんかは、かなり凄い数字になってる選手もいるとか...。
でも、みんなやりたいのはNFL方式だよね。だから次回を待ってくださいな。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

細かい事は分からんがVBAがやりたい-17-

2012年07月13日 23時00分00秒 | いきなりVBA(Excel)
[ いきなりVBA ]
いきなりVBA 第1回 LOG
突如再開、このコーナー。
さて、ユーザ定義関数第2段は、身長の計算です。
これは、逆方向で、ft inchからcmに換算しましょう。

やる事は前回とほぼ同じ。
標準モジュールに、FunctionEnd Functionを記述して、その間に計算内容を書き込みます。

ちょっと違うのは、今回引数が二つある事。
フィートとインチの両方を引数にして計算しないといけませんね。

まぁでも、全く問題ありません。
超簡単です。

コードは、以下のようになります。

*コピー用に。テキストでも載せときます

Function Hconv(f As Long, i As Long) As Double

Hconv = f * 30.48 + i * 2.54

End Function


*具体的な使い方は、昨日の記事を見てね。

引数を2つ取るのは、カッコ内に2つ入れればいいだけです。
今回は、引数のデータ型も指定しています。
引数のデータ型は整数型。(5.9フィートとかされても困るから)。

本当は、こうやって引数にもデータ型を設定するんですよ~。
計算するのに、数字じゃないと困るし、5.4フィート○インチみたいな値にされても困りますからね。

でも、計算結果(cm)は小数点以下まで欲しいから、関数全体のデータ型はDouble型にしています。

こんな話は、また慣れてきたら、おいおい覚えれば良いです。
とにかく、今回作成したHconvは、フィートとインチの2つの引数を取る関数ですから、ワークシート上でも2つ引数が必要になります。

使い方はこうです。

A1セル → フィート
B1セル → インチ
として、C1セルに結果を表示しましょう。

 =Hconv(A1,B1)

簡単ですね。

さてさて、ここまで来たら次にやる計算は分かりますよね?
アメフトファンなら、是非やりたい計算があるっしょ?
そう、それですよ...。

BGM♪ Tall fiddler / Tommy Emmanuel
前回同様、身長を換算する程度のレベルだったら、何も関数を作るまでしなくてもいいんでしょうけどね。
こうやっておけば、なんか無粋な計算式を設定しなくてもいいじゃないですか。
次こそ、アメフトファンのやりたい計算に行きますから...。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

細かい事は分からんがVBAがやりたい-16-

2012年07月12日 23時00分00秒 | いきなりVBA(Excel)
[ いきなりVBA ]
いきなりVBA 第1回 LOG
突如再開、このコーナー。
なぜなら、最近のマイブームがあるからです。それは...。

その筋の人には、とっても今さら感のある事でしょうけど、最近Excelのユーザ定義関数がマイブームです。

なるべく最小限の引数で済ませるには、どんな引数をとったら良いかな~とか考えるのが結構楽しいです。

この場で、仕事に使うような関数を紹介してもしょうがない。
(それなら、もっとためになるサイトが既に世の中にはごまんとあるので。)

~一応ユーザ定義関数の説明~
Excelユーザ定義関数
Excelには、便利な関数がいっぱいありますね。
例えば、ROUND関数
A1セルに、3.141592
と入っているとして…これを小数点2ケタで四捨五入するという関数です。
結果を表示させたいセルに、=ROUND(A1,2)とすれば、結果は3.14と表示されます。

こうして、Excelがあらかじめ用意していてくれた計算であれば、いいのですが、そうでない場合は、既存の関数を組み合わせたり、何段階かに分けて計算したりします。
または、自分で関数を作ってしまうという方法もあります。
これが、ユーザ定義関数です。
詳細は、この後。

ここは、やっぱりアメフトファンに便利な関数を自作してみましょう。
という訳で、作ってみた関数

体重換算
体重(kg)をポンド(lbs)に換算する関数っていうのがあったら、便利じゃないですか?
日本の野球選手の体重を換算して、アメフト選手の数字と比較してニヤニヤするとか、自分の体重がlbsでどれくらいになるか換算して、ニヤニヤするとか…。便利そうですね。

え~っと、ここではまずユーザ定義関数の作り方から解説しちゃいましょう。

Excelを開いたら、Alt+F11。
左側のペインを右クリックして、標準モジュールを選択。

そこに、コードを打ちこみます。

具体的に、どんなコードかはというと…。
体重換算(kg→lbs)の場合、こうです。

Function LBSconv(kg) As Long

LBSconv = kg * 2.046

End Function


簡単でしょ?
これをコピペすれば、もう立派にユーザ定義関数です。

それで、気になるのは、どうやって使うかって話でしょ>わかってますよ。

では、その画面を閉じます。
左上の×ボタンで閉じちゃっていいです。
保存とか聞かれないけど、きにしないでね。
後で、ブックを閉じる時に聞かれると思うから。(そん時に、テキト~な名前つけてね。)

Excelのワークシートに、体重(kg)を入力するセルを作ります。
ここでは、A1セルとしましょう。

B1セルに、結果を表示します。
B1セルに、=LBSconv(A1)と入力します。
Enter。

ほら、普通のExcelが用意した関数と同じように使えます。

(もちろん自作していますから、他人のPCとかでは使えません。)

一応、内容を解説。
Function  ←決まりです。従ってください。
LBSconv ←自作なので、自分でテキト~に決めて良いです。
(kg) ←引数です。これも自作なんで、テキト~に決めて良いです。
As Long ←結果のデータ型です。計算結果は数字になるので数字の型にします。数字の型には色々種類があるのですが、アメフトのlbs表記に普通小数点以下は使わないので整数型にしています。
データ型は重要で、小数点以下まで計算する場合はDouble型に、文字列型ならStringにします。あとは、True/Falseを返すBoolean型とかを覚えておけば、当面は良いんではないでしょうかね。(話がややこしくなるのでVariant型には触れない....。)

LBSconv = kg * 2.046,0
ここが、計算の内容ですね。

引数にとったkgに2.046をかけ、関数LBSconvの結果には、その計算結果値が入りますよという内容の式です。

End Function
書き方の決まりです。チームオーダーだと思って、従ってください。

こうやっておけば、先述の通り通常の関数と同じようにワークシートで使えるという訳です。
便利ですね。

という訳で、次回は身長の換算に挑戦です。

BGM♪ Fat Gal / Merle Travis
このように、体重を換算する程度のレベルだったら、何も関数を作るまでしなくてもいいんでしょうけどね。
こうやっておけば、なんか無粋な計算式を設定しなくてもいいじゃないですか。
こうやって、NFLの選手が数字上どれだけfatという事になってしまうかを関数で確認してみるのも面白いです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

細かい事は分からんがVBAがやりたい-15-

2010年08月06日 23時00分00秒 | いきなりVBA(Excel)
[ いきなりVBA ]
いきなりVBA 第1回 LOG
だいぶ間が空いてしまいましたが、まだまだやる事はいっぱいですよ。
今回は、ひとつの対象に行う命令を綺麗にまとめてくれる、Withです。


A1セルに、“□FAX送信状”と入力されています。
このA1セルの文字列を装飾してみます。

(1) フォントサイズを16にする
(2) ボールド(太字)にする
(3) 文字色を青にする

以上の装飾を行います。

記述したコードは、上から順番に処理されるので、順番に書いていけばOKな訳です。
フォントの各種指定は、.Font~という記述で実現します。


という訳で、これまでやった内容から言えばコードはこんな感じになります。

Range("A1").Font.Size = 16
Range("A1").Font.Bold = True
Range("A1").Font.Color = vbBlue

ボタンを作って、コードを記述してみましょう。

できあがったら、デザインモードを解除して、ボタンをクリック。


(1)、(2)、(3)の命令が、それぞれ実行されて、望みどおりになりました。

これで十分OKです。

でも、なんか3行とも出だしが同じで、毎回記述するのは面倒だし、後で確認する時分かりにくいです。
(凄く似てるけど、ちょっと違う記述かもしれない...なんてのも確認しなきゃいけないからね。)
それに、後で装飾する対象がA1じゃなくて、A2に変わったなんて時には、コードを修正するのも大変です。

これが3つ位だからいいけど、10~20個の命令を、同じ対象に行ったら、かなりコードは見づらいです。

そんな時に便利なのが、Withです。
同じ対象に複数の命令を行う時に、すっきりとまとめる事ができます。

先ほどのコードを、Withを使って記述すると、こんな感じです。

With Range("A1").Font
.Size = 16
.Bold = True
.Color = vbBlue
End With

Ifで始めた記述をEnd Ifで終わるように、With~は、End Withで終わります。
ボタンに記述して動作させてみましょう。


結果は同じですね。

結果は同じだから、別にやらなくてもいい事です。
だけど、先時の通り、解析/修正がしやすいなどの理由で、極力こうしてまとめておいた方が良いです。

かなり有用なコードなので、随所に使う事になると思います。
例えば、印刷設定などでの、ページ設定(.PageSetUp)などでは必須です。

BGM♪ Walking with You / Russ Barenberg
大傑作アルバム「カウボーイ・カリプソ(Cowboy Calypso)」に収録された一曲。
オープニングを飾るタイトル曲を含め、とっても質の高いインスト集のアルバムです。
休日の朝なんかに、絶対おすすめの一枚ですね。
という位“With”は、おすすめの命令です。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする