- ベストアンサー
For...Nextでの変数の挙動を追いたい
- VBAで生物の研究を自動化するためのプログラムを作成しています。変数計算シートに変数を入力し、その値を元に体温変化を計算します。計算結果をグラフ化し、標準偏差などを計算して総合評価シートに貼り付ける作業をコード化しました。しかし、コードを実行すると同じ値が総合評価にコピーされてしまいます。変数に応じて異なる結果を総合評価に貼り付ける方法を教えてください。
- VBAを使用して生物の研究を自動化するプログラムを作成しています。変数計算シートに変数を入力し、体温変化などの計算を行います。計算結果はそれぞれの年ごとにシートに表示され、日々の増減シートにはグラフ化されます。また、集計シートでは標準偏差などを計算し、総合評価シートには計算結果の一部を貼り付けます。しかし、コードを実行すると同じ値が総合評価にコピーされてしまいます。変数ごとに異なる結果を総合評価に貼り付ける方法を教えてください。
- VBAを使用して生物の研究を自動化するプログラムを作成しています。変数計算シートに変数を入力し、体温変化などの計算を行います。計算結果は各年のシートに表示され、日々の増減シートにはグラフ化されます。集計シートでは標準偏差などを計算し、総合評価シートには計算結果の一部を貼り付けます。しかし、同じ値が総合評価にコピーされてしまいます。変数ごとに異なる結果を総合評価に貼り付ける方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 何か、オプションをいじりすぎてはいませんか・ 何のためにしているのか、わかってしているのか意味があればよいのですが、分からないままに、オプションをいじっているような気がします。 数式がどのような内容なのか見えませんが、 ActiveSheet.EnableCalculation = False たぶん、ワークシートを全部、計算不能にしてしまったのでは、上手くないのでは? .Cells(8, 3).Value等に 特殊な数式が入っているのだろうと思います。だから、値が変わるというのは、分かりますが、問題は、Calculate の問題では? ただし、Excelでは、再計算の計算後の値を取得する方法はなかったと思います。マクロが素通りしてしまうかもしれません。どのような数式を置いているかにもよります。よほど重いシートでなければ、再計算を命令する必要はないと思います。一応、特殊な数式の場合、以下のような書き方がありますが、それでも値が取れないなら、ワークシートで計算させるのはやめて、VBAの中で計算させたほうがよいです。 なお、 >cntRec = cntRec + 1 >Application.StatusBar = "処理実行中....(現在 " & cntRec & "件)" それと、こういうオプションは、何万件というデータで、一向に終わらない場合以外は、格好だけになってしまいます。少なくとも、コードが完成していない前につけるのはやめたほうがよいです。 >For...Nextでの変数の挙動を追いたい 途中で取るなら、Debug.Print か変数でも置いてあげればよいのですが、単に、数値を出力するだけなら、そのままでシートに出せばよいと思います。 例: '------------------------------------------- Sub MacroTest1() Dim i As Long Application.ScreenUpdating = False For i = 0 To 30 Worksheets("変数計算").Cells(41, 12).Value = 50 + (i * 5) With Sheets("集計") .Cells(8, 3).Calculate Worksheets("総合評価").Cells(4 + i, 3).Value = .Cells(8, 3).Value .Cells(10, 3).Calculate Worksheets("総合評価").Cells(4 + i, 4).Value = .Cells(10, 3).Value .Cells(31, 3).Calculate Worksheets("総合評価").Cells(4 + i, 5).Value = .Cells(31, 3).Value End With Next i Application.ScreenUpdating = True MsgBox "バックテストが完了しました" End Sub '-------------------------------------------
その他の回答 (5)
- cistronezk
- ベストアンサー率38% (120/309)
またお答えがいただけませんでしたが、Cells(8, 3)には、値があるのですか?それとも数式があるのですか? 回答4にも書きましたが、それによって >Cells(8, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 3) の結果が全く違ってきます。一体どちらなのでしょう? >求めた各パーセントに対するそれぞれ3つの値の結果を >Worksheets("総合評価")のC4,D4,E4にコピペしたいのです。 コピペの目的は何ですか?セルCells(8, 3)の値が欲しいのでしたら Worksheets("総合評価").Cells(4 + i, 3).Value=Cells(8, 3).Value とした方がいいでしょう。 いずれにしても、示していただいたマクロの説明では、集計シートのCells(8, 3)などにある値がどう変化するのかが全然見えてきません。 >Cells(41, 12).Value = 50 + (i * 5) とCells(8, 3)などとの関係が依然として不明です。変数計算シートとSheet1~Sheet11、集計シートの関係もわかりません(といって、全シート・全セルの複雑な関係を長文で書かれたとしても困るのですが)。なので、回答も憶測の域を出ません。 >Cells(8, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 3) にブレークポイントを設定して、そこからF8でステップ実行してセルの値を確認してみてください。
お礼
>またお答えがいただけませんでしたが、Cells(8, 3)には、値があるのですか?それとも数式があるのですか? 大変失礼致しました。Cells(8, 3)、Cells(10, 3)、Cells(31, 3)には 数式が入っております。 シートの関係ですが、変数計算シート→Sheet1~Sheet11→集計シートという 流れで数式を組んでおり、集計シートの結果の値を総合評価のシートに順に コピペするというコードです。 ご指摘頂いた 「Worksheets("総合評価").Cells(4 + i, 3).Value=Cells(8, 3).Value」 のコードとWith...End Withを使用し、Next iの前に With Worksheets("総合評価").Cells(4 + i, 3).Value=Sheets("集計").Cells(8, 3).Value Worksheets("総合評価").Cells(4 + i, 3).Value=Sheets("集計").Cells(10, 3).Value Worksheets("総合評価").Cells(4 + i, 3).Value=Sheets("集計").Cells(31, 3).Value End With を入れる事でおそらく希望通りの結果になりそうです。 うまく説明することが出来ず、申し訳ありませんでした。 ありがとうございました。
- rakko1
- ベストアンサー率54% (52/95)
私はVBAの専門じゃないのでこのコードをパッとデバッグして差し上げれませんが、変数の挙動がわからないということであれば、ほかのループ、while などを使うといいのだと思うしだいです。 for句と違い、ループ中で、パラメーターの増減を自分で責任をもって操作できますから。 あと、アルゴリズムの表示にはソースよりも、チャートを使うのがわれわれの世界では一般的です。PDFなどにすればダウンロードもできますしね。 最低でもフローチャート、親切なのは、PADチャートであればどのような言語にでも出来ます。
- cistronezk
- ベストアンサー率38% (120/309)
マクロの説明がないので、憶測ばかり先行してしまいます。 >このコードですと、同じ値が「総合評価」にコピペされてしまいました。 ということは、Cells(8, 3)などには「式」ではなく「値」があると推測できます。 加えて >Cells(8, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 3) という式は、値貼り付けはしません。 つまり、Cells(8, 3)に数式があれば、Worksheets("総合評価").Cells(4 + i, 3)にもその数式がコピーされます。でも、同じ式を何度もコピペする処理はナンセンスですから、Cells(8, 3)に数式があるとは思えません。 それとも、 >Cells(8, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 3) と Worksheets("総合評価").Cells(4 + i, 3).Value=Cells(8, 3).Value とが同じ処理だと誤解されているのでしょうか? いずれにしても情報不足です。詳しい説明をお願いします。 ちなみにデバッグの方法としては、怪しい場所はVBEでF8キーを叩いてステップ実行して、変数や各セルの値を地道に確認された方が確実でしょう。
補足
ご回答有り難う御座います。 うまく説明できず、申し訳ありませんでした。 詳しく説明させて頂きますと For i = 0 To 30 Sheets("変数計算").Select Cells(41, 12).Value = 50 + (i * 5) でパーセントを50%から5%ずつ、200%まで変化させて、 Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet7", _ "Sheet8", "Sheet9", "Sheet10", "Sheet11")).Select で各年のパーセンテージに対する反応を計算、 Sheets("日々の増減").Selectでグラフを更新 (この作業は特別必要ではありません)、 Sheets("集計").Select ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False Cells(8, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 3) Sheets("集計").Select Cells(10, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 4) Sheets("集計").Select Cells(31, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 5) ここでSheets("集計")のC8,C10,C31にて求めたい3つの値を求めます。 求めた各パーセントに対するそれぞれ3つの値の結果を Worksheets("総合評価")のC4,D4,E4にコピペしたいのです。 (50%の結果をC4,D4,E4にコピペ、 55%の結果をC5,D5,E5にコピペ、60%の結果をC6,D6,E6にコピペ、、、) 大変わかりにくいかとは思いますが、アドバイスを頂けたら 嬉しいです。 宜しくお願い致します。
- suzusan7
- ベストアンサー率64% (22/34)
こんばんわぁ 変数の挙動を追いたいとのことですので、 Cells(8, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 3) の下に次の4行のコードを挿入してみてはいかがでしょうか? With Worksheets("集計") Debug.Print "i = " & i & "," & .Cells(8, 3).Value & "," & _ .Cells(10, 3).Value & "," & .Cells(31, 3).Value End With これは、イミディエイトウィンドウにiの値、計算した3つの数値を 出力するコードです。この出力で、計算した数値が希望通りの数値となっているかを まず確認してみてはどうでしょうか? ちなみに、イミディエイトウィンドウはVBAのコードを書いている画面に表示されます。 もし、表示されていない場合は、VBAコードを書いている画面のツールバーの「表示」の中に イミディエイトウィンドウという項目がありますので、これを選択すると表示されます。 (当方エクセル2002です)
お礼
参考になるアドバイスを有り難う御座います。 VBAはまだ始めたばかりでイミディエイトウィンドウというものを 知りませんでした。 イミディエイトウィンドウで調べた結果、希望の値になっていますが コードがうまく書けていないせいで、希望通りの結果には なっていない事が分かりました。 もう少し調べてみようと思います。 ありがとうございました。
- cistronezk
- ベストアンサー率38% (120/309)
>Cells(8, 3).Copy Destination:=Worksheets("総合評価").Cells(4 + i, 3) という式なら、常に「Cells(8, 3)」の値が「Worksheets("総合評価").Cells(4 + i, 3)」にコピーされるのですから >このコードですと、同じ値が「総合評価」にコピペされてしまいました。 となるの当然だと思いますが。 どういう結果を期待されているのでしょう?
補足
ご回答有り難う御座います。 私がしたいと思っている事は、 For i = 0 To 30 Sheets("変数計算").Select Cells(41, 12).Value = 50 + (i * 5) でパーセンテージを50%から5%ずつ、200%まで変化させ、 Sheets("Sheet1")からSheets("Sheet11")とSheets("日々の増減") でパーセンテージに対する反応を計算、Sheets("集計")のC8,C10,C31にて3つの値を求めます。 Sheets("集計")で求めたそれぞれの値の結果をWorksheets("総合評価")のC4,D4,E4にコピペしたいのです(50%の結果をC4,D4,E4にコピペ、 55%の結果をC5,D5,E5にコピペ、60%の結果をC6,D6,E6にコピペ、、、 という具合です)。 こういったプログラムは可能なのでしょうか。
お礼
ご回答有り難う御座います。 With...End Withステートメントを使って試したところ 希望通りの結果が出そうです。 大変参考になりました。 ありがとうございました。