
VBAを学習中の初心者です。
学習の一環として素数を求めるプログラムを作成しているのですが苦戦しています。
過去質問に同じようなものが見当たらなかったので質問させて頂きます。
指定した数までの素数だけをDebug.Printで出力するプログラムを組みたいです。
引数を素数か否か判定し返すFunctionとその結果を出力するかしないか決めるプログラムは組めたのですが、素数だけを選んで出力するというプログラムがどうしても分からず苦戦しています。
今組んでいるプログラムでは、引数が素数じゃなかった場合何も出力せず、素数だった場合その数までの全ての数字(引数が7だったら2,3,4,5,6)が出力されてしまうという状態です。
ここから素数だけを出力できるようにするにはどうコードを書いたらいいのでしょうか?
できれば解答ではなく、ヒントを教えて頂けるととても嬉しいです。
宜しくお願いします。

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

No.9
- 回答日時:
数学は好きですか?ある程度習熟して、
integerの最大値はいくら?
このマクロ、どの位時間掛かる?やり方変えよう
等を考えつつマクロを作るようになったら、挑戦してみて下さい。
https://projecteuler.net/archives
No.8
- 回答日時:
こんばんは!
横からお邪魔します。
ごくごく単純にやってみました。
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
No.6
- 回答日時:
スマートフォン 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
No.5
- 回答日時:
こんばんは。
私がコードを出してしまったら、自力解決のヒントにはなりませんが、出されたコードはエラーを出しますよね。
それは分かっていますね。
後はポイントだけを指摘しておくことにします。
Sub Sosu の中
If IsPrime(7)=True Then '引数になぜ定数を入れるの?そこは、変数のはずです。
n=n+1 'If構文の中に入れたら、進んでいきません。
If 構文の締めは、End If
Function IsPrime
Next I 'I であるはずがありませんね。
以上で問題なく動くはずです。
No.4
- 回答日時:
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)
No.3
- 回答日時:
こんにちは。
>できれば解答ではなく、ヒントを教えて頂けるととても嬉しいです。
素数か否か判定するのでしたら、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の勉強とはかなり違う所にいるような気がします。
確か、ここのカテゴリで、素数の質問は数年前にあった気がします。
No.2
- 回答日時:
指定した数が十分小さいならば、
判定し返すFunctionを、1から指定した数まで繰り返し実行して、素数の引数だった場合だけ出力する
指定した数が膨大ならば、
効率的に実行するために先達のアルゴリズムを取り入れる
例) エラトステネスの篩
https://ja.wikipedia.org/w/index.php?search=Siev …

No.1
- 回答日時:
数:xが与えられたとき、それが素数かどうか、判定する方法
2からxまで、変数:zについて1つづ増加させ、以下の処理を繰り返す。
1.x÷zの商と余りを求める。
2.余りが0でない場合は、割り切れないので、次の繰り返しへ
3.余りが0で、商が1の場合は、素数になる。(自分自身以外に割りきれないから)
4.余りが0で、商が1以外の場合は、素数でない。
実際に確認していませんが、上記でやってみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 3つの倍精度浮動小数点値の平均を求めて、3つの引数全てを平均値に変更するメソッドを作成し、キーボード 1 2022/07/13 16:04
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sprintfについて
-
画像がテキスト表示になる。
-
perl 読込ファイルの分割について
-
重複するデータを抽出できる秀...
-
perlでの出力先設定
-
文字コードの変換(Shift-JISか...
-
Perlのプログラミングについて
-
エディターでは改行なのにメモ...
-
エクセルVBAで素数だけを出力す...
-
PerlでIf-Modified-Since取得
-
Perlでファイルの末尾から指定...
-
print文で&(半角)文字のエラー...
-
C言語の問題について
-
log2の「正確な」計算方法
-
Perlで着メロDLカウント
-
正規表現で"-" "0-9"以外を削除...
-
Perlを使った単語出現カウント
-
バッチファイルの作り方(CSV→...
-
Perlでのテキスト処理について
-
全角と半角文字が混在している...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
sprintfについて
-
重複するデータを抽出できる秀...
-
バッチファイルで、記号を含む...
-
DOSコマンドで、標準出力を出力...
-
[Perl]ファイル出力のエンコー...
-
テキストファイルから日本語部...
-
Perl<->Oracle間での文字化けに...
-
Perl内でJavaScri...
-
エクセルVBAで素数だけを出力す...
-
log2の「正確な」計算方法
-
LWPでPOST送信した後に送信先に...
-
open (FILEHANDLE,"< $filename...
-
文字コードの変換(Shift-JISか...
-
Perlでファイルの末尾から指定...
-
ファイル出力の改行コードをLFに
-
perl初心者です。宜しくお願い...
-
アルファベット、数字を読み込...
-
Perl で出力するHTMLファイルを...
-
sprintfで10進数を桁数指定で16...
おすすめ情報
たくさんのご回答ありがとうございます!
ご指摘頂いたので一度組んだコードを記載してみようと思います。
①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
①がメインのプロシージャ、②が③で返ってきた判定を出力するプロシージャ、③は指定数を素数か否か判定して返すプロシージャです。
③で素数かどうか判定した数を②で出力するか否か決め、素数だった数字のみDebug.Printしたいのですが、悩み続けています…。