63

ワークシートで多くのことが行われていると非常に遅くなる可能性があるため、Excelオートメーションのパフォーマンスを向上させるために何ができるか疑問に思っていました...

ここに私が見つけたいくつかがあります:

  • ExcelApp.ScreenUpdating = false-- 画面の再描画をオフにします

  • ExcelApp.Calculation = Excel.XlCalculation.xlCalculationManual-- 計算エンジンをオフにして、セルの値が変更されたときに Excel が自動的に再計算しないようにします (完了したらオンに戻します)。

  • Worksheet.Cells.Item(row, col)and の呼び出しを減らすWorksheet.Range-- 必要なセルを見つけるために、何百ものセルをポーリングする必要がありました。セル位置のキャッシュを実装することで、実行時間が ~40 秒から ~5 秒に短縮されました。

パフォーマンスに多大な影響を与え、避けるべき相互運用呼び出しにはどのようなものがありますか? 不必要な処理が行われないようにするために他に何ができますか?

4

7 に答える 7

49

C# または VB.Net を使用して範囲を取得または設定する場合、範囲の合計サイズを把握してから、1 つの大きな 2 次元オブジェクト配列を取得します...

//get values
object[,] objectArray = shtName.get_Range("A1:Z100").Value2;
iFace = Convert.ToInt32(objectArray[1,1]);

//set values
object[,] objectArray = new object[3,1] {{"A"}{"B"}{"C"}};
rngName.Value2 = objectArray;

オブジェクト配列から型を変換するときに Excel が自動的にこれを行うわけではないため、Excel が保存しているデータ型 (テキストまたは数値) を知っておくことが重要であることに注意してください。データのタイプを事前に確認できない場合は、必要に応じてテストを追加してデータを検証します。

于 2010-02-19T04:34:06.993 に答える
13

これは、データベースの結果セットから Excel シートにデータを入力する最善の方法を知りたい人向けです。これは決して完全なリストを意図したものではありませんが、いくつかのオプションをリストしています。

古い Pentium 4 3GHz ボックスで 155 列と 4200 レコードを含む Excel シートを入力しようとしたときのパフォーマンスの数値は次のとおりです。

  1. 一度に 1 つのセル - 11 分弱

  2. html に変換してデータセットを作成する + html をディスクに保存する + html を Excel に読み込み、ワークシートを xls/xlsx として保存する - 5 分

  3. 一度に 1 列 - 4 分

  4. SQL 2005 で非推奨の sp_makewebtask プロシージャを使用して HTML ファイルを作成する - 9 秒 + html ファイルを Excel にロードし、XLS/XLSX として保存する -約 2 分。

  5. .Net データセットを ADO RecordSet に変換し、WorkSheet.Range[].CopyFromRecordset 関数を使用して Excel に入力します - 45 秒!

オプション5を使用することになりました。これが役立つことを願っています。

于 2011-10-06T15:37:59.587 に答える
6

多くのセルの値をポーリングしている場合は、バリアント配列に格納されている範囲内のすべてのセル値を一度に取得できます。

Dim CellVals() as Variant
CellVals = Range("A1:B1000").Value

値を取得する範囲のサイズに関して、ここにはトレードオフがあります。1000 個以上のセル値が必要な場合は、さまざまなセルをループして値をポーリングするよりもおそらく高速です。

于 2008-12-15T18:31:10.523 に答える
5

可能な限り、Excel の組み込み機能を使用します。たとえば、特定の文字列を列全体で検索する代わりにfind、GUI で Ctrl-F を使用して使用できるコマンドを使用します。

Set Found = Cells.Find(What:=SearchString, LookIn:=xlValues, _
    SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

If Not Found Is Nothing Then
    Found.Activate
    (...)
EndIf

いくつかのリストをソートしたい場合は、Excelsortコマンドを使用してください。VBA で手動で実行しないでください。

Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
于 2008-12-10T15:12:32.077 に答える
2

Anonymous Type が言うように: 大きな範囲のブロックの読み取り/書き込みは、パフォーマンスにとって非常に重要です。

COM-Interop のオーバーヘッドが依然として大きすぎる場合は、最速の Excel インターフェイスである XLL インターフェイスの使用に切り替えることができます。

XLL インターフェイスは主に C++ ユーザーを対象としていますが、XL DNA と Addin Express は両方とも、COM-Interop よりも大幅に高速な .NET to XLL ブリッジ機能を提供します。

于 2015-02-08T12:40:29.583 に答える
2

パフォーマンスは、Excel を自動化する方法にも大きく依存します。VBA は COM オートメーションよりも高速で、.NET オートメーションよりも高速です。また、通常、初期 (コンパイル時) バインディングは遅延バインディングよりも高速です。

重大なパフォーマンスの問題がある場合は、コードの重要な部分を VBA モジュールに移動し、そのコードを COM/.NET オートメーション コードから呼び出すことを考えることができます。

.NET を使用する場合は、Microsoft から入手できる最適化されたプライマリ相互運用アセンブリも使用する必要があり、カスタム ビルドの相互運用アセンブリは使用しないでください。

于 2008-12-10T15:11:19.083 に答える
0

VBA でできるもう 1 つの大きなことは、Option Explicit を使用し、可能な限りバリアントを避けることです。バリアントは VBA で 100% 回避できるわけではありませんが、インタープリターは実行時により多くの作業を行い、メモリを浪費します。

Excel で VBA を使い始めたときに、この記事は非常に役に立ちました。
http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm

そしてこの本

http://www.amazon.com/VB-VBA-Nutshell-Language-OReilly/dp/1565923588

に似ている

 app.ScreenUpdates = false //and
 app.Calculation = xlCalculationManual

設定することもできます

 app.EnableEvents = false //Prevent Excel events
 app.Interactive = false  //Prevent user clicks and keystrokes

ただし、最初の 2 つほど大きな違いはないようです。

範囲値を配列に設定するのと同様に、列のすべての行に同じ数式を持つほとんどがテーブルであるデータを操作している場合、数式に R1C1 数式表記を使用して、列全体を数式文字列に等しく設定することができます。すべてを 1 回の呼び出しで。

app.ReferenceStyle = xlR1C1
app.ActiveSheet.Columns(2) = "=SUBSTITUTE(C[-1],"foo","bar")"

また、ExcelDNA と .NET を使用して XLL アドインを作成すること (または C の難しい方法) も、UDF を複数のスレッドで実行する唯一の方法です。(Excel DNA の ExcelFunction 属性の IsThreadSafe プロパティを参照してください。)

Excel DNA に完全に移行する前に、.NET で COM 可視ライブラリを作成して VBA プロジェクトで参照することも試しました。大量のテキスト処理は、VBA の Collection の代わりにラップされた .NET List クラスを使用するため、VBA よりも少し高速ですが、Excel DNA の方が優れています。

于 2015-07-16T23:36:37.590 に答える