エクセルでくんだ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
No.6ベストアンサー
- 回答日時:
すでに他の方から指摘がありますが、
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
No.9
- 回答日時:
> 例えば以下のものは変数iをステップ0.1で加算していますが
> それに対応して表示させるセルを一つずつずらすために
> 変数kを指定してfor構文を連立させようとしたのですが
> うまくいきませんでした。
うまくいかなかったときのコードを提示しましょう。
No.7
- 回答日時:
行をずらしたセルに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
マクロの中で一度に変数を沢山使うことは可能です。
変数の適用範囲を変える(定義の仕方を変える)ことで、
異なるモジュールに使う同名の変数を異なる変数として使うことも
同じ変数として使うこともできます。
No.5
- 回答日時:
カウンター変数は整数で考えたほうが良い。
特にエクセルでは行、列を表す数字を変数化する場合が多いから。
結果を順次別セルに書き出したいような場合が多いから。
セルの列を表す値は整数であるべきで、小数になったとき、システムが整数と見てくれるかどうか、きちんと確認すべきだ。エクセル関数などでも計算した結果や、セルの値を使うとき、注意が必要。計算の結果、前後で同じ列数を指しても、普通は、処理の主旨に合わないでしょう。
For i=0 to 100
Cells(22 + i, 7).Value = i/10
(Valueは普通ははぶくよ)
のような考え方をしたらどうだろう。
>繰り返し構文は同時に複数の変数はできないのでしょうか?
は、どういうことを聞いているのか。
2重ループとかのこと?
左辺と右辺に変数があらわれる式ということ?
一旦カウンター変数で計算した値を別の変数に代入して、以後その変数をつかうこと?
こんなの出来ること当たり前。
聞くまでも無いことではないかな。
No.4
- 回答日時:
> 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ですね。
No.3
- 回答日時:
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だと大丈夫ですので…)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
i=cells(Rows.Count, 1)とi=cel...
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
【Excel VBA】指定行以降をクリ...
-
【Excel】指定したセルの名前で...
-
ExcelのVBAで数字と文字列をマ...
-
【VBA】指定したセルと同じ値で...
-
Excelで指定した日付から過去の...
-
セルの値だけクリップボードに...
-
DatagridViewの値確定
-
TODAY()で設定したセルの日付...
-
VBAコマンドボタンを押すたびに...
-
Excelのプルダウンで2列分の情...
-
DataGridViewの各セル幅を自由...
-
エクセルvba:自己セルの情報取...
-
DataGridViewのセル編集完了後...
-
セル色なしの行一括削除
-
【VBA】シート上の複数のチェッ...
-
スプレッドシートをGASでセル保...
-
EXCELのVBA-フィルタ抽出後の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
i=cells(Rows.Count, 1)とi=cel...
-
ExcelVBAを使って、値...
-
【Excel VBA】指定行以降をクリ...
-
特定のセルが空白だったら、そ...
-
EXCELで変数をペーストしたい
-
Excelで指定した日付から過去の...
-
VBAの間違い教えて下さい
-
【Excel】指定したセルの名前で...
-
Excelのプルダウンで2列分の情...
-
エクセルVBAでコピーして順...
-
Excel vbaで特定の文字以外が入...
-
Excel VBA、 別ブックの最終行...
-
【VBA】指定したセルと同じ値で...
-
特定の文字を条件に行挿入とそ...
-
TODAY()で設定したセルの日付...
-
screenupdatingが機能しなくて...
-
VBA初心者です。次のVBAコード...
-
指定した条件で行セルを非表示...
-
VBAでセルをクリックする回...
-
DataGridViewの各セル幅を自由...
おすすめ情報