【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

エクセルでくんだVBAマクロが途中でとまるのですが、
どこがおかしいかご指摘して頂けませんでしょうか?

以下のプログラムは
セル(19.6)にxの値を代入し、
E24にそれに対応したyを出力させるプログラムです。

あと余談となりますが、
繰り返し構文は同時に複数の変数はできないのでしょうか?

例えば以下のものは変数iをステップ0.1で加算していますが
それに対応して表示させるセルを一つずつずらすために
変数kを指定してfor構文を連立させようとしたのですが
うまくいきませんでした。




Sub k()


Dim i As Double

For i = 0 To 10 Step 0.1

Cells(22 + 10 * i, 7).Value = i
Cells(19, 6).Value = i

Range("H" & 10 * i + 22).Value = Range("E24").Value

Next i




End Sub

A 回答 (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
    • good
    • 0

> 例えば以下のものは変数iをステップ0.1で加算していますが


> それに対応して表示させるセルを一つずつずらすために
> 変数kを指定してfor構文を連立させようとしたのですが
> うまくいきませんでした。

うまくいかなかったときのコードを提示しましょう。
    • good
    • 0

とまったときの内部変数の値を確認しましょう。



iが5.9の次は、6ではなく、 5.99999999999999 になっていますね。
    • good
    • 0

行をずらしたセルに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

マクロの中で一度に変数を沢山使うことは可能です。

 変数の適用範囲を変える(定義の仕方を変える)ことで、
 異なるモジュールに使う同名の変数を異なる変数として使うことも
 同じ変数として使うこともできます。
    • good
    • 0

カウンター変数は整数で考えたほうが良い。


特にエクセルでは行、列を表す数字を変数化する場合が多いから。
結果を順次別セルに書き出したいような場合が多いから。
セルの列を表す値は整数であるべきで、小数になったとき、システムが整数と見てくれるかどうか、きちんと確認すべきだ。エクセル関数などでも計算した結果や、セルの値を使うとき、注意が必要。計算の結果、前後で同じ列数を指しても、普通は、処理の主旨に合わないでしょう。
For i=0 to 100
Cells(22 + i, 7).Value = i/10
(Valueは普通ははぶくよ)
のような考え方をしたらどうだろう。

>繰り返し構文は同時に複数の変数はできないのでしょうか?
は、どういうことを聞いているのか。
2重ループとかのこと?
左辺と右辺に変数があらわれる式ということ?
一旦カウンター変数で計算した値を別の変数に代入して、以後その変数をつかうこと?
こんなの出来ること当たり前。
聞くまでも無いことではないかな。
    • good
    • 0

> 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ですね。
    • good
    • 0

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だと大丈夫ですので…)
    • good
    • 0

複数の変数?



K=1
For i=0 To 10
`処理・・

K=K+1

Next


ってな感じにすりゃいいんじゃないの?
    • good
    • 0

Step値は整数である必要がある!

    • good
    • 0

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