- ベストアンサー
VBAで関数をつくる
If文やForNext構文を駆使して階乗、順列、組み合わせの計算を実現する関数を作りたいです。どのように考えてどのようなプログラムを書けばよいか教えてください!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
階乗については、 Function Fact(n) as long Fact = 1 for i = 1 to n Fact = Fact * i next i End Function で最低限のものは実現できます。 最低限という意味は、エラーが起きたときの対応ができていないということです。 例えば、負の数を引き渡したときは、1が返されます。 また、171以上の数を引き渡すと、オーバーフローしますし、 longの定義上正確に計算できるのは、17までだと思います。 組み合わせについても、 Function Combi(n,r) as long Combi = Fact(n)/(Fact(r)*Fact(n-r)) End Function で最低限のものは作れますが、やはりFactの制限に引っかかります。 factというファンクションを使わなければ、 ループを使い n(n-1)(n-2)(n-3)・・・(n-r+1)/r! を計算することによって、多少は上限が増えますが、どの時点で正確でなくなるのか、どの時点でオーバーフローするのかなどを検証しておく必要はあります。 それよりも完成度の高いものを目指す場合は、数自体の構造体を自分で作り、それらを演算させるプログラムを組まなくてはいけません。演算する速度は遅くなりますが、VBAで作れないわけではありません。 何にしても、計算の上限値はどこかに設定しておかなくてはいけませんし、上限を越した際のエラー処理の方法を考えておく必要があります。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
順列。組み合わせともに公式に、階乗が現れてきます。 階乗は Sub test01() n = 1 For i = 1 To 17 n = n * i Cells(i, "A") = n Next i End Sub のようにすれば計算されますが、エクセルの画面のセルに表示は上記ぐらいが限度です。 ですから用途については、非常に限られています。エクセルは不向きでしょう。 これ以上を考えるなら、数学的アルゴリズムの考察が難しく、この質問振りからでは、そちらの知識のほうが追いつかないのでは。 ーー 質問が漠然としすぎ。 多桁、近似の計算のアルゴリズムなどに習熟しているか まず後者の習得でしょう。 私は知らないが、理系の研究などでは、既成の専門ソフトを使うのでは。 素人が安易に作ると危ない。
まず大事なのは、階乗・順列・組合せの計算を具体的に記述することです。 それが出来れば、後はその考え方をコードにするだけです。 例:(あくまでも一例) Public Sub kaijo() Dim i As Integer Dim j As Long j = 1 For i = Cells(1, 1).Value To 1 Step -1 j = j * i Next i Cells(1, 2).Value = j End Sub これで、A1に入っている数字の階乗の計算結果をB1に表示できます。 見本にもなっていませんが、こういう感じで作っていけばいいかと…。
お礼
詳しい説明をどうもありがとうございました。おかげで疑問が解決しました!