2016-05-03 7 views
-1

私は非常に遅くなったExcelシートを持っています。 何らかの理由で、ドキュメントのどこにいても、計算を手動に設定し、変更後に現在のシートをリフレッシュすると、十分速く、自分の目的を果たします。シートレベルでのExcelの自動計算

しかし、これはあまり快適ではありません。

セルが変更されるたびに現在のシート(ドキュメント全体ではない)をリフレッシュしたいと思います。これは私が行っているシートがあれば何でもできます。どうやってやるの?

編集:私は自分のワークブックをより速くする方法の手がかりを求めているわけではないことを明確にしておいてください。ちょうど文脈情報でした。私は自動リフレッシュだけに興味があります。

+0

あなたはずっと、より多くの情報を提供しない限り、私たちは推測することができます! (自動リンク、UDF、シートまたは変更のイベント、データ/シート/公式の量、名前付き範囲内のリンクの壊れたリンクなど)影響が及ぶ要素は多すぎます。したがって、可能なすべての要因で質問を更新しない限り、私たちができることはありません。しかし、あなたが考えられるすべての影響要因で質問を更新している場合は、それらをチェックしてエラーを見つける可能性も非常に高いです。 – Ralph

+0

@Ralph多分私は十分に明確ではなかった、私は私の質問を編集しました。私はファイルの遅さに取り組んでいますが、ここでは問題ではありません。素早い修正は、この自動リフレッシュを設定することですが、シートレベルでのみ、私がここで求めているのです。 –

+1

Excelが更新され、セルが変更されるたびにすべてを計算するようにするには、 'Application.Calculation = xlCalculationAutomatic'を設定するだけです。これはメニューに入るのと同じです:' Formulaulas' - > 'Calculation Options' - →「自動」。とにかく、それはとにかくExcelシートのデフォルトです。あるいは、 'Worksheet_Change'イベントを利用して、そのサブ' ActiveSheet.Calculate'に1行だけをドロップすることもできます。 – Ralph

答えて

1

チャールズ・ウィリアムズは、彼のウェブサイトhttp://decisionmodels.comで広範な情報、技術、およびコードを計算しています。 this pageからの引用:

別の方法では、worksheet.enablecalculationプロパティを使用します。 このプロパティを変更すると、ワークシート上のすべての数式が計算されないため、ワークシート上のすべての数式に未計算とフラグが設定されているため、falseに設定してから に戻ると、次の 計算が完全な計算になります。

> Dim oSht as worksheet Application.Calculation=xlCalculationManual 
> 
> for each oSht in Worksheets oSht.enablecalculation=false 
> osht.enablecalculation=true next osht 
> 
> Application.calculate 

はまた、完全なシート 計算を行うために、単一のワークシートにこの方法を使用することができます。

あなたは簡単にこのように、Worsheet_Changeイベントにこの技術を働かせることができる:

Private Sub Worksheet_Change(ByVal Target As Range) 

Application.Calculation = xlCalculationManual 

Me.EnableCalculation = False 
Me.EnableCalculation = True 
Me.Calculate 

End Sub 

これは、現在のシートのみの完全な計算を行いますと、未計算のすべての他のシートを残します。

+0

ありがとう@テイリン、私はあなたの答えに感謝します。それを減らしました Private Sub worksheet_change(ByVal対象範囲として) If Application.Calculation = xlCalculationManual Then Me.Calculate End Sub Me.EnableCalculation = False/Me.EnableCalculation = Trueの目的はわかりません、あなたは精巧にできますか? –

+1

なぜあなたは私の投稿をもう一度読まないのですか? – teylyn

+0

「開いているブックのすべてのシートについて、プロパティをfalseにしてからtrueに戻すと、次の計算が完全な計算になります。しかし、私が理解する限り、application.calculateはすでに完全な計算であり、同様の方法で、2番目の部分では、me.calculateは十分に見えます –

0

私は計算のイベントがアプリケーション、ワークシートまたは範囲のレベルで起こることができると信じて(ただし、ワークブックレベル。)

あなたが手動に設定計算モードを持っていますが、現在のワークシートをしたい場合(のみ)したときに更新何かを入力して、あなたは(該当するシートにコードを置く。)ワークシートの変更イベントを追加することができます

Private Sub Worksheet_Change(ByVal ChangedRng As Range) 
    ChangedRng.Worksheet.Calculate 
End Sub 

これは単なるワークシートではなくワークブックまたは任意の他のブックの残りの部分を再計算します。

0

提供された回答が私を完全に満足させないため、ここで私は自分の評価した助けを借りています。私はteylynの答えからいくつかのニュアンスを見逃している可能性があります。それが妥当であれば喜んで編集します。

アプリケーションレベルで変更イベントを処理する方法はないようです。

したがって、すべての変更はシートレベルで処理する必要があります。

これは(あなたが新しいシートを追加するたびに、それをコピーして貼り付けることを忘れないでください)コピーすることによって行われ、ワークブックのEVERYシートオブジェクト内のコードのこのビットを貼り付けることができます。

Private Sub worksheet_change(ByVal Target As Range) 
    Me.Calculate 
End Sub 

しかし、のために私たちがしなければならない面倒なコピーペーストは、各シートオブジェクトに戻ることなく簡単にこの機能をオフにしたい場合があります。

また、1枚のシートに大量の変更(マクロ、ドラッグ&ドロップ、ctrl + Hなど)をすると、地獄のループを避けることもできます。 A2で

  • :はい/いいえ、当社の新機能
  • はA4で有効/無効にする:最新のリフレッシュ
  • の時間、我々は3つの値を設定WS_refreshと呼ばれる新しいシートを追加します。これを行うに

    A6で

  • :リフレッシュできるようにする分間隔、秒で(私はこれを1に設定した)

我々は時間に短時間でいくつかのセルの値を変更したときに今、自動リフレッシュが最初に動作します変更、前回の回避まるで地獄のループ。あなたは危険な設定A6は0

に住みたい場合、これは、すべてのシートオブジェクトにコピー&ペーストする必要があるものです:

Private Sub worksheet_change(ByVal Target As Range) 
auto_refresh = ThisWorkbook.Worksheets("WS_refresh").Range("A2") 
If auto_refresh = "Yes" Then 
    last_refresh = ThisWorkbook.Worksheets("WS_refresh").Range("A4") 
    refresh_interval_sec = ThisWorkbook.Worksheets("WS_refresh").Range("A6") 
    refresh_interval_tv = TimeValue("0:00:" & refresh_interval_sec) 
    If Application.Calculation = xlCalculationManual And Now() > last_refresh + refresh_interval_tv Then 
     ThisWorkbook.Worksheets("WS_refresh").Range("A4") = Now() 
     Me.Calculate 
    End If 
End If 
End Sub