2011-01-28 8 views
0

私は1つのワークシートAから別のものに値をコピーするためにExcelクラスをベースとする既存のプロジェクトを作業しています。B.いくつかの式とAddin関数がwsAセルにあります。コピーコードは、結果として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アプリケーションでマクロが有効になっていない可能性があります。これは、値をコピーできない理由である可能性があります。たとえば、ソースファイルを開くと、マクロを有効または無効にするためのプロンプトが表示されます。 [有効にする]ボタンをクリックすると、データセルに値を表示するのに時間がかかります。

これが理由であれば、セル内のすべての数式が値を更新できるように、マクロを有効にする方法はありますか?

別の理由は、OSまたはWindowsのセキュリティ更新プログラムが原因である可能性があります。 Windowsセキュリティ設定がExcelマクロに影響するかどうかは不明です。このような場合は、Windowsのセキュリティレベルを変更するか、プロジェクトでマクロを有効にする方法を変更する必要がありますか?

ところで、私のプロジェクトは、Windows XPとWindows 2008 Serverで実行され、Office Excel 2003がインストールされています。このプロジェクトはVS 2008で行われました。

+0

マクロを有効にするマクロ? :-) – Shoban

+0

コンピュータのExcelマクロセキュリティレベルを下げることはできますが、ファイルを送信するユーザーは誰でもマクロを有効にするかどうかを確認するメッセージが表示されます。 –

+0

Excelのマクロアラートを最も低く設定しようとしましたが、それでも動作しません。私と同じことをやっているコードは、インタラクティブにExcelを開きます。コピーと特殊なペーストを行いますが、コードは私が期待したように値をコピーしません。 –

答えて

1

私は自分のコードに詳しいので、実際に何が起こったのか分かりました。 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. 
... 

例えば、私は(F9をシミュレートする)、私のC#のコード内のリンクを再構築し、細胞内の設定値と値を更新したり、計算します。 Excelを見えるようにすることで、何が起こっているのかを見て、自分のコードでバグを見つけました。

関連する問題