2013-08-24 27 views
5

マクロではかなり単純な問題があります。その中で、私はセルに数式を割り当てます。私はまずそれを計算せずに、マクロの他の部分が終了した後で計算をしたいと思います。ExcelとVBA:マクロで計算式をスキップ

Application.Calculation = xlCalculationManual 
Cells(StartRow, 4 + i).Formula = "FORMULA" 
... 
Application.Calculation = xlCalculationAutomatic 

しかし、これはうまくいきません。自動計算は停止しますが、そのセルでは計算されません。計算式を割り当てた直後に計算が実行されます。それをスキップする方法はありますか?

実際のコードでは、サイクル内のセルのグループに数式を割り当てています。私はそれを1つのセルに割り当てます - それを計算します。私が最初にそれらをすべて割り当ててから計算をしたら、もっと速くなるはずです。実際にはのそれはです。サイクルに割り当てるのではなく、最初のセルに割り当ててからオートフィルを行います。オートフィルされた数式は、自動計算を有効にするまで待っています。しかし、最初の割り当て元は依然として計算されているため、マクロはほぼ2倍遅くなります。

+0

試してみてください:いくつかの非表示セルに数式を保存できますか?また、マクロでは式のみをPasteSpecialしますか?オートフィルと似たような動きがあり、最終的には計算される運が少しあります... –

答えて

7
  1. プレフィックス文字
  2. と、細胞内の場所式は、例えば式

"活性化する" マクロ

  • を続ける:

    Sub dural() 
        With Range("A1") 
         .Value = "'=1+2" 
         MsgBox " " 
         .Value = .Value 
        End With 
    End Sub 
    
  • +0

    華麗なトリックです。私は毎日何か新しいことを学ぶ:) – Vikas

    +0

    これは賢いです。 – enderland

    +0

    これは素晴らしいです:) – pokrishka

    2

    @Alex、あなたを@Gary答えとして計算を遅らせることができます。しかし、あなたは"セルを通って循環する"の式を割り当てる間に質問が必要だったのですか?

    はい場合ALL式はExcelシートに割り当てられるまで、私の視点から、あなたが式を用いてされていない場合、あなたはですべての式を書くことでスピードの多くを得ることができます一度アレイを使用する(VBAの一歩)。

    手順は次のとおりです。まず、すべての数式をVBAの文字列配列に入れ、後でたとえばRange("B1:B100").Formula = ArrayWithFormulasを使用します。この例では、一度に100個の式を割り当て、その間に再計算はしません。

    セルをセルごとに書くのではなく、配列を使って1つのセルに書き込むと、SPEEDの大きな改善が見られます! (通過するセルが多い場合はcells(r,c+i)を使用してループしないでください)。ここでは一例:

    Sub CreateBunchOfFormulas() 
        Dim i As Long 
        Dim ARRAY_OF_FORMULAS() As Variant 'Note: Don't replace Variant by String! 
        ReDim ARRAY_OF_FORMULAS(1 To 100, 1 To 1) 
              ' For Vertical use: (1 to NumRows,1 to 1) 
              ' for Horizontal: (1 to 1,1 to NumCols) 
              ' for 2D use: (1 to NumRows,1 to NumCols) 
        'Create the formulas... 
        For i = 1 To 100 
        ARRAY_OF_FORMULAS(i, 1) = "=1+3+" & i ' Or any other formula... 
        Next i 
    
        ' <-- your extra code here... 
        '  (New formulas won't be calculated. They are not in the Excel sheet yet! 
        '  If you want that no other old formula to recalculate use the old trick: 
        '  Application.Calculation = xlCalculationManual) 
    
        'At the very end, write the formulas in the excel at once... 
        Range("B1:B100").Formula = ARRAY_OF_FORMULAS 
    
    End Sub 
    

    新しい式で余分な遅延をしたい場合は、あなたが@Garyトリックを使用することができますが、範囲にはなく、単一のセルに適用されます。そのために'=1+2よう'と数式を開始し、最後に次のコードを追加します。

    '... previous code, but now formulas starting with (') 
        Range("B1:B100").Formula = ARRAY_OF_FORMULAS 
        'Formulas not calculated yet, until next line is executed 
        Range("B1:B100").Value = Range("B1:B100").Value ' <~~ @Gary's trick 
    End Sub 
    

    最後に、小さなスニップ:あなたの式がために他の水平配置(列Aのための手段1つの式、である場合最後に、あなたが以前のすべてのコードに代わり.Formulaの方法.FormulaR1C1を使用することができます

    Dim a as Variant 'Note that no() needed 
    a = Array("=1+3","=4+8","=5*A1","=sum(A1:C1)") 
    Range("A1:D1").Formula = ARRAY_OF_FORMULA ' Just a single row 
    ' or... 
    Range("A1:D100").Formula = ARRAY_OF_FORMULA ' If you want to repeat formulas 
                  ' in several rows. 
    

    :列B、など)や列のちょうど少数の、あなたは心の中で前のコードの短いバージョンを保持することができますたとえば、数式で相対参照を簡単に使用するには...

    希望すると便利です。

    +0

    面白い音。ありがとう!これまではGaryの提案をかなりうまく使ってきました。サイクル全体でアポストロフィを持つ数式を範囲全体に追加し、Range(任意)ですべてを実行します.Value = Range(任意).Value – pokrishka

    +0

    Good!あなたが速度を改善する必要があることがわかったら、これを使うことができます;-)。スピードに関するヒント:[(1)Excel VBA:効率とパフォーマンス](http://www.avdf.com/apr98/art_ot003.html) - [(2)高速コーディング](http:// blogs (3)MicrosoftがVBに配列を渡すことについての情報](http:// support.msdn.com/excel/archive/2009/03/12/excel-vba-performance-coding-best-practices.aspx) microsoft.com/kb/153090/en-us) –