- ベストアンサー
エクセルでVBAマクロが途中で止まる原因は?
- エクセルでVBAマクロが途中で止まる原因を教えてください。
- セルにxの値を代入し、それに対応したyを出力させるVBAマクロが途中で止まるのですが、どこがおかしいですか?
- 繰り返し構文で複数の変数を使用する方法がわかりません。変数iをステップ0.1で加算し、それに対応して表示させるセルをずらすために変数kを使いたいのですが、うまくいきません。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
すでに他の方から指摘がありますが、 Cells(22 + 10 * i, 7) はOKで、Range("H" & 10 * i + 22) がNGということになるようです。 range ではcellsとは変換誤差の扱い方が異なるのが理由のようですね。 セル指定する場合は小数値を含む値の設定を行う場合には注意が必要のようですから、今回のように小数値でループを廻してセル指定するのは適切とは言えないかもしれませんね。 コンピュータが扱う小数には丸め誤差が発生すると言うのは、プログラミングになれた方なら基本として知っていますが、初心者は式には問題無いのにエラーが起きている理由が理解出来ないと思います。 そのために予期しないエラーに悩まされて無駄な時間を掛ける事にもなります。 今回は、下記のように共通部分を変数kにまとめてしまえば問題無いですし、コードの視認性も良くなると思います。 Sub samp() Dim i As Double Dim k As Long For i = 0 To 10 Step 0.1 k = 22 + 10 * i Cells(k, 7).Value = i Cells(19, 6).Value = i Range("H" & k).Value = Range("E24").Value Next i End Sub
その他の回答 (8)
- nattocurry
- ベストアンサー率31% (587/1853)
> 例えば以下のものは変数iをステップ0.1で加算していますが > それに対応して表示させるセルを一つずつずらすために > 変数kを指定してfor構文を連立させようとしたのですが > うまくいきませんでした。 うまくいかなかったときのコードを提示しましょう。
- nattocurry
- ベストアンサー率31% (587/1853)
とまったときの内部変数の値を確認しましょう。 iが5.9の次は、6ではなく、 5.99999999999999 になっていますね。
- moto_koukousei
- ベストアンサー率54% (331/606)
行をずらしたセルにE24の値を出力するコードはありますが、 E24に出力するコードが見当たりません。 質問文の中に、何か間違いがあるように思います。 質問内容を明確にできますか。 止まらないと言うだけならば、次のようにすれば動きます。 Sub TesT() Dim i As Double For i = 0 To 10 Step 0.1 Cells(22 + 10 * i, 7).Value = i Cells(19, 6).Value = i Cells(10 * i + 22, 8) = Cells(24, 5) Next i End Sub 普通ならば、行の位置を最初から整数で指定します。 Sub TesT2() For i = 0 To 100 Cells(19, 6).Value = i / 10 Cells(22 + i, 7).Value = i / 10 Cells(22 + i, 8) = Cells(24, 5) Next i End Sub ( y = a * (x + b ) + c ) aは E24にある値を使う xは F19に入力する値(b)を初期値として xを +0.1刻みで+10.0まで変化させた場合の yを表示する ( なお ベースの値cは E25を使う ) Sub TesT3() a = Cells(24, 5) b = Cells(19, 6) c = Cells(25, 5) For i = 0 To 100 Cells(22 + i, 7) = b + i / 10 Cells(22 + i, 8) = a * Cells(22 + i, 7) + c Next End Sub >繰り返し構文は同時に複数の変数はできないのでしょうか? For Nextループ(繰り返し構文)の繰り返しは、1つのカウンタで行います。 これを 何重かにすれば(ネスト/入れ子) いくつもの繰り返しができます。 Sub TesT4() For i = 1 To 5 For j = 1 To 23 For k = 67 To 26 Step -1 Cells(i, j) = k * 3 Cells(k, j) = 2.5 * i + j * k Next k Next j Next i End Sub マクロの中で一度に変数を沢山使うことは可能です。 変数の適用範囲を変える(定義の仕方を変える)ことで、 異なるモジュールに使う同名の変数を異なる変数として使うことも 同じ変数として使うこともできます。
- imogasi
- ベストアンサー率27% (4737/17069)
カウンター変数は整数で考えたほうが良い。 特にエクセルでは行、列を表す数字を変数化する場合が多いから。 結果を順次別セルに書き出したいような場合が多いから。 セルの列を表す値は整数であるべきで、小数になったとき、システムが整数と見てくれるかどうか、きちんと確認すべきだ。エクセル関数などでも計算した結果や、セルの値を使うとき、注意が必要。計算の結果、前後で同じ列数を指しても、普通は、処理の主旨に合わないでしょう。 For i=0 to 100 Cells(22 + i, 7).Value = i/10 (Valueは普通ははぶくよ) のような考え方をしたらどうだろう。 >繰り返し構文は同時に複数の変数はできないのでしょうか? は、どういうことを聞いているのか。 2重ループとかのこと? 左辺と右辺に変数があらわれる式ということ? 一旦カウンター変数で計算した値を別の変数に代入して、以後その変数をつかうこと? こんなの出来ること当たり前。 聞くまでも無いことではないかな。
- samtomsan
- ベストアンサー率55% (1060/1897)
> VBAマクロが途中でとまるのですが エラーメッセージが表示されると思いますが、その内容により対処するしか方法はありません。 あるいはブレークポイントを設けて一行ずつ実行して確認する方法を習得されることをお勧めします。 このケースだと「Rangeメソッドは失敗しました」ですからRangeを使っている行でエラーですね。 > Range("H" & 10 * i + 22).Value = Range("E24").Value 「10 * i + 22」で演算誤差が発生して、整数にならない場合があり(80.9999999999999)、エラーになっています。 改良するとしたら、正数化して下記のようになりますか。 Range("H" & Int(10 * i + 22)).Value = Range("E24").Value ステップは整数でなくてもOKですね。
- kmetu
- ベストアンサー率41% (562/1346)
Debug.Print 22 + 10 * i で出力を見てください 80台で計算誤差が出ていて小数点数になりますでRangeでの指定エラーになります。 ですので Range("H" & Int((22 + 10 * i) + 0.9)).Value = Range("E24").Value とするか Cells(22 + 10 * i, 8) = Range("E24").Value としてください。(なぜかCellsだと大丈夫ですので…)
- TNK787
- ベストアンサー率17% (25/141)
複数の変数? K=1 For i=0 To 10 `処理・・ K=K+1 Next ってな感じにすりゃいいんじゃないの?
- TNK787
- ベストアンサー率17% (25/141)
Step値は整数である必要がある!