質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

3回答

4474閲覧

10個の数字の最大値について マクロです。

hoshizorararara

総合スコア9

0グッド

0クリップ

投稿2017/07/14 06:51

編集2017/07/14 06:55

学校でこのような課題が出ました。書いてあるとおりにやればできると先生はおっしゃっていましたが、プログラミングをまったくやったことがないのでよくわかりません。自分で手探りで書いてみたのですがうまくいきません、どこが間違っているか教えていただけませんか?

例題3:例題2で配列Xに格納した10個の数値データの中の最大
値を求めるアルゴリズムを日本語で書きなさい。
考え方:
1.配列の最初の位置にある数を仮の最大値とする。
2.この仮の最大値と次のデータを比較する。```> ここに言語を入力
コード

3.次のデータの方が大きければ、それを仮の最大値とする。 4.データがなくなるまで、仮の最大値とデータの比較を繰り 返す。 5.データがなくなった時点で処理を終了する。 6.この時点の仮の最大値は、真の最大値である。 7.その真の最大値と格納場所を出力する。 解答例: 変数m:仮の最大値を示す変数 変数k:仮の最大値の格納場所(配列)を示す番号となる変数 変数i:比較する側の格納場所(配列)の示す番号となる変数 手順: 1.変数mにX(1)を代入 2.変数kに1を代入(配列1番目ということ) 3.変数iに2を代入(配列2番目ということ) 4.変数iが10以下である限り、次の①と②の処理を繰り返す ①もし、X(i)がmより大きいならば、 (1)mにX(i)を代入する(仮の最大値の交換) (2)kにiを代入する(仮の最大値の格納場所を更新) ②変数iにi+1の値を代入する。 5.mとkの値をモニターに出力 以下自分が書いてみたものです Option Explicit Sub kadai() Dim i As Long Dim data As Double Dim m As Double Dim k As Double Dim x(10) As Double For i = 1 To 10 data = InputBox("数値を入力してください。") Range("j" & i) = data Next m = x(1) k = 1 i = 2 For i = 1 To 10 If m < x(i) Then m = x(i) k = i End If i = i + 1 Next Range("a" & i) = m Range("k" & i) = k MsgBox ("入力をありがとうございました") End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

問題点は指摘済みですが、課題の意図とは使用するLoopが違うのかと思います。
forループ使っちゃうと、iに2を代入したのが意味ないですからね。

'3.変数iに2を代入(配列2番目ということ) i = 2 '4.変数iが10以下である限り、次の①と②の処理を繰り返す Do While i <= 10 '①もし、X(i)がmより大きいならば、 If m < x(i) Then '(1)mにX(i)を代入する(仮の最大値の交換) '(2)kにiを代入する(仮の最大値の格納場所を更新) m = x(i) k = i End If '②変数iにi+1の値を代入する。 i = i + 1 Loop

投稿2017/07/14 07:17

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2017/07/14 07:22

なるほど、Do~LoopとFor~Nextループを混同していると考えると謎コードだった部分がしっくりきますね。
momon-ga

2017/07/14 07:28

2の代入が気になったのと、forだったら「変数iが10以下である限り」でなく、「変数iが2から10まで」って書くかなと思いました。
hoshizorararara

2017/07/14 07:35

ありがとうございます!画像での分かりやすい説明ありがとうございます。書き換えてみます!
guest

0

ほぼできているようですね。
各手順をちゃんとコード化できていると思います。

うまく動かない原因は2点。

①入力した数値をJ1~J10セルに格納しており、その後の判定に使用している配列xにセットしていない。
②仮の最大値mと配列xを比較するループ処理(For~Next)内でi = i + 1をしている。
※Nextでループの先頭に戻る際に変数iは自動的に+1されていますので、内部でもi = i + 1を行ってしまうと2ずつ進んでしまいます。

机上でしかチェックしていませんが、この2点を修正すれば期待する動きになるのではないかと思います。
頑張ってみてください。

投稿2017/07/14 07:12

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2017/07/14 07:32

見逃してましたが、こっちのほうが大事だったかも < ①入力した数値をJ1~J10セルに格納しており、その後の判定に使用している配列xにセットしていない。
hoshizorararara

2017/07/14 07:34

ありがとうございます!皆様にご指摘いただいた通りに書き換えてみます。
guest

0

For文の中で、i = i + 1をやっているのが原因かと。
For文は特に指定しなければ1ずつカウントされるので、i = i + 1をやってしまうと、余計にカウントされてしまいます。
つまり、1,3,5・・・とカウントされるので、全ての値が見れていないのだと思います。

その他、なぜDouble型なのかとか、Forの前でなぜi = 2が必要なのか、とかありますが、そこらへんは割愛させていただきます。

投稿2017/07/14 07:00

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問