電子書籍の厳選無料作品が豊富!

VBA初心者です
次の問題が分かりません

5から1000までの5の倍数の合計と平均値を求め、1回だけmsgboxに表示しなさい。

下のように作ってみたのですがうまくいきません…
どう直したらいいのでしょうか?

Public Sub ()

For i = 5 To 1000 Step 5

a = a + i

Next i

x = a / 200

MsgBox a And x

End Sub

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

  • for文は必須と考えてください

      補足日時:2016/12/22 00:20

A 回答 (7件)

こんばんは!



すでに回答は出ていますので、参考程度で・・・

Sub Sample1()
Dim i As Long, cnt As Long, myVal As Variant
For i = 5 To 1000 Step 5
cnt = cnt + 1
myVal = myVal + i
Next i
MsgBox "合計:" & myVal & vbCrLf & "平均:" & myVal / cnt
End Sub

こんな感じでも大丈夫だと思います。m(_ _)m
    • good
    • 1
この回答へのお礼

ありがとうございます。勉強になります!

お礼日時:2016/12/22 00:22

こんにちは。



私からも、少しアドバイスをさせていただきます。もううんざりしているかもしれませんが。
学校の宿題か何かでしょうか。そして、これは、高校でしょうか、大学でしょうか。

質問の直接の回答なら、

>MsgBox a And x
これを、a & " " & b
とでもすればよい、ということと、Sub の後のプロシージャー名が抜けているということです。
VBEの中で実際に動かせば、分かることです。

だから、こうすればよいわけです。
'---------------
Sub MacroTest1()
For i = 5 To 1000 Step 5
a = a + i
cnt = cnt + 1
Next
x = a / cnt
MsgBox a & " /" & x
End Sub
'-----------------
この書き方は、VBAでなくてもVBScript上でも結果が出るようになっています。

これ以上、何か要求すべきものがあるのか、VBAの習熟度や学習進度によって変わってきます。ただ、私自身は、前回と同じように、If i Mod 5 =0 Then のほうが適しているような気がします。

これは、数学でいう「等差数列」です。
ですから、2の倍数・5の倍数、平均値を出すなど、一応、数学の設問にも答えられるだけのコードが出来ればベストですが、そこまではなかなか行きません。日本では、アメリカの一部の大学のように入門者に高いレベルを要求しません。

それで、ちょっと気になっていたのは、いわゆる「VBAのお作法」のことです。「VBAのお作法」などいらない、という人もいれば、それは大事だという人もいますが、いずれにしても、各人各様で発言し始めると、なし崩しになってしまいます。つまり、全体には直接影響がないけれども、ある程度の経験者がそれを触れないでいると「みっともない」と値踏みされてしまいます。

私が気になった用語。(たぶん、ご質問者さんには、直接関わりのない部分だと思っています。)
「サブルーチン」、「初期化」、「Currency 変数」、「Public ステートメント」

確かに、「サブルーチン」では、「初期化」は必要なんですが……。
どれ一つとっても、昨日・今日覚えた人が必要な「VBAのお作法」ではないと思います。

なお、「等差数列の和」の公式に当てはめると、このようになるかと思います。
まだ、十分な検証をしていませんが、Excelで作られる関数などは、全部、こうした数学で成り立っているとも言えます。

'標準モジュール
Private Function 等差数列(初項 As Long, Optional 末項 As Long, Optional 項数 As Long, Optional 公差 As Long)
 Const Opt As Boolean = True '初項を含める(True), 含めない(False)
 '項目がないものには、0か、ブランクにする。ただし、初項がないと成り立たない
 If 初項 Mod 公差 <> 0 And Opt = False Then
  初項 = Int((初項 + 公差) / 公差) * 公差
 End If
 If 公差 = 0 Then
  公差 = (末項 - 初項) / (項数 - 1)
 End If
 If 末項 = 0 Then
  末項 = 初項 + (項数 - 1) * 公差
 End If
 If 項数 = 0 Then
  項数 = (末項 - 初項) / 公差 + 1
 End If
 等差数列 = 1 / 2 * 項数 * (2 * 初項 + (項数 - 1) * 公差)
End Function
    • good
    • 1

No.2です。



> aの初期化とはどういうことですか?

forループに入る前に a = 0 を行うことを指します。
変数を定義すると自動的に0となりますが、プログラムとしては明示的に初期値を代入しておくことは大切な事です。
ループに使用する変数iはfor文で初期値5を明示的に指定していますので問題無いです。
あ!aに加算した数値の個数を保持する変数を設けた場合はその初期化も忘れずに行うようにして下さい。

参考まで。
    • good
    • 1

後だしジャンケンのようで申し訳ありませんが・・・


>Public Sub ()
サブルーチンの名前が必要です。
(No.3さん が暗黙で指摘)

変数( i や a)の最初に定義しておくこと
(No.3さん が暗黙で指摘)

初期値は0になるが、初期化(初期値を代入しておく)は忘れないこと。
(No.2さん が指摘)

>MsgBox a And x
たぶんこれでは、VBAが理解できない。
っというか、 「And」 は論理和などに使用される別の関数
皆さんが指摘されているように、人間が見てもわかる形式で表示するように、正しく命令する必要あります。
ついでに、No.1さんとNo.3が使用している「&」は、「文字列を足しなさい(つなぎなさい)」という、「and」とは別の意味です。


>5から1000までの5の倍数の合計と平均値を求め
題意から厳密に考えるならば、やはり「For...Next」が基本
「5の倍数」は、If分を使いたいかな?

for......
if i mod 5 = 0 then '5で割ったあまりが0ならば(=5の倍数)
 a=a+i      ’i を足して
 count=count+1 ’足した回数を数えておく(No.1さんとNo.2さん指摘)
end if
next

No.3さんが指摘しているような手抜き(←失礼っ!!)して、コンピュータに楽をさせてやることも必要ですが、
次に「13から987までの7の倍数」とかになると、大変ですよ!
質問者さんも「Step 5」を使用して、ちょっと手抜きしていますが、最初の倍数を探す必要が出てきます。

No.3のようなベテランになると
「出発点の5は最初の倍数、最後の1000も5の倍数だから、手抜きしちゃえーっ」
と考えてもいいですが、まだ早いかな?

>Dim total As Long 
【Integer型じゃ足りない。Longで十分かっ!】
>Dim average As Currency
【平均だから、小数点以下が必要だぞっ】
※【】内はかってに代弁しています。
と、わかるぐらいになってからにした方がいいと思います。

それでは、VBAの勉強頑張ってください。
    • good
    • 1
この回答へのお礼

まとめてくださりありがとうございます!

お礼日時:2016/12/22 00:23

for文するまでもないです。



【値の取得】
5~1000までのうち、5と1000、10と995・・・と1005の数字になる組合せは1000 / 2 / 5 = 100回あります。
よって、値の取得は
(5 + 1000) * (1000 / 2 / 5) = 100500
で導き出されます。

【平均の取得】
5~1000までのうち、step 5である回数は1000 / 5 = 200回あります。
よって、平均の取得は
100500 / (1000 / 5) = 502.5
で導き出されます。

【実装してみる】
Public Sub test()
Const STEP_NUMBER As Long = 5
Const MAX_NUMBER As Long = 1000

Dim total As Long
total = (STEP_NUMBER + MAX_NUMBER) * (MAX_NUMBER / 2 / STEP_NUMBER)

Dim average As Currency
average = total / (MAX_NUMBER / STEP_NUMBER)

MsgBox "合計=" & CStr(total) & ", 平均=" & CStr(average)
End Sub
    • good
    • 2
この回答へのお礼

すいません、説明が足りませんでした。for文がテーマのときの講義の課題なんです。

お礼日時:2016/12/22 00:19

まず、いきなりforループに入るのではなくaの初期化を忘れずに。


次に、、、

> x = a / 200

ここがちょっと寂しい。(^^;
iは5刻みで回るので、これとは別に何回forループを回ったかをカウントする変数を設け
その変数でaを割るんぼが適当です。
その変数の初期化も忘れずに。

メッセージボックスへの出力は合計値と平均値であることが分かるよう見出しを付けるとよいでしょう。

参考まで。
    • good
    • 1
この回答へのお礼

aの初期化とはどういうことですか?

お礼日時:2016/12/22 00:09

msgbox "合計=” & a & vbcrlf & "平均=” & x



とするとか。
まあ、あとは200という数字を暗算で出すよりは、
ループの中で+1してカウントしていったほうが良いような気もする。
    • good
    • 1
この回答へのお礼

msgboxやり方ありがとうございます
ループの中で+1してカウントとはどういうことですか?

お礼日時:2016/12/22 00:08

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