プロが教えるわが家の防犯対策術!

VBAを学習中の初心者です。
学習の一環として素数を求めるプログラムを作成しているのですが苦戦しています。
過去質問に同じようなものが見当たらなかったので質問させて頂きます。

指定した数までの素数だけをDebug.Printで出力するプログラムを組みたいです。
引数を素数か否か判定し返すFunctionとその結果を出力するかしないか決めるプログラムは組めたのですが、素数だけを選んで出力するというプログラムがどうしても分からず苦戦しています。
今組んでいるプログラムでは、引数が素数じゃなかった場合何も出力せず、素数だった場合その数までの全ての数字(引数が7だったら2,3,4,5,6)が出力されてしまうという状態です。
ここから素数だけを出力できるようにするにはどうコードを書いたらいいのでしょうか?

できれば解答ではなく、ヒントを教えて頂けるととても嬉しいです。
宜しくお願いします。

質問者からの補足コメント

  • たくさんのご回答ありがとうございます!
    ご指摘頂いたので一度組んだコードを記載してみようと思います。

    ①Sub Main()
    Call Sosu(7)
    End Sub

    ②Sub Sosu(ByVal max As Integer)
    Dim n As Integer
    n=2
    Do While n < max
    If IsPrime(7)=True Then
    Debug.Print n
    n=n+1
    Loop
    End Sub

    ③Function IsPrime(ByVal n As Integer)As Boolean
    Dim x As Integer
    For x=2 to n-1
    If n Mod x = 0 Then
    IsPrime = False
    Exit Function
    Else
    IsPrime = True
    End If
    Next I
    End Function

      補足日時:2015/12/07 17:39
  • ①がメインのプロシージャ、②が③で返ってきた判定を出力するプロシージャ、③は指定数を素数か否か判定して返すプロシージャです。
    ③で素数かどうか判定した数を②で出力するか否か決め、素数だった数字のみDebug.Printしたいのですが、悩み続けています…。

      補足日時:2015/12/07 18:23

A 回答 (9件)

あなたが作ったプログラムは、ほぼ合ってますが、細かいところででのケアレスミスがあります。


以下、きちんと動作するプログラムです。あなたが、作ったプログラムに修正を多少加えました。
----------------------------------------------
Sub Main()
Call Sosu(7)
End Sub

Sub Sosu(ByVal max As Integer)
Dim n As Integer
n = 2
Do While n <= max
If IsPrime(n) = True Then
Debug.Print n
End If
n = n + 1
Loop
End Sub

Function IsPrime(ByVal n As Integer) As Boolean
Dim x As Integer
Dim sho As Integer
Dim amari As Integer

For x = 2 To n
amari = n Mod x
sho = n \ x
If amari = 0 Then
If sho = 1 Then
IsPrime = True
Else
IsPrime = False
End If
Exit Function
End If
Next x
End Function
---------------------------------
実行結果
2
3
5
7
-------------------------------
    • good
    • 0
この回答へのお礼

ありがとう

ご回答頂きありがとうございました!
いろいろなことを教えて頂き、大変参考になりました。
まだエクセルVBAの勉強は始めて一週間ほどでまだフローチャートも覚束ない有様なので、
今後きちんとプログラムが組めるようになったら9番さんから教えて頂いたサイトの問題にも挑戦したいと思います。
ベストアンサーは問題点を指摘して頂いた5番さんとすごく悩んだのですが、
結果答えを教えて頂く形になりましたが自分が今どこが分からないのか、何を知らないのかを知るきっかけを下さった7番さんにしたいと思います。
\演算子を使う考えが全く浮かばなったので、まだまだ基礎がボロボロですね…。
皆様本当にありがとうございました!
頂いた解答を複数個お気に入りするみたいな機能欲しいです。。。

お礼日時:2015/12/08 09:22

数学は好きですか?ある程度習熟して、


integerの最大値はいくら?
このマクロ、どの位時間掛かる?やり方変えよう
等を考えつつマクロを作るようになったら、挑戦してみて下さい。

https://projecteuler.net/archives
    • good
    • 0

こんばんは!


横からお邪魔します。
ごくごく単純にやってみました。

Sub Sample1()
Dim i As Long, k As Long, str As String
For i = 2 To 7 '← 7までの整数//
For k = 2 To i
If i Mod k = 0 Then Exit For
Next k
If i = k Then
str = str & i & ","
End If
Next i
Debug.Print Left(str, Len(str) - 1)
End Sub

※ 余計なお世話だったらごめんなさいね。m(_ _)m
    • good
    • 0

スマートフォン andoroidのものですが


RFO-BASIC
です。

OPTION ARITHMETIC DECIMAL_HIGH
LET FN$="素数.csv"
OPEN #1:NAME fn$
ERASE #1
PRINT #1:"n,n^n+1,素数,桁数"
FOR N = 1 TO 20
LET flag = 0
FOR i=2 TO n/2
LET a = n/i
LET b = INT(a)
IF a = b THEN
REM PRINT "not 素数ではない。"
LET flag = 1
EXIT FOR
END IF
NEXT i
IF flag = 0 THEN
PRINT #1:n
END IF
NEXT n
CLOSE #1
END
    • good
    • 0

こんばんは。



私がコードを出してしまったら、自力解決のヒントにはなりませんが、出されたコードはエラーを出しますよね。
それは分かっていますね。

後はポイントだけを指摘しておくことにします。

Sub Sosu の中

If IsPrime(7)=True Then '引数になぜ定数を入れるの?そこは、変数のはずです。
n=n+1 'If構文の中に入れたら、進んでいきません。
If 構文の締めは、End If

Function IsPrime

Next I 'I であるはずがありませんね。

以上で問題なく動くはずです。
    • good
    • 0

1:指定の数を変数Aにセット。

(A=7)
2:引数を素数か否か判定し返すFunctionに変数Aを渡し、結果を変数Bにセットする。
3:結果を出力するかしないか決めるプログラムの結果を変数Cにセットする。
4:変数Cが出力の場合、素数を選んで出力するプログラム。(2,3,4,5,6)
となっていませんか?

以下のようにすればどうでしょう?
1:指定の数を変数Aにセット。(A=7)
2:変数Bに1をセットする。
3:引数を素数か否か判定し返すFunctionにBを渡し、結果を変数Cにセットする。
4:変数Cで、素数だった場合、変数Bを表示する。
5:変数Bをカウントアップ(+1)する。
6:変数Bが変数A以下だったら、3に戻って繰り返す。(2~7)
    • good
    • 0

こんにちは。



>できれば解答ではなく、ヒントを教えて頂けるととても嬉しいです。

素数か否か判定するのでしたら、Boolean型だと思いますが……。
以下は、Boolean型のユーザー定義関数(User defined function)とした場合です。
これでうまくいかないなら、コード全部を見せたほうが早いですね。

For i =1 To 目的の数まで
If 判定Function(i) Then 'True の時のみ
  buf = buf & "," & i
 End If 
Next i

Debug.Pring buf

でも、ここらが書けないで、素数の出力を出すというのは、VBAの勉強とはかなり違う所にいるような気がします。
確か、ここのカテゴリで、素数の質問は数年前にあった気がします。
    • good
    • 0

指定した数が十分小さいならば、


判定し返すFunctionを、1から指定した数まで繰り返し実行して、素数の引数だった場合だけ出力する

指定した数が膨大ならば、
効率的に実行するために先達のアルゴリズムを取り入れる
例) エラトステネスの篩
https://ja.wikipedia.org/w/index.php?search=Siev …
    • good
    • 0

数:xが与えられたとき、それが素数かどうか、判定する方法


2からxまで、変数:zについて1つづ増加させ、以下の処理を繰り返す。
1.x÷zの商と余りを求める。
2.余りが0でない場合は、割り切れないので、次の繰り返しへ
3.余りが0で、商が1の場合は、素数になる。(自分自身以外に割りきれないから)
4.余りが0で、商が1以外の場合は、素数でない。

実際に確認していませんが、上記でやってみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!