2011-01-28 96 views
0

我正在工作一個現有的項目,它是基礎做Excel類從一個工作表A複製到另一個B.在Ws A單元格中有一些公式和Addin函數。作爲結果,複製代碼僅用於將值複製到ws B.下面是簡化的代碼塊:在代碼中啓用Excel宏?

using Excel = Microsoft.Office.Interop.Excel; 
.... 

object missing = System.Type.Missing; 

Excel.Application app = new Excel.Application(); 
// Creating Excel application with source workbook in memory 
Excel.Workbook workbook = app.Workbooks.Open("SourceA.xls", 
    Excel.XlUpdateLinks.xlUpdateLinksNever,....); 
... 

app.Calculate() // Forcing to recalculate value in cells. 
... 

//create destination workbook 
Excel.Workbook destWb = app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); 
Excel.WorkSheet destSheet = (Excel.Worksheet)destWb.Worksheets[1]; 
Excel.Range destRange = (Excel.Range)destSheet.Cells[1, 1]; 
//rename sheet 1 
destSheet.Name = "wsB Report"; 

//Set Source Data Range from 
Excel.WorkSheet sourceWA = (Excel.Worksheet)workbook.Worksheets["wsA"]; 
//Get the predefined named range "DataRange" from source wsA 
Excel.Range sourceRange = sourceWA.get_Range("DataRange", missing); 
//copy data 
sourceRange.Copy(missing); 

//paste values and number formats 
destRange.PasteSpecial(Excel.XlPasteType.xlPasteValuesAndNumberFormats, 
    Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, missing, missing); 
//paste formats 
destRange.PasteSpecial(Excel.XlPasteType.xlPasteFormats, 
    Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, missing, missing); 
//paste column widths 
destRange.PasteSpecial(Excel.XlPasteType.xlPasteColumnWidths, 
    Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, missing, missing); 
.... 

destWb.SaveAs("destB.xls", missing, ....); 

我的問題是,在destB.xls的拷貝的細胞都被標記爲「#NAME?」。他們應該被複制的值。我打開源Excel文件,我可以看到源範圍中的數據用值更新。但是,當我運行我的代碼時,這些值似乎不可用。

我想我的代碼中創建的Excel應用程序可能沒有啓用宏。這可能是原因值不能被複制。例如,當我打開源Excel文件時,我會看到一個提示來啓用或禁用宏。如果我點擊啓用按鈕,Excel會花費一些時間來顯示數據單元格中的值。

如果這是原因,是否有任何代碼啓用宏的方式,使單元格中的所有公式都能夠更新值?

另一個原因可能是操作系統或Windows安全更新引起的。不知道是否有任何Windows安全設置可能會影響Excel宏。如果是這種情況,我應該更改Windows安全級別還是以任何方式強制在我的項目中啓用宏?

順便說一句,我的項目運行在安裝了Office Excel 2003的Windows XP和Windows 2008 Server中。該項目在2008年完成。

+0

宏使宏? :-) – Shoban 2011-01-28 05:32:07

回答

1

我進一步進入我的代碼,我發現通過使Excel應用程序可見,我能夠看到實際發生了什麼。由於Ben Voigt的建議,宏的安全設置可以在Excel中完成,但是在代碼中,無論設置如何,都可以強制執行任何類似VBA的代碼。下面是一些代碼來使Excel可見並看到所有的提示對話框:

Excel.Application app = new Excel.Application(); 
Excel.Workbook workbook = app.Workbooks.Open("SourceA.xls", ...); 
app.Visible = true;  //set to 'true' when debbugging, Exec is visible 
app.DisplayAlerts = true; //enable all the prompt alerts for debug. 
... 

例如,我重建細胞的我的C#代碼鏈接,設定值,並刷新或計算值(模擬F9)。通過使Excel可見,我看到發生了什麼事情,並在我的代碼中發現了一些錯誤,這些錯誤並沒有達到我想要的效果。