2012-11-16 30 views
0

我試圖循環訪問Excel工作簿,並將粘貼值複製到該工作簿中每張工作表的頂部 上。但是當我進入下一張表時,我遇到了一行記憶問題: ws.select(true)。Interop.Excel 0x800A03EC - 內存不足錯誤代碼7

遇到錯誤:

異常來自HRESULT:0x800A03EC: ,當我走在這一點上,關閉工作簿的出卓越拋出: 超出內存(錯誤7)

其他信息:

文件大小3mb,20個選項卡和從olap數據庫TM1讀取的大量數據庫公式。 Microsoft office 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; 
     } 
    } 
+0

你可以嘗試與辦公室2003年和2010年?以及從另一臺電腦? – bonCodigo

回答

0
ws.Activate(); 
ws.Select(true); 
ws.UsedRange.Select(); 

我認爲這些代碼是沒有必要的。

您可以記錄一個Marco來學習如何修改您的代碼。

+0

值得一嘗不同的環境,bonCodigo。問題是解決方案需要部署在2007年的環境.... applogies如果我上面的代碼有一點重複,這是我嘗試了許多不同的方式來使它工作.... –

1

我有一個程序,從多達100個標籤複製回第一個摘要頁面,我發現使用.Copy()引起了一些問題。特別是如果你的程序運行了一段時間;當前用戶無法使用複製粘貼功能而沒有奇怪的結果。我建議使用變量來存儲您需要的內容,然後寫入預期的範圍。如果您需要更改範圍的格式,錄製宏是無價之寶。