0

5 つのファミリ内のさまざまなポートフォリオのパフォーマンスのレポートを生成するサブルーチンがあります。問題は、問題のポートフォリオが同じになることはなく、各ファミリーの金額も同じではないということです。そのため、テンプレート (書式設定されたもの) をコピーして貼り付け、書式設定された行 (数式および... を含む) をレポートの各ポートフォリオの適切なファミリに追加します。もちろん、コードは最適でも完璧でもありませんが、必要なものには問題なく機能します。問題はコード自体ではありません。最初にコードを実行すると、非常に速くなります (1 秒程度)。最初のタスクと同じ)。画面を更新せずにすべて手動で計算してみましたが、実際には問題の原因ではありません。私にはメモリリークのように見えますが、どこに問題があるのか​​ わかりません! なぜコードは非常に高速に実行されるのに、実行直後は非常に遅くなるのでしょうか...レポートの長さとファイルの内容に関係なく、レポートごとに Excel を閉じて再度開く必要があります。

**明確かどうかはわかりませんが、コードがExcelファイルを大きくするなどの理由ではありません。最初の(高速)実行後、ワークブックを保存して閉じてから再度開くと、(新しい)最初の実行再び非常に高速になりますが、閉じて再度開くことなく同じ excat を実行したとしたら、非常に遅くなっていたでしょう...^!^!

Dim Family As String
Dim FamilyN As String
Dim FamilyP As String
Dim NumberOfFamily As Integer
Dim i As Integer
Dim zone As Integer


Sheets("RapportTemplate").Cells.Copy Destination:=Sheets("Rapport").Cells
Sheets("Rapport").Activate

i = 3
NumberOfFamily = 0
FamilyP = Sheets("RawDataMV").Cells(i, 4)
While (Sheets("RawDataMV").Cells(i, 3) <> "") And (i < 100)

    Family = Sheets("RawDataMV").Cells(i, 4)
    FamilyN = Sheets("RawDataMV").Cells(i + 1, 4)

    If (Sheets("RawDataMV").Cells(i, 3) <> "TOTAL") And _
    (Sheets("RawDataMV").Cells(i, 2) <> "Total") Then

        If (Family <> FamilyP) Then
            NumberOfFamily = NumberOfFamily + 1
        End If
        With Sheets("Rapport")
            .Rows(i + 8 + (NumberOfFamily * 3)).EntireRow.Insert
            .Rows(1).Copy Destination:=Sheets("Rapport").Rows(i + 8 + (NumberOfFamily * 3))
            .Cells(i + 8 + (NumberOfFamily * 3), 6).Value = Sheets("RawDataMV").Cells(i, 2).Value
            .Cells(i + 8 + (NumberOfFamily * 3), 7).Value = Sheets("RawDataMV").Cells(i, 3).Value
        End With
    End If
    i = i + 1
    FamilyP = Family
Wend

For i = 2 To 10
    If Sheets("Controle").Cells(16, i).Value = "" Then
        Sheets("Rapport").Cells(1, i + 11).EntireColumn.Hidden = True
    Else
        Sheets("Rapport").Cells(1, i + 11).EntireColumn.Hidden = False
    End If
Next i
Sheets("Rapport").Cells(1, 1).EntireRow.Hidden = True

'Define printing area
zone = Sheets("Rapport").Cells(4, 3).End(xlDown).Row
Sheets("Rapport").PageSetup.PrintArea = "$D$4:$Y$" & zone


Sheets("Rapport").Calculate
Sheets("RANK").Calculate
Sheets("SommaireGroupeMV").Calculate
Sheets("SommaireGroupeAlpha").Calculate
Application.CutCopyMode = False

サブ終了

4

3 に答える 3

3

現時点ではラップトップを持っていませんが、いくつかのことを試すことができます。

  1. オプションの明示的な使用を使用して、それらを使用する前にすべての変数を宣言することを確認してください。
  2. 私が覚えていることから、数値のネイティブvbaタイプは整数ではなくlongであり、整数は long に変換され、計算時間を節約するために整数の代わりに long を使用します。
  3. =cells()ファミリー変数は文字列として定義されていますが、値ではなくセル全体を格納します=cells().value
  4. 経験則では、cells(rows.count, 4).end(xlup).row 代わりにcells(3, 4).end(xldown).row.;を使用します。
  5. 条件付き書式は処理速度を大幅に低下させる可能性があります。
  6. 可能な場合はfor eachループをwhileの代わりに範囲で使用するか、範囲をバリアント配列にコピーしてそれを反復処理します (これが最速のソリューションです)。
  7. レイト バインディングのアーリー バインディングを使用します。つまり、できるだけ早く適切なタイプのオブジェクトを定義します。
  8. 印刷領域を表示しません (改ページなど)。
  9. いくつかのポファイリングを実行してボトルネックを探してみてください - Excel vba のボトルネックを見つけるを参照してください。
  10. フォーマットが必要ない場合は、値のみを貼り付けます。
  11. コピー/貼り付けのたびにクリップボードをクリアします。
  12. オブジェクトを使い終わったら Nothingに設定します。
  13. Valueの代わりにValue2を使用- 書式設定を無視し、書式設定された値の代わりに数値のみを取ります。
  14. シート オブジェクトを使用して参照します。たとえば、

    Dim sh_raw As Sheet, sh_rap As Sheet set sh_raw = Sheets("RawDataMV") set sh_rap = Sheets("Rapport")

そして、sh_raw代わりにSheets("RawDataMV")どこでも使用します。

于 2014-05-24T20:20:15.257 に答える
1

私は同じ問題を抱えていましたが、最終的にそれを理解しました。これはばかげているように聞こえるかもしれませんが、すべて印刷ページの設定に関係しています。どうやらExcelはセルを更新するたびに再計算するようで、これが速度低下の原因です。

使ってみて

Sheets("Rapport").DisplayPageBreaks = False

ルーチンの開始時、計算の前に

Sheets("Rapport").DisplayPageBreaks = True

それの終わりに。

于 2016-09-12T19:45:39.133 に答える