0

Excelワークブックを循環させ、そのワークブック内の各シートの上に値をコピーして貼り付けようとしています。しかし、次のシートに移動するときに ws.select(true) という行でメモリの問題が発生しています。

発生したエラー:

HRESULT からの例外: 0x800A03EC: この時点でブックを閉じようとすると、Excel がスローします: メモリ不足 (エラー 7)

追加情報:

ファイル サイズ 3 MB、20 個のタブ、および olap データベース TM1 から読み取る多数のデータベース式。マイクロソフト オフィス 2007

私が実行しているコードは以下のとおりです。メモリ不足エラーを防ぐより効率的な実行方法はありますか、それとも何か違うのでしょうか??

どんな助けでも大歓迎です!

#
    public bool wbCopyValueOnly(string workBook) 
    { 

    Workbook wb = excel.ActiveWorkbook;
    Worksheet ws;
    Range rng;

    int WS_Count = wb.Sheets.Count;
    for (int i = 0; i < WS_Count; i++)
    {
        try
        {
            ws = wb.Sheets[i + 1];
            ws.Activate();
            ws.Select(true);
            //ws.Select(Type.Missing);
            //ws.Cells.Select();
            ws.UsedRange.Select();

            //ws.Cells.Copy();
            ws.UsedRange.Copy(Type.Missing);
            ws.UsedRange.PasteSpecial(Excel.XlPasteType.xlPasteValues, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
            // select of range to get around memory issue
            excel.Application.CutCopyMode = (Excel.XlCutCopyMode)0;
            //rng = ws.get_Range("A1");
            //rng.Select();
            NAR(ws);

        }
        catch (System.Runtime.InteropServices.COMException err)
        {

            cLogging.write(LogLevel.Error, err.Message);
            Debug.Print(err.Message);
            return false;
        }


    }
    NAR(wb);
    return true;

    }


    private void NAR(object o)
    {
        try
        {
            while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
        }
        catch { }
        finally
        {
            o = null;
        }
    }
4

2 に答える 2

1

最大100個のタブから最初の要約ページにコピーするプログラムがありますが、.Copy()を使用するといくつかの問題が発生することがわかりました。特に、プログラムが長時間実行される場合。現在のユーザーは、奇妙な結果がなければコピー&ペースト機能を使用できません。変数を使用して必要なものを格納してから、目的の範囲に書き込むことをお勧めします。範囲の形式を変更する必要がある場合は、マクロの記録は非常に重要です。

于 2012-12-03T22:34:52.993 に答える
0
ws.Activate();
ws.Select(true);
ws.UsedRange.Select();

これらのコードは必要ないと思います。

マルコを記録して、コードの変更方法を学ぶことができます。

于 2012-11-16T09:26:42.333 に答える