2

私はstackoverflowを初めて使用するため、質問から直接始めます。

統合されたVBAを介してExcel用のマクロを開発した経験は数年あり、半年前に新しい言語のC#を学び始めました。私はそれが好きで、それは可能性があり、Visual Studioを介してC#で直接Officeプラグインを開発するオプションも見つけました(VSTOが必要です)。私が抱えている問題は、C#を使用して作成されたアドインとVBAを使用して作成されたマクロの速度を比較しようとした複数のテストを行った後です(たとえば、文字列「テスト文字列」をA1からA10000までの各セルに個別に貼り付けます)。問題は、統合されたVBAが、Visual Studio(C#)を使用して作成された前述のアドインよりも数倍高速であったことです。そのときはこの問題を気にしないことにしましたが、後で同じ問題が発生しましたが、今回はcca 10秒(VBA)プロセスの代わりに2分以上かかりました!

グーグルで調査した後、特にアプリがExcelと対話する必要がある場合、VSTOはパフォーマンスの点で良くないことがわかりました(したがって、データを動的配列に保存してから全体に直接入力するなど、問題を回避する方法がありますアクティブシートへの配列); ただし、Excelと対話する必要がある場合があります(ブック内の多くのシートを動的に保護解除する必要があったように...ここでは、ActiveSheet.Unprotectと言う必要があります)

皆さんへの私の質問は、遅いVSTO以外に、簡単に展開できるExcel / Word /その他のOffice製品用のアドイン(おそらく他のソフトウェア)を作成する方法はありますか?どうもありがとうございます。

よろしく、ロバート

4

2 に答える 2

6

10000 個のセルを個別に入力すると、VSTO が非常に遅いと思われます。あなたが言及したDynamic Arrayメソッドを使用すると、その時間のほんの一部でそれを行うことができます:

static public void PopulateABigNumberOfCells(Excel.Application xlApp, DataTable dataTable)
{
//Turn off Excel updating
SwitchApplicationSettings(xlApp,false);

//Populate a 2D array - via a DataTable in this example
object[,] values = (object[,])Array.CreateInstance(typeof(object), new int[2] { dataTable.Rows.Count, dataTable.Columns.Count }, new int[2] { 1, 1 });
for (int i = 0; i < dataTablea.Rows.Count; i++)
{
 for (int j = 0; j < dataTable.Columns.Count; j++)
 {
  values[i + 1, j + 1] = dataTable.Rows[i][j] == DBNull.Value ? 0 : dataTable.Rows[i][j];
 }
}

//Populate all cells in one swoop 
leftCellNum = XlHelper.ColumnNameToNumber(leftColumn);
string rightBottom = XlHelper.ColumnNumberToName(leftCellNum + dataTable.Columns.Count - 1);
using (var targetRange = xlApp.Range[leftColumn + (startingRow) + ":" + rightBottom + (startingRow + dataTable.Rows.Count - 1)].WithComCleanup())
{
targetRange.Resource.Value2 = values;
}

//Turn on Excel updating
SwitchApplicationSettings(xlApp,true);
}

static public void SwitchApplicationSettings(Excel.Application xlApp, bool on)
{
xlApp.ScreenUpdating = on;
xlApp.DisplayAlerts = on;
xlApp.Calculation = on ? XlCalculation.xlCalculationAutomatic : XlCalculation.xlCalculationManual;;
xlApp.UserControl = on;
xlApp.EnableEvents = on;
}

より良いメモリ管理のためにVSTO Contribを使用しています。

オブジェクト モデルの使用は、何千ものセルを個別に設定することについて具体的に話さない限り、VBA よりも 12 倍遅くはありません。

于 2012-11-09T04:36:39.743 に答える
6

VSTO-Excel のパフォーマンスの問題は、VBA/VB6 が使用する Excel への Com インターフェイスの上に Interop レイヤーを追加する必要があるために発生します。そのため、この方法を使用した VSTO と Excel の対話は常に遅くなります。

Excel DNA (無償) や Addin Express (無償) などの製品を使用して、C# で XLL インターフェイスを使用することができます。このインターフェイスを使用すると高速になりますが、Com インターフェイスよりも制限があります。

ここでは、 UDF を開発するためのさまざまなテクノロジの 1 つの比較を示します。

VBA コードの配布は簡単です。アプリケーション レベルで機能するアドイン (XLA/XLAM) を作成するか、ドキュメント固有のソリューション用に VBA コードが埋め込まれたワークブックを配布します。

于 2012-07-20T07:56:37.553 に答える