2016-03-29 2 views
2

私のアプリケーションでは、Excel文書にVBマクロが含まれているかどうかを確認する必要があります。私は、実行時エラー91Interop.Excelを使用して、ExcelファイルにVBAマクロが含まれているかどうかを確認してください

91でExcelからメッセージを取得するいくつかのExcelファイルと

internal static bool ExcelContainsMacros(string pathToExcelFile) 
{ 
    bool hasMacros = true; 
    Microsoft.Office.Interop.Excel._Application excelApplication = new Microsoft.Office.Interop.Excel.Application(); 
    Microsoft.Office.Interop.Excel.Workbook workbooks = null; 
    try 
    {  
     object isReadonly = true; 
     workbooks = excelApplication.Workbooks.Open(
      pathToExcelFile, missing, isReadonly, missing, missing, missing, 
      missing, missing, missing, missing, missing, missing, 
      missing, missing, missing); 
     hasMacros = workbooks.HasVBProject;  
     LogHasMacros(hasMacros); 
    } 
    catch (Exception exception) 
    { 
     LogError(exception); 
    } 
    finally 
    { 
     excelApplication.Workbooks.Close(); 
     excelApplication.Quit(); 
    } 
    return hasMacros; 
} 

:変数オブジェクトまたはだから私は、Excelドキュメントを確認するには、次の方法を書いていますブロック変数が設定されていない

私はそれをデバッグし、excelApplication.Workbooks.Close();の呼び出しでメッセージが表示されることを認識しました。このコード行を削除しても、excelApplication.Quit();のコールで同じExcelメッセージが表示されます。

Excelシートを正しく閉じるとExcelがこのメッセージを表示しないようにするためには何が必要ですか?

あなたは.NET/C#、 Microsoft.Office.Interop.Excelオブジェクトライブラリと Runtime.InteropServices.Marshalオブジェクトを利用して、次の洗練されたコードスニペット、を参照することがあなたのタスクに関連する
+0

作業中のワークブックを閉じる必要があります。 workbooks.Close() - ワークブックも、Workbooksオブジェクトとよく似ているので、変数にとって恐ろしい名前です。 – Sorceri

+0

エラーのある行excelApplication.Workbooks.Close()を削除するだけで問題ありません。 –

+0

'excelApplication.Quit();'を削除しても、Excelシートに何の影響もありませんか? – Tomtom

答えて

3

、:bool?

internal static bool? ExcelContainsMacros(string pathToExcelFile) 
{ 
    bool? _hasMacro = null; 
    Microsoft.Office.Interop.Excel._Application _appExcel = 
     new Microsoft.Office.Interop.Excel.Application(); 
    Microsoft.Office.Interop.Excel.Workbook _workbook = null; 
    try 
    { 
     _workbook = _appExcel.Workbooks.Open(pathToExcelFile, Type.Missing, true); 
     _hasMacro = _workbook.HasVBProject; 

     // close Excel workbook and quit Excel app 
     _workbook.Close(false, Type.Missing, Type.Missing); 
     _appExcel.Application.Quit(); // optional 
     _appExcel.Quit(); 

     // release COM object from memory 
     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_appExcel); 
     _appExcel = null; 

     // optional: this Log function should be defined somewhere in your code   
     LogHasMacros(hasMacros); 
     return _hasMacro; 
    } 
    catch (Exception ex) 
    { 
     // optional: this Log function should be defined somewhere in your code   
     LogError(ex); 
     return null; 
    } 
    finally 
    { 
     if (_appExcel != null) 
     { 
      _appExcel.Quit(); 
      // release COM object from memory 
      System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_appExcel); 
     } 
    } 

お知らせNULL可能タイプ:このコンテキストで、nullはエラーを示します(つまり、結果は不定です)。true/falseの値は、テスト対象のExcelファイル内のVBAマクロの有無を示します。

これが役に立ちます。

関連する問題