• ベストアンサー

ループ中にセルの更新された値を取得したい

Excel2000でVBAをやってます。 よろしくお願いします。 for文を使って毎回ランダムな値をB2とB3に入れます。 B4には式(=B2+B3)が入っています。 これをファイルに追加書き込みしたのですが、 B2とB3はその都度ランダムな値が入っているのですが、 B4だけは「0」です(つまり更新されていません) どのようなプログラムならその都度更新されるようになるのでしょうか? For I = 1 To 10 sheet1.Range("B2") = Int((10 * Rnd) + 1) sheet1.Range("B3") = Int((10 * Rnd) + 1) Dim temp As String temp = str(sheet1.Range("B2")) + "," + str(sheet1.Range("B3")) + "," + str(sheet1.Range("B4")) Open "C:\test.txt" For Append As #1 Print #1, temp Close #1 Next I

質問者が選んだベストアンサー

  • ベストアンサー
  • ape5
  • ベストアンサー率57% (85/148)
回答No.4

次のようにしてみてください。 もしうまくいかなかったら、(1)のところを -------------------------------------------- Worksheets("sheet1").Calculate -------------------------------------------- にしてみてください。 -------------------------------------------- Open "C:\test.txt" For Append As #1 'ファイルをループの前でオープン For I = 1 To 10 sheet1.Range("B2") = Int((10 * Rnd) + 1) sheet1.Range("B3") = Int((10 * Rnd) + 1) Calculate '強制的に再計算-------(1) Dim temp As String temp = str(sheet1.Range("B2")) + "," + str(sheet1.Range("B3")) + "," + str(sheet1.Range("B4")) Print #1, temp Next I Close #1     'ループが終了したらファイルを閉じる --------------------------------------------

takagoo100
質問者

お礼

ご返答ありがとうございます。 両方試したのですが駄目でした・・・ うーん、、どうしたいいものか・・・ 自分の環境では無理なんですけど、 もしエクセルを使っているのであれば、ape5さんの環境ではできるのでしょうか?

その他の回答 (4)

  • ape5
  • ベストアンサー率57% (85/148)
回答No.5

こっちの環境はExcel2007なのですが、できます。 2000でもあると思うのですが、どこかのメニューにオプションというのがあると思うのですが、それを選んで、その中に、再計算を自動でやるっていうような、項目はないですか? ちょっと確認してみてください。

takagoo100
質問者

お礼

ご返答ありがとうございます。 オプションの計算方法のタブの 「手動(保存前に再計算)」で今までやってました。 次に (保存前に再計算)のチェックを外してやってみました。 「テーブル以外自動」 「自動」 と全て試してみたのですが駄目でした・・・ この項目で合ってますか? http://vista.jeez.jp/img/vi7932717670.jpg

takagoo100
質問者

補足

すいません。 今、B4のセルの式を見ていたら「=B2+B3」が消えていました・・・ そして、(保存前に再計算)のチェックを外して式を入れなおして試してみたらできました。 自分でもいつから外れたのか記憶に無いので、 何かのプログラムが絡んでいるのか分からないので少し不気味ですが、、 とりあえずできましたので、ありがとうございました。

回答No.3

#1です。 ダメかもしれませんが、 Dim temp As Stringの前に DoEventsを入れてみてください もしこれでだめなら、 マクロ1でB2,B3に値を入力 いったんシートに戻って B4に反映させてから マクロ2でファイル出力 これならいけるかな? エクセル持ってれば試すんですが、 オープンオフィスなもんで・・・

takagoo100
質問者

お礼

ご返答ありがとうございます。 DoEvents試したのですが、駄目でした・・・ 次の提案は、 >いったんシートに戻って というのは、手動でやるのでしょうか? forでループさせてやりたいと思ってるので、 できればそのプログラム(関数)があれば教えてもらえないでしょうか?

  • ape5
  • ベストアンサー率57% (85/148)
回答No.2

以下のコードをマクロに書いてみてください。 --------------------------------------------- ActiveSheet.EnableCalculation = True --------------------------------------------- それとNo1の方も書いてますが、ループの中で毎回ファイルをオープンしてすぐ閉じて、また次で同じファイルをオープンするというのはやめた方がいいです。 というのは、ファイルをオープンしたり閉じたりするのは、オーバーヘッドが伴い、時間がかかるのです。なのでループの中で同じファイルに毎回書き込むのであれば、次のように直すといいと思います。 -------------------------------------------- Open "C:\test.txt" For Append As #1 'ファイルをループの前でオープン For I = 1 To 10 sheet1.Range("B2") = Int((10 * Rnd) + 1) sheet1.Range("B3") = Int((10 * Rnd) + 1) Dim temp As String temp = str(sheet1.Range("B2")) + "," + str(sheet1.Range("B3")) + "," + str(sheet1.Range("B4")) Print #1, temp Next I Close #1     'ループが終了したらファイルを閉じる -------------------------------------------- <<参考URL>> http://www.moug.net/tech/exvba/0040055.htm

takagoo100
質問者

お礼

ご返答ありがとうございます。 以下のコードで試したのですが駄目でした・・・ たぶんこれは書く場所が間違ってると思うのですが、 どこらへんに書けば良いのでしょうか? Open "C:\test.txt" For Append As #1 For I = 1 To 10 sheet1.Range("B2") = Int((10 * Rnd) + 1) sheet1.Range("B3") = Int((10 * Rnd) + 1) ActiveSheet.EnableCalculation = True Dim temp As String temp = str(sheet1.Range("B2")) + "," + str(sheet1.Range("B3")) + "," + str(sheet1.Range("B4")) Print #1, temp Next I Close #1

回答No.1

B3に値入れた後に sheet1.Range("B4") = sheet1.Range("B2")+sheet1.Range("B3") これでどうでしょう? ちなみにopenとcloseはforの外に出した方がいいですよ あとfreefile(だっけな?)を使うのも

takagoo100
質問者

お礼

ご返答ありがとうございます。 たしかにその方法ならできるのですが、 自分がやりたいのは、セルに複雑な式が入っていて(B4のような=B2+B3ではなく) そのようなセルがたくさんある場合に、 それをプログラム側で書くのは厄介なので、セルを更新するようなことができて その値を取り出すことをやりたいのです。 そのようなプログラム(関数)はあるのでしょうか?

関連するQ&A