2009-05-28 43 views
5

VBA & Excelで生成されるレポートが多数あります。わずかな割合のレポートしか実際の計算ではありません。大部分の処理は、SQL呼び出しとセルの書式設定/書込みです。一番長いものは数時間で、大部分はそれぞれ20-30分程度かかります。無料のVB6/VBAプロファイラとExcelのベストプラクティス

VB6デスクトップアプリケーションで使用されるDLLにVBA/Excelコードがプラグインされます。ここではすべてのSQL呼び出しが行われます。私はここに改善の余地があると確信していますが、それは私にとって心配なことではありません。デスクトップアプリケーションはかなりうんざりです。

2つのVBA関数が豊富に使用されています。これらは、GetRangeおよびSetupCellと呼ばれ、ほぼ常に一緒に表示されます。 GetRange関数は、Excel.Rangeオブジェクトのラッパーです。それはシートをとり、範囲の範囲に対して4つの値をとります。主な用途は、編集のためにセルを選択することです。それをoptmisingの多くのチャンスがあるようには表示されませんが、それは最善の方法ですか?

そのパートナーはSetupCellです。これはExcel.Rangeオブジェクト、テキスト、セルに関する十数のパラメータ(フォント、枠線など)を取ります。これらのパラメータのほとんどはオプションのブール値ですが、やはり非常に無駄に思えます。これらのうちのいくつかは死後に設定することができますが、一部はセルに含まれる値に依存します。

これらの機能には非常に多くのコードが含まれていますが、主にステートメントや作業で投稿できない場合があります。 がより良い方法はあり、それは何とは、私は時間の大部分はここまたはDLLであるかどうかを確認するために使用できる無料のプロファイラがあります:

は、私は二つの質問を持っていると思いますか?

答えて

3

実際のレポート作成ソリューションの使用について考えましたか?あなたのバックエンドデータベースは何ですか? MSSQL 2000以上を使用している場合は、無料で使用できるかなりまともなレポートソリューションがあります。 SQL Server Reporting Services

レポートが時間フォーマットセルのほとんどを費やしているかのように聞こえます。これは、レポートが非常に遅く見えて、デスクトップアプリがそうでない理由かもしれません。

手作業で書式設定がわかっていて、かなり静的な場合は、シートをプリフォーマットして一部の作業を減らすことができます。

私はこれもそこに投げます。ほとんどのレポートソリューションでは、条件付き書式設定などが可能ですが、Excelのパフォーマンスよりもはるかに優れたパフォーマンスが得られるように設計されています。

+0

それほど簡単ではありません。レポートの長さが異なる必要があり、セルの一部(またはセルの合計)に応じていくつかのセルを着色する必要があります。 –

+0

SSRSはあなたが投げるほとんどすべてに対処することができます - 私はこの答えの2番目です。 –

3

これはプロファイラーの推奨事項ではありませんが、画面を更新する時間を費やしているExcelマクロを高速化するための提案です。マクロの実行中に画面の更新をオフにすると、優れた結果が得られました.Application.ScreenUpdating = False、also using a number of other similar settingsを設定します。マクロが終了したら、必ず再度それらをオンに戻してください:P

+0

既にこれを行い、Application.Calculationをmanual(xlCalculationManual)に設定しました。 –

1

これは無料ではなく、これでプロファイルすることができます。デモがあなたのニーズに合っていると思われます。http://www.aivosto.com/vbwatch.html

+0

一部のレポートでは、はいです。他の人には、いいえ。各ワークシートにはvbaの 'ファイル'と複数のサポート 'ファイル'があります。それは10000以上のクラスとモジュールを持っているので、それは絶対にDLLで動作しません。 –

6

レポートには数時間はばかげています。

問題がVBAの購入「プロフェッショナルエクセルの開発」(Stephen Bullen、Rob Bovey他):これはPerfMonと呼ばれる無料のVBAプロファイラを持っています。

問題は、Excelの計算がhttp://msdn.microsoft.com/en-us/library/aa730921.aspx?ppud=4

を見ている。しかし、私はこの問題は、物事セル・バイ・セルを参照するに関連付けられた高いオーバーヘッドであることを推測する場合:あなたは、常に時間で細胞の大きなブロックで動作するはずです。

+0

あなた自身のために良いポン引き:-)問題は計算ではありませんが、真剣に - 私たちは計算をほとんど(エクセルまたはその他)します。プロファイラは、dbへの呼び出しがシステムを強制終了しているか、またはセルごとに遅いフォーマットが強制終了しているかを判断するのに役立ちます。一度に大きなブロックの細胞をどのように扱うことができますか? –

+2

Stephen BullenのPerfMonを使用したくない場合は、高解像度ウィンドウタイマーを使用してタイムコードを追加するだけではいかがですか? ブロック単位で処理する基本的なアプローチは、バリアント変数に範囲を割り当てることです。 バリアントとしてのvArr vArr =範囲( "B4:z456")。値2 これは、2-d配列 同様に、セルをフォーマットすると、セルの範囲をフォーマットするとき(おそらく、テンプレートシートのcopy/pastespecialを使用して)、配列を操作してExcelを Range( "B4:z456")= vArr 細胞。 など –

0

VBAコード(またはシートに書き込んでいるVBコード)がラインごとに行なわれているように聞こえますが、これは時間がかかり、設計が貧弱です。一度にバリアントとしてExcelに書き込むデータがすべてインポートされたら、シートをフォーマットします。 ありがとう ロス

関連する問題