• ベストアンサー

階乗のマクロ

階乗のマクロを作りたいのですが、全然できません。どこを変えたらいいのか教えて下さい。ちなみに今こうなっています。 ------------------------------------------------ Sub exam5() Dim intA As Integer Dim intB As Integer Dim intC As Integer intA = Application.InputBox("数値を入力してください。") intB = (intA - 1) intC = (intA) * (intB) MsgBox (intC) End Sub Function kaijou(intA As Integer, intB As Integer) As Integer kaijou = intA * intB End Function ------------------------------------------------ どうかお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.6

No.4です。 > kaijou = intn * intn - 1 が惜しいですね。 この↑計算ですと、 「n かける n ひく 1」 括弧を忘れているのだとしても、 「n かける (nひく1)」 になってしまいます。 階乗の定義は、 n!=n×(n-1)! 「n かける (n-1)の階乗」 ですので… -- もうちょっとヒントを書くと、 5!=5×4! 4!=4×3! 3!=3×2! 2!=2×1! 1!=1×0! 0!=1 と言う風に順番に計算します。 この場合はループの処理は必要なくなります。 -- Function kaijou(n As Integer) As Integer のつもりで「int」は誤記でした。intnと読み替えて頂いてOKです。

その他の回答 (5)

  • -boya-
  • ベストアンサー率35% (176/494)
回答No.5

No.2の-boya-です。 学習中ということで、丸々回答ではなくアドバイスを。 アドバイスを「'」の行に追記しましたので参考に。 Sub exam6() Dim intn As Integer 'intAも定義した方がよいです。 intn = Application.InputBox("数値を入力してください") intA = kaijou(intn) MsgBox (intA) End Sub Function kaijou(intn As Integer) As Integer '↑intnが大きくなった場合、返ってくる値がIntegerの範囲(-32,768 ~ 32,767) 'を超えてしまう場合があるので、もう少し大きい方がいいと思います。 If intn <> 0 Then '↑「intnが0じゃ無かったら」の意味なので、この場合は逆です。   kaijou = 1 Else   kaijou = intn * (intn - 1)   '↑追記したように括弧が必要。   'コレでは1度しか掛け算をしていないので、繰り返す必要があります。   '先ほど書いた「Do ~ Loop」等を使って繰り返し掛け算をします。   'n! = n × (n-1) × ((n-1)-1) × (((n-1)-1)-1) ・・・ ×1   'と言うように、掛け算を1になるまで繰り返される様にします。 End If End Function

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.4

階乗: 5!=5×4×3×2×1=120 ですね。 例題とかだと再起呼び出しが使われますね。 n!=n×(n-1)! ただし、 0!=1(←って定義だっけ? Function kaijou(int n As Integer) As Integer if n<>0 then   kaijou = ~  else   kaijou = ~  endif End Function の書き方だとどうなるか、考えてみてください。

macky69
質問者

補足

このように考えてやってみたのですがうまくいかないです。どこが悪いんでしょうか? ------------------------------------------------ Sub exam6() Dim intn As Integer intn = Application.InputBox("数値を入力してください") intA = kaijou(intn) MsgBox (intA) End Sub Function kaijou(intn As Integer) As Integer If n <> 0 Then kaijou = 1 Else kaijou = intn * intn - 1 End If End Function

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.3

エクセルでやれることはエクセルでということであれば 階乗はワークシート関数を使えば手っ取り早いんですが。 re=InputBox("数字") MsgBox (Application.WorksheetFunction.Fact(re)) まぁ2番さんのようにコードで自作する方がアルゴリズムの勉強にはもってこいかと思いますが。

  • -boya-
  • ベストアンサー率35% (176/494)
回答No.2

階乗の計算であれば、繰り返す必要がありますね。 例えばこんな感じで、、、 Dim intA As Integer Dim ans ans = 1 intA = Application.InputBox("数値を入力してください。") Do Until intA = 0 ans = ans * intA intA = intA - 1 Loop MsgBox ans あくまで、InputBoxで入力される値が正の整数であると いう前提で書いてます。それ以外であるかどうかの チェックなどは省いてます。 あと、階乗計算の結果がIntegerの範囲を超えてしまう 場合があることも考慮した方がいいと思います。 以上、簡単ですが。

macky69
質問者

補足

関数を使いたいのでFunction~をつかうとどうなるのでしょうか?

  • S-Fuji
  • ベストアンサー率36% (592/1624)
回答No.1

 それではただのかけ算です。 階乗演算子は「^」です。

macky69
質問者

補足

「*」を「^」に変えてみましたがうまく階乗の値が出ません。他にどこに問題があるでしょうか。

関連するQ&A