370 likes | 430 Views
簡単な関数の作り方. 必要なときは自分で作る Excel の関数. 標準体重を求めたいセルに =(B5/100)*(B5/100)*22 のような式を入れると B5 に入っている身長の数値を元に標準体重を求めることができる。. 肥満度を求めたいセルに =(C5 – B9)/B9*100 という式を入れると C5 にある体重データと 先に作った B9 にある標準体重のデータから肥満度を計算することができる。. BMI 指数を求めたいセルに =C5/( (B5/100)*(B5/100) ) という式を入れると
E N D
簡単な関数の作り方 必要なときは自分で作るExcelの関数
標準体重を求めたいセルに =(B5/100)*(B5/100)*22 のような式を入れるとB5に入っている身長の数値を元に標準体重を求めることができる。 肥満度を求めたいセルに =(C5 – B9)/B9*100 という式を入れると C5にある体重データと 先に作ったB9にある標準体重のデータから肥満度を計算することができる。 BMI指数を求めたいセルに =C5/( (B5/100)*(B5/100) ) という式を入れると B5にある身長の数値とC5にある体重の数値からBMI指数を計算できる。
これらを計算する関数は用意されていない。 しかし、簡単な関数なら自作することができる。 一旦作っておくとそのワークシート内であればどこでも使うことができる。
まずはどんな関数をつくるか 例として、標準体重を計算する関数を作る。 名前はstdw( )とする。 引数は1つで身長をcm単位の数値で渡すと、標準体重を計算して返すようにする。 標準体重 =(身長m)2*22 という式を元にしてつくる。
VBAを使う ExcelなどのソフトにはVBAというプログラミング言語が用意されている。 それを用いるにはVisualBasicEditor というアプリケーションを動かして、そのなかでプログラミングする必要がある。
ツールメニューから マクロ を選び、更に Visual Basic Editor を選ぶ
VisualBasicEditorの 挿入 メニューから 標準モジュール を選ぶ
ここに関数の記述を書いていく Function stdw(h) と書いてEnterキーを押すと 自動的に EndFunction と下に入る。 hは仮引数と呼ばれることもある。 呼び出し側の引数を入れるための入れ物の名前がhなのである。このように値を入れる入れ物に名前のついたものを変数と呼ぶこともある。
この2行の間に関数の中身の記述を書く事になる。この2行の間に関数の中身の記述を書く事になる。 関数の値を戻すには 関数の名前 = 値 のように記述する。 値は値を持つ式でもよい。 したがってこの場合は stdw = (h / 100)*(h / 100)*22 と書けばよい。なお100で割るのは cm をmに直すためである。
間違いがないか確かめるため デバッグメニューから VBAProjectのコンパイル を選ぶ エラーが無ければ何も表示されない
ファイル メニューから 終了してExcelへ戻る を選ぶ
今、B5のセルに身長の数値が入っており、それを元にさきほど作った今、B5のセルに身長の数値が入っており、それを元にさきほど作った stdw( ) を使ってB9のセルに標準体重のデータを作りたいとする。 stdw( )の ( )の中はB5を入れればよい
同様にBMI指数を計算する関数 function bmi( h, w ) を作ってみよう。 hは身長(cm)、wは体重(kg)を受け渡されるための仮引数の変数である。 関数の中身は bmi = w / ( (h/100)*(h/100)) とすればよい。
同様に続き肥満度を計算する関数 function himan(h , w) を作ってみよう。 中身は既に定義した stdw( )関数を 呼び出すこともできるので。 himan = ( w – stdw(h) )/ stdw(h) *100 としてやることができる。 もちろん内部で標準体重を作ってもよい。
セルB5にある身長データとC5にある体重データを元にBMI指数を計算させるにはBMI指数を計算させるセルを選んでセルB5にある身長データとC5にある体重データを元にBMI指数を計算させるにはBMI指数を計算させるセルを選んで =bmi(B5,C5) のような式を書く。
同様に肥満度を計算させるにはセルを選んで =himan(B5,C5) のような式を書くとよい。
関数を使わないで求めた値と関数を作って求めた値は一致しているのを確認しよう。関数を使わないで求めた値と関数を作って求めた値は一致しているのを確認しよう。 関数を使う利点は何か? 一旦作ってしまえば処理や式の中身は覚えていなくても良いことなど。
抵抗の直列や並列合成抵抗を計算する関数を作ってみよう抵抗の直列や並列合成抵抗を計算する関数を作ってみよう
r1とr2の直列合成抵抗を求める関数 s( r1, r2 ) 並列合成抵抗を求める関数 p( r1, r2) Function s(r1, r2) s = r1 + r2 End Function ------------------------------------------------------ Function p(r1, r2) p = (r1*r2)/(r1+r2) End Function
セルA6,A7にある抵抗値を元にして直列合成抵抗は自作関数を使ってセルA6,A7にある抵抗値を元にして直列合成抵抗は自作関数を使って =s(A6,B6) のように求められる。 同様に並列抵抗は =p(A6,B6) として求められる。
関数を使う利点その2 関数の戻り値をまた別の関数の引数に用いるなどして複雑な処理を簡単に記述することができる。 セルA11,B11,C11にある抵抗値を元に図のような回路の合成抵抗も =s( A11, p( B11, C11) ) という具合に下線の関数の戻り値を関数の引数に使うことで求められる。これは関数を使わないやり方ではやや難しい。
やや複雑な処理をする関数 10進数を2進数に直す関数の作製
方針 • まず、10進を2進に直す方法を考える。 • 桁数が少ないものを作ってみる。 • 桁数を増やす方法を考える。 • 新しい処理のしかたを学びたくさんの桁に対応させる。
1桁目の2進数を返す関数 • Function dec2bin( a ) • aには数値が入って呼び出される。 • 2進数1桁目を求めるにはaを2で割った余りを求めればよい。 • VBAで余りを求める処理は Modという演算子を使う。 • 関数値を戻すには 関数名=値 として戻す。
2進1桁目を返す関数 • Function dec2bin( a ) dec2bin = a Mod 2End Function • と、1桁だけならこれでもよいが後の拡張のために • Function dec2bin( a ) b = a Mod 2 dec2bin = bEnd Functionとしておこう。これをVisualBasicEditorで作る。 • そして、Excelシートで動作を確認してみる。
次に、ここを3や1にかえてみて動作を確認する。次に、ここを3や1にかえてみて動作を確認する。 VisualBasicEditorを終了した後にここに =dec2bin(C11) と入れてEnterする。
2進2桁を求めるように変更 方針 2進1桁目をcという変数に覚えさせておく。 変数aの値を2で割った商を再びaに入れる。Int( )は整数に丸める処理。 変数bにaを2で割った余りを入れる。 関数の戻り値として2桁目をb、1桁目をcとして合成したものを戻す。 Function dec2bin(a) b = a Mod 2 c = b a = Int( a / 2 ) b = a Mod 2 dec2bin = b & c End Function
確認のためもう一度ここをクリックして3に変えて確認のためもう一度ここをクリックして3に変えて Enterキーを押してみる。
2進3桁を戻すように変更 方針 aを2で割った余りをbに入れる。 bとcを並べた文字列をcに再び入れる。 aを2で割った商を再びaに入れる。 aを2で割った余りをbに入れる。 bとcを並べた文字列をcに再び入れる。 aを2で割った商を再びaに入れる。 aを2で割った余りをbに入れる。 bとcを並べた文字列をcに再び入れる。 aを2で割った商を再びaに入れる。 関数の戻り値として cを戻す。 Function dec2bin(a) c = "" b = a Mod 2 c = b & c a = Int( a / 2 ) b = a Mod 2 c = b & c a = Int( a / 2 ) b = a Mod 2 c = b & c a = Int( a / 2 ) dec2bin = c End Function 同じ事を3回繰り返す
確認のためもう一度ここをクリックして5に変えてEnterキーを押してみる。確認のためもう一度ここをクリックして5に変えてEnterキーを押してみる。
2進3桁以上の処理に変更する為の新しいテクニック2進3桁以上の処理に変更する為の新しいテクニック 繰り返し処理、実現の方法 条件による分岐処理を取り入れる。IfThenElse文の導入。Goto 文の導入例 Loop1: ‘ラベルa = Int(a / 2) If ( a > 0 ) Then Goto Loop1 Endif
繰り返し 2進3桁以上への変更 Function dec2bin(a) c = "" Loop1: b = a Mod 2 c = b & c a = Int(a / 2) If a > 0 Then GoTo Loop1 End If dec2bin = c End Function ラベルLoop1 aを2で割った余りをbに入れる。 bをcの前にくっつけた文字列を再びcに入れる。 aを2で割った商を再びa に入れる。 もし a > 0 ならラベルLoop1に移行する。 関数の値としてcを戻す。 もはやここまでくると本格的なプログラミングになっている。
ここの値を10とか 255とかに変えて確かめる。 こうして、関数を使うとより複雑な処理も行うことができることがわかる。
自作関数を使う利点は 処理の記述が簡単になる • ややこしい変換式なども関数にしておけば中身の記述は不要で引数だけを記述すればよい。 • 関数の戻り値を別の関数の引数に使うこともでき、複雑な処理を簡単に記述できる。 • セルに数式を書くだけでは難しい事が関数を使うとできることもある。
便利な自作関数を作ったら • 他の人にも中身(ソースコード)を公開して使ってもらおう • 中身は教えたくないけど使う分にはかまわない時はパスワードを付けて見えなくすることもできる。