1

開発マシンとテスト マシンで Excel の動作が異なるという奇妙な問題があります。

私のアドインでは、実行時間の長いプロセスのためにいくつかの場所で ScreenUpdating をオフにしました。私のマシンでは、これは正常に動作します。ScreenUpdating = trueテスト マシンでは、セルに書き込むとすぐに Excel が設定されます。

次のコードは、私の問題を示しています。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Microsoft.Office.Interop.Excel.Application excel = Globals.ThisAddIn.Application;

    MessageBox.Show(excel.ScreenUpdating.ToString());

    excel.ScreenUpdating = false;
    MessageBox.Show(excel.ScreenUpdating.ToString());

    Workbook workbook = Globals.ThisAddIn.Application.ActiveWorkbook;
    Worksheet w = (Worksheet)workbook.Worksheets[1];
    ((Range)w.Cells[1, 1]).Value = "Test";
    MessageBox.Show(excel.ScreenUpdating.ToString());
}

私のマシンで Excel を開くと、3 つのメッセージ ボックスが表示されます。

「真」、「偽」、「偽」。

テストマシンで彼らは言う

「真」、「偽」、「真」。

また、リモート デバッガーを使用してScreenUpdating、セル値が設定された直後にプロパティが変化するのを確認しました。さらに、リセットされるのはこれだけではありませんScreenUpdating。ワークシートまたはワークブックの追加または削除もこれを行います。

各システムの Excel バージョンは同じです (14.0.6112.5000 (32 ビット))。

何が原因でしょうか? Excel が設定を尊重するように修正するにはどうすればよいですか?

4

3 に答える 3

3

VSTO アドインを使用した Bloomberg アドインによって、ScreenUpdating (およびその他の設定) が true にリセットされるという同じ問題が発生しています。彼らのサポートは解決策に取り組んでいますが、当面の間、次の解決策は問題なく機能します。

セルを操作するときに各シートを非表示にすると、画面が更新されず、パフォーマンスが向上します。エラーが発生するため、最後のシートを非表示にしないでください。これがあなたのプロジェクトに適しているかどうかはわかりませんが、私の場合は実行可能なソリューションです。

VB.NET でシートを非表示にするコードの例を次に示します。

' Create a book with a single worksheet
Dim Book As Excel.Workbook
Book = Globals.ThisAddIn.Application.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet)


'% Create sheet variable
Dim Sheet As Excel.Worksheet
Sheet =  TryCast(Book.ActiveSheet, Excel.Worksheet)

' Visible
Sheet.Visible = Excel.XlSheetVisibility.xlSheetVisible

' Hidden but user able to show
Sheet.Visible = Excel.XlSheetVisibility.xlSheetHidden

' Hidden for user as well
Sheet.Visible = Excel.XlSheetVisibility.xlSheetVeryHidden
于 2012-11-20T18:23:17.693 に答える
1

Excel の他のアドインは、その単一のグローバル設定に干渉する可能性があります。

そのため、使用前に現在の ScreenUpdating 状態をローカル変数に保存し、使用後に復元する必要があります。

イベントでのその設定の変更を無視しThisAddIn_Startupます (通常はそこで作業を行うことはないため)。

于 2012-06-11T12:58:32.257 に答える
0

アドインが何らかの方法で ScreenUpdating に干渉している場合は、イベントを一時的に無効にすることで、アドインの実行を停止できます。を使用してEnableEvents。これにより、そのアドオンの機能が損なわれる可能性がありますが、私のニーズには問題なく機能しました.

于 2013-06-11T17:17:38.263 に答える