エクセルの再計算とVBAの優先順位?

このQ&Aのポイント
  • エクセルでシミュレーションを行っていますが、結果が合わない問題があります。
  • エクセルには約70列×300行の計算式があり、その中で特に手間のかかる処理は1列だけです。
  • 再計算とVBAの整合性について疑問があります。再計算が完了していなくてもVBAがループするのでしょうか?
回答を見る
  • ベストアンサー

エクセル 再計算とVBA の優先順位??

シュミレーションの結果が合わないのですが エクセル 列 約70 1パターン6列 の10個と 合計列 行は 約300 300*70= 21.000セル? セルには 何らかの 式が埋め込まれています。 1パターンの中の列に 手間のかかりそうなのは 1列だけ18行の移動平均があります。他の列は、隣の足し算とか、比較してどうこう・・・(よって 移動平均は 合計10列) で、このワンパターン に 各パラメーターが有って これを変化させて 再計算して 合計の変化でMAXを 取り出す プログラムは c4=0 i4=0 ・・・・10個のパラメーターに初期値代入  この時点で セルの再計算 do if max<合計セル then   do    Call Sleep(5)   DoEvents    z = z + 1    If z > 5 Then     Exit Do    End If loop ここに 入れる? 合計セルが遅れて パラメーターが先行してたら意味ないような??   max=合計セル    記録(max、c4.i4・・・・・・) endif c4=c4+1 この時再計算 sleepがないと 秒 10回くらい変化する 21.000セルが 10回計算してるとは 思えないのですが? if c4>6 then c4=0 i4=i4+1  この時再計算 if i4>6 then i4=0 o4=o4+1  この時再計算 10個まで同じロジックが続く ここに sleep を 入れる?? loop で、問題は sleep を 入れないとき、計算が進んで、別の保存プログラムにパラメータを入れて合計を見るのですが、記録されたパラメーターと合計が合わないのです。 しかし、 MAXが更新されたときの中にブレークポイントを付けて、ストップ状態で(別のことしてたので、かなり止まってた)、保存プログラムにパラメーター代入、合計確認すると合っていました。 で、知りたいのは 再計算とVBAの整合性は エクセルは 取ってくれないのか? 再計算が完了しようが 途中であろうと、VBAだけ お構いなしに ループするのか はっきりしてるのは パラメータを弄った 後に Sleep入れるのが 最適なのでしょうが、6*6*6*・・・ の仕事量ですから、ここで 0.5秒取られても 合計時間がかかる。 記録の所だけなら、MAXが更新した時だけですから 時間が早いのですが・・・ この辺の状況、ご存知の方が いらっしゃればご教示ください。

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

  • ベストアンサー
回答No.2

試したわけではありませんが http://msdn.microsoft.com/ja-jp/library/ff196047.aspx セルに値代入後かな?に (コードを端折られているので特定できません。) そちらでお考えになってください。 do while Application.CalculationState <> xlDone sleep 200 loop で待機 http://msdn.microsoft.com/ja-jp/library/ff821508(v=office.15).aspx を余計なイベントが発生しないように適当なところに挟み込む (必要があるかどうかは、そちらで確認してください) あと、位取りに「.」を使うのは止めてください。 21,000 余計なところで思考がストップしてしまいました (^_^;) 日本語環境でないPCでしたらご容赦。

2014itochan
質問者

お礼

陳謝。 なるほど do while Application.CalculationState <> xlDone これは、使えそうです。感謝。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

Sleep入れるより、 Application.ScreenUpdating = False じゃないですか? Sleep入れて同期とるぐらいなら、 Application.Calculation = xlCalculationManual で自動計算止めておいて全部VBAで書くとか。

2014itochan
質問者

お礼

恐縮です。 表示は実行速度上がりますから、やってみます。 それで、タイミングが取れるか・・・ VBAは 無理でしょう。エクセルの再計算機能をなくすわけですから 一つのパラメーターで 1パターン 6*300 と 合計欄 10*300 で4800セル 書き換えるのですから VBAの実行速度じゃ・・・・ 結局 パラメーター1個代入で 4.800セル再計算するわけですが、VBAは 値の代入だけのループ。瞬時。VBAは 再計算完了まで 待ってくれるのでしょうかね 再計算とVBA 連携 取れてるのが? 分からないのですが

関連するQ&A

  • VBA 合計金額の計算

    OSは、XPpro Excelは2003を使用しています。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1444918209 を参考にさせて頂いて、 Dim gk As Variant Dim i As Long i = 2 Do While Cells(i, 1).Value <> "" gk = gk + Cells(i, 2).Value If Cells(i, 2).Value = "" Then Cells(i, 2).Value = gk gk = 0 End If i = i + 1 Loop i = 2 Do While Cells(i, 1).Value <> "" gk = gk + Cells(i, 3).Value If Cells(i, 3).Value = "" Then Cells(i, 3).Value = gk gk = 0 End If i = i + 1 Loop として、図の水色のセルの合計までは出来たのですが、 合計行だけDセルにBセルとCセルの合計を入たいのですが、 どの様にすれば良いか どなたか教えて頂けないでしょうか? 説明不足なところがありましたら、追記致します。 どうかよろしくお願い致します。

  • エクセル2000のマクロで、if文が想定通りに動かない

    90から93列目にかけて、データが 0又は3~4桁の数字が入っている状態です。 4810,0,0,2430 以下はマクロの抜粋です。 やりたいことは、0でなければ各変数に1を代入し、95列めに合計を入力します。 If Cells(i, 90) <> 0 Then w = 1 If Cells(i, 91) <> 0 Then x = 1 If Cells(i, 92) <> 0 Then y = 1 If Cells(i, 93) <> 0 Then z = 1 Cells(i, 95).Value = w + x + y + z このマクロを実行しますと、実際には0でない列が2列にもかかわらず、95列目に3と入力されてしまいます。1行ずつ実行してみたら、if文の3行目の92列目の判定が変です。 実行中に、カーソルをかざすとCells(1, 92)=0と表示されるのですが、合計を代入するところの y には1が代入されてしまっています。 何か間違っているんだと思いますが、分かりません。よろしくお願いします。

  • VBAエクセル空白セル0の入力

    C列が空白となるまで、F列・・・L列の空白セルに0を代入する。 という処理を行いたく以下コードで実行をして ファイル種類をCSVにて、保存した後名前の変更で拡張子をTXTにすると データ入力された列の以降がカンマの羅列が「,,,,,,,,(改行)」の繰り返しで表示されてしまいます。 (CSV保存の後、視覚的に空白部分を行選択して削除するとなくなります。) どうすれば、このカンマが表示されなくなるでしょうか。 うまく説明できてないですが、アドバイス御願いします。 Dim i As Long i = 3 Do Until Cells(i, 3).Value = "" If Cells(i, 6).Value = "" Then Cells(i, 6).Value = "0" End If If Cells(i, 7).Value = "" Then Cells(i, 7).Value = "0" End If If Cells(i, 8).Value = "" Then Cells(i, 8).Value = "0" End If If Cells(i, 9).Value = "" Then Cells(i, 9).Value = "0" End If If Cells(i, 10).Value = "" Then Cells(i, 10).Value = "0" End If If Cells(i, 11).Value = "" Then Cells(i, 11).Value = "0" End If If Cells(i, 12).Value = "" Then Cells(i, 12).Value = "0" End If i = i + 1 Loop

  • エクセルマクロでの計算について(2007)

    エクセルマクロ初心者です。 試行錯誤しながら作成しています。 セルB1には直接計算式を入れており(=(480+(A1)*10)/480*I1) その結果次第(70以下)でセルC1に計算結果(=(75-B1)*.48)をいれて 70より大きければセルC1に"-"を入れたいのですが上手く計算してくれません。 この処理を約65個のセルにしようと思っています。(セルの列はバラバラです) どうすればよいかご教示ください。 ちなみに現在作成している文は Private Sub 計算_Click() Worksheets("sheet2").Select If Range("B1").Value <= 70 Then Range("C1").Formula = "=(75 - (B1)) * 0.48" Else: Range("C1").Value = "-" End If End Sub よろしくお願いいたします。

  • EXCEL VBA作成で行き詰りました。助けてください。

    今、EXCEL のVBAを作成していて行き詰ってしまいました。 エクセルのシート(sheet1)に10桁数字が列にいくつかあります(E5からE6,E7へと毎日更新していきます)。 その10桁の数字を1つ選択(セルの数字をクリックするイメージでいます)してあるインターネット上のページの検索欄に自動記入→検索させたいと思っています。 その記入から検索までのおおまかな物は完成したのですが、セルを選んでという所がよくわかりません。 わかりにくい説明ですが、どうぞよろしくお願いいたします。 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub kensaku() Set ie = CreateObject("InternetExplorer.application") ie.Visible = True ie.Navigate ("http://www.○○○○") i = 0 Do Until ie.busy = False Or i > 10 Sleep (1000) i = i + 1 Loop If i > 10 Then MsgBox ("タイムアウト") Exit Sub End If ie.document.all.Idno.Value = "ここに選択したセルの数字を入れたい" ie.document.all.Search.Click End Sub といった感じです。 私自身は、excel vba はかじった程度でここまでも色々と調べながらやっとたどりつきました。 どうぞ、初心者でもわかりますように、ご説明よろしくお願いいたします。

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。 A列のCという商品名が入った列を削除したい場合下記のようにすれば可能かと思いますが、C列のCという商品名が入った列を削除したい場合どのようにすればよいか教えて下さい。 VBAに関してまだ初心者ですがどうぞよろしくお願いします。 行 = 1 Do 行 = 行 + 1 If Cells(行, 1) = "" Then Exit Do End If '行の値がC以外の時は次の行に移る Do If Cells(行, 1) = "C" Then Rows(行 & ":" & 行).Select Selection.Delete Shift:=xlUp Else Exit Do 'ジャンプ先は内側のDo~Loopのすぐ下 End If Loop 'ジャンプ先はここ If Cells(行, 1) = "" Then Exit Do End If Loop End Sub

  • VBA 計算について

    マクロ初心者です。 初歩的な質問だとは思いますが、調べてわからなかったので質問させていただきます。 一行ずつ読み込んで、一行ごとの合計を出すマクロを作ってみようと思っています。 例えばですが・・・ A4 + B4 + C4 + D4×2 + E4 D列の値のみ2倍で計算する。 このような計算をするときは、どのような書き方になるのでしょうか? よろしくお願いします。   

  • エクセルVBAに関しての質問です。

    エクセルVBAに関しての質問です。 同じフォルダ内に同形式のエクセルファイルが複数あります。そのファイルの特定のシートの中の特定の列のみをコピーして並べたいと思っています。 (1)フォルダはUSBに入れて使ったり、複数のパソコンの中で使われるので特定の場所にあるとは限りません。 (2)フォルダ名はその年度に応じて変更されます。「2009」、「2010」・・・といった具合です。 (3)フォルダ内のファイル数は常に3つで、「記録集計第1期」「記録集計第2期」「記録集計第3期」と名前を付けています。 (4)3つのファイル全てに「結果」という名前のシートがあり、そのシートのC4~AU37までのセルをコピーしたいです。 (5)C4~AU37までのセルには数値では無く、IF関数を使用して出された「◎」「◯」「△」等の文字列が入っています。 (6)コピーしたセルを「記録集計第3期」ファイルの中の「年度末結果」というシートのC2以降に並べてコピーしたいです。ただし、コピーする際に4行ずつ飛ばしてコピーしたいです。 「記録集計第1期」のC4を「年度末結果」のC2へ、C5をC6へ...... 「記録集計第2期」のC4を「年度末結果」のC3へ、C5をC7へ...... 「記録集計第3期」のC4を「年度末結果」のC4へ、C5をC8へ...... といった具合です。 このコピーにより、C2から始まって、C2=記録集計第1期のC4、C3=記録集計第2期のC4、 C4=記録集計第3期のC4ときて、年度末結果のC5には空白の列ができます。 そして、C6からまた続く訳です。 ややこしくてすみません。 (7)作業手順としては、「記録集計第3期」のファイルだけを開き、その中の「年度末結果」のシートにボタンを作って上記のVBAを動かせたらと思っています。 (8)「記録集計第1期」「記録集計第2期」のファイルは開かずにデータをコピーしたいです。 勝手なお願いで申し訳ございませんが、 お時間がございましたら、よろしくお願いいたします。

  • エクセル計算式

       A    B    C    D    E    F   G   H   I   J    K    L  1 名前(1) 80.00  50.0  51.0 ×54.0 80.0  85.0  90.0  51.0   90.0  141.0  2 2 名前(2) 79.00  50.0 ×52.0 ×53.0  88.0 89.0 91.0 50.0  91.0 141.0 1 このとき、      C~EのMAXをIに(×の場合は00.0で計算)      F~HのMAXをJに(×の場合は00.0で計算)      (※C~Hの前には×を入れるためのセルあり)      I,J,K共にBの数値が小さいほうが上位に来る      (※I,Jの後ろには、順位を入れるセルあり)      Kは、I+J      Lは、Kの計に対する順位       列がずれていて見にくいです。すみません。 どなたか回答お願いします。

  • エクセルVBAで、文字列の検索方法について

    先日、こちらで教えていただいたVBAがあります。 E列のセルの文字列の末尾が「計」のものを検索し、その行に色をつけるものです。 Sub iroiro() Dim x, y x = 1 Do If Right(Cells(x, 5), 1) = "計" Then For i = 2 To 5 Cells(x, i).Interior.ColorIndex = 3 Next End If x = x + 1 Loop Until Right(Cells(x, 5), 1) = "" End Sub これはばっちりで、助かっているのですが、今度は末尾ではなく、文字列中に「営業」という文字があるのを検索し、色をつけたいのです。 If Right(Cells(x, 5), 1) = "計" Thenを どう変えればいいのでしょうか?