2011-01-28 93 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可见,我看到发生了什么事情,并在我的代码中发现了一些错误,这些错误并没有达到我想要的效果。