• ベストアンサー

階乗のマクロ

階乗のマクロを作りたいのですが、全然できません。どこを変えたらいいのか教えて下さい。ちなみに今こうなっています。 ------------------------------------------------ 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

  • 再帰処理を用いて階乗を求めるプログラム

    こんにちは 再帰処理を用いて階乗を求めるプログラムについて の質問です。 以下のように考えたのですが、 まったく駄目なようです。 どこをどのように直したらいいのか いまいちわかりません。 どなたか教えて下さい。お願いします。 Private Sub CommandButton1_Click() Dim n As Integer 階乗する数 Dim f As Integer 階乗する数の階乗した値 n = Val(TextBox1)   Do While f > 1 KEISAN n, f Loop TextBox2 = f End Function Function KEISAN(n, f) If n <= 1 Then f = 1 Else f = n * f(n - 1) End If End Function

  • エクセルで回数をカウントするマクロ

    いつもありがとうございます。 ボタンを押すごとに回数をカウントするマクロをつくりたいのです。ためしに、 Sub testcount() Dim a As Integer a = Cells(1, 1).Value a = a + 1 Cells(1, 1) = a MsgBox a End Sub とやってみて何とかできましたが、できればワークシートに数値を入れずに出来る方法はないのでしょうか? 贅沢いってすみません。

  • VB.netでの二分探索

    今VB.netで二分探索のプログラムを作ろうとしています。 普通の二分探索のプログラムを作ることはできたのですが再帰を使っての二分探索を行うプログラムを作ろうとして悩んでいます。 再帰を行うために普通の二分探索の一部をプロシージャとして分けるところまではできました。再帰をどこに入れればいいのか分からないのですがご教授願えますでしょうか? よろしくお願いします。下に現在できているコードを載せておきます。 Private Sub butSarch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butSarch.Click '捜索 Dim intS, intCnt, intL, intR As Integer intS = InputBox("探索したい数値を入力してください", "数値入力") intCnt = 1 intL = 0 intR = 9 fucTansaku(intS, intCnt, intL, intR) End Sub Private Function fucTansaku(ByVal intS2 As Integer, ByVal intCnt2 As Integer, ByVal intL2 As Integer, ByVal intR2 As Integer) As Integer Dim intM As Integer intM = (intL2 + intR2) \ 2 Do While intL2 <= intR2 If intA(intM) = intS2 Then Exit Do End If If intA(intM) < intS2 Then intL2 = intM + 1 Else intR2 = intM - 1 End If intM = (intL2 + intR2) \ 2 intCnt2 = intCnt2 + 1 Loop If intL2 <= intR2 Then MsgBox(intCnt2 & "回目の探索で見つかりました", MsgBoxStyle.OkOnly, "結果") Else MsgBox("見つかりませんでした", MsgBoxStyle.OkOnly, "結果") End If End Function

  • 何カロリーかを出すマクロを組みたいのですが

    200gあたり216カロリーの食材を140gあたり何カロリーかを出すマクロを組みたいのですが Sub test2() Dim int量 As Integer Dim intkcal As Integer int量 = 140 MsgBox int量 & "は、" & intkcal & "カロリーです" End Sub これしか式が作れなかったのですが どう計算すれば指定した量のカロリーを出せるのでしょうか? 小学生レベルだと思いますが教えてください。 食材サイトで検索したら答えは、152kcalでした。

  • エクセルのマクロについて

    行を選択し、関数を数値に変換するために下記のようなマクロを作成しました。 選択する行数が少ないと実行でるのですが、一度にたくさんの行を選択すると下のようなエラーが返されます。 「実行時エラー"424"」オブジェクトが必要です。 どこが間違いなのか教えて頂ければ助かります。 Sub TextValue() '選択された行範囲をデータに変換します。 Dim rc As Integer Dim rngCell As Range Dim sMsg As String rc = MsgBox("データに変換しますか?", vbOKCancel) If rc = vbCancel Then Exit Sub sMsg = "変換する範囲を選択して下さい。" Set rngCell = Application.InputBox(Prompt:=sMsg, Type:=8) rc = MsgBox("選択されている範囲の関数を" & vbCrLf & "データに変換します。" & vbCrLf & _ "選択された行範囲は " & rngCell.Address(0, 0) & vbCrLf, _ vbOKCancel, "処理を確認してください。") If rc = vbCancel Then Exit Sub rngCell.Select Selection.Value = Selection.Value End Sub Excel2002  OSはXPです。 宜しくお願い致します。

  • Excel VBAで別ブックのマクロから配列を取る

    Excel VBAで別ブックのマクロで計算した結果を配列で渡したいのですが、上手い方法が見つかりません。 同じブック内であれば、 Function GetAry(Imax As Integer, ByRef MyAry As Variant) as Boolean のような関数を作れば、GetAry = True の時に返値の MyAry が有効であるという判断ができますが、この関数を別ブックから使う場合は、参照渡しができません。 これはVBAの仕様なので仕方ないとして、以下のようなマクロを組んでみました。 '------------------------------------------------------- ' Book1.xlsm(呼び出される側) '------------------------------------------------------- Function MyAry(Imax As Integer) As Variant Dim i As Integer Dim SubAry() As Variant If Imax > 10 Then MyAry = False Else For i = 1 To Imax ReDim Preserve SubAry(i) SubAry(i) = i Next MyAry = SubAry End If End Function '------------------------------------------------------- ' Book2.xlsm(呼び出す側) '------------------------------------------------------- Sub GetMyAry() Dim DataAry As Variant Dim Imax As Integer Imax = 11 DataAry = Application.Run("Book1!MyAry", Imax) If DataAry <> False Then MsgBox UBound(DataAry) Else MsgBox DataAry End If End Sub '------------------------------------------------------- Imax = 11 であれば、メッセージボックスに False が表示されますが、Imax = 10 だと当然ですが「型が一致しません」というエラーになります。 エラートラップで誤魔化そうかとも思ったのですが、もっとスマートな方法がないでしょうか。 よろしくお願いします。

  • VBE Excelのマクロがわかりません(IF関数)

    エクセルのマクロがわかりません。教えてください 問題は5人の簿記の点数を入力し5人の合計点・最高点・最低点を表示するプログラムを作成する。というものです。 Sub test() Dim boki as integer Dim sum as integer Dim max as integer Dim min as integer For A = 1 to 5 boki = InputBoxx("簿記の点数入力") goukei = goukei + boki ?????? Next A Msgbox"5人の合計点は"&A Msgbox"5人の最高点は"&A Msgbox"5人の最低点は"&A End Sub IF関数を使って??の部分を作るようなのですが、いまいちよく分からないので教えてください。 bokiは簿記 sumは合計 maxは最高 minは最低のことを現してます。

  • マクロ

    宜しくお願いいたします セルを選択するマクロですが、何処か間違っているので 実行すると、K25のみ選択されてしまいます 一行おきに選択したいのですが 以下のマクロです Sub セルの選択2() Dim ColPos As Integer Dim RowPos As Integer For ColPos = 1 To 11 Step 2 For RowPos = 5 To 25 Step 2 Cells(RowPos, ColPos).Select Next Next End Sub

  • マクロの変数のことで

    Sub test() Dim x As Range, y As Range Dim i As Integer i = 0 Set y = Application.InputBox("", "Paste", Type:=8)  For Each x In Selection   x.Cut y.Offset(i, 0)   i = i + 1  Next x End Sub 上記マクロは、選択されているセルを切り取って、指定したセルを基点として下方向に貼り付けるものです。 "i"の初期値を"1"にすると成功しますが、"0"だとエラーになります。"-3"などにすると、値がゼロになった時点でエラーになります。なぜ"i"がゼロになるとエラーになってしまうのでしょうか?  指定したセルを基点にして貼り付けられるようにするには、どうすればいいでしょうか?

  • Excel2000のVBAでわからないことがあります。

    こんなものを作ってみました。 Sub 理想体重() Dim Sin As Long Dim Tai As Long Sin = InputBox("あなたの体重は?", "体重") Tai = InputBox("あなたの身長は?", "身長") If Tai >= Sin * Sin * 21 / 10000 + 3 Then MsgBox "太りすぎです" ElseIf Tai <= Sin * Sin * 21 / 10000 - 3 Then MsgBox ("痩せすぎです") Else MsgBox ("標準です") End If End Sub 結果はきちんと出てくるのですが、最初の変数宣言のところがわかりません。 最初は、Longではなく、Integerにしたのですが、オーバーフローのエラーが出たので、Longに変更したところ、きちんと出てくるようになりました。 しかし、なぜ、Integerではだめなのかがわかりません。私としては、Integerは32,767までの数字が入るのだから、身長や体重を入れたぐらいだと、オーバーフローにはならないのではないかと考えています。 きっと、根本的なものがわかっていないんだとは思うのですが、違いを教えていただければうれしいです。 よろしくお願いいたします。 (VBAを勉強したばかりです。)

専門家に質問してみよう