1

次のコードを含む単純な Excel ファイルがあります。

Private Sub Workbook_Open()
   MsgBox "Hello World!"
End Sub

この Excel ファイルを開くために SQL ジョブを実行しようとしましたが、失敗し、応答しなくなりました。グーグルで、「なぜ」SQLジョブがExcelファイルを開かない理由を見つけました SQL Serverエージェントのジョブは完了しませんが、BIDSで完了しますか?

そこで、単純に Excel ファイルを開いてマクロを実行する単純なコンソール アプリケーションを C# で作成することを考えました。これが私のコードです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using System.Threading;


namespace T_OpenExcel
{
class Program
{
    static void Main(string[] args)
    {

        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        //Excel.Worksheet xlWorkSheet;

        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Open(@"E:\data_extracts\TestHelloWorld.xlsm", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
        RunMacro(xlWorkBook, new Object[] { "TestHello" });


        Thread.Sleep(5000);

        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();
    }

    private static void RunMacro(Excel.Workbook xlWorkBook, object[] p)
    {
        //throw new NotImplementedException();
    }
}
}

このコードを IDE で正常に実行できました。今、SSMS、SQL Server 2008 の SQL ジョブからこれを実行したいと思います。

C# プロジェクト (T_OpenExcel-->bin-->Debug-->T_OpenExcel.exe) から T_OpenExcel.exe ファイルを取得しました。SQL ジョブを作成しました。詳細の一部を以下に示します。

ステップ名: OpenHelloWorldExcel タイプ: オペレーティング システム(CmdExec) 実行先: SQL Server エージェント サービス アカウント コマンド: C:\Users\shress2\Documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\bin\Debug\T_OpenExcel.exe

このジョブを実行すると、次のステータスが表示されます Start Job 'TestHelloWorld' Status Success Execute job 'TestHelloWorld' Status Error

履歴を表示すると、次のように表示されます。 メッセージ Executed as user: GSOPS4\SYSTEM. 未処理の例外: System.Runtime.InteropServices.COMException: Microsoft Excel はファイル 'E:\data_extracts\TestHelloWorld.xlsm' にアクセスできません。いくつかの理由が考えられます。
ファイル名またはパスが存在しません。ファイルは別のプログラムによって使用されています。保存しようとしているブックは、現在開いているブックと同じ名前です。Microsoft.Office.Interop.Excel.Workbooks.Open (文字列のファイル名、オブジェクトの UpdateLinks、オブジェクトの読み取り専用、オブジェクトの形式、オブジェクトのパスワード、オブジェクトの WriteResPassword、オブジェクト IgnoreReadOnlyRecommended、オブジェクトの起源、オブジェクトの区切り記号、編集可能なオブジェクト、オブジェクトの通知、オブジェクト コンバーター、オブジェクトでAddToMru, Object Local, Object CorruptLoad) at T_OpenExcel.Program.Main(String[] args) in C:\Users\shress2\documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\Program.cs:line 23. プロセス終了コード-532462766. ステップは失敗しました。

E:\data_extracts\TestHelloWorld.xlsm ディレクトリを確認したところ、動作していることがわかりました。xlsm ファイルが誰にも使用されていないことを確認しました。実行に失敗した理由がわかりませんでした。どんな助けでも大歓迎です。よろしくお願いします!

4

1 に答える 1

1

問題は、Excel ファイルを開いているときにメッセージ ボックスを表示しようとしているようですが、それを自動化しているため、メッセージ ボックスのボタンをクリックする人間がいません。ファイルは誰かがボタンをクリックするのを待っているため、残りのコードは実行できません。

その後の実行では、サーバーはまだそこに座っており、通常のユーザーには見えず、ボタンがクリックされるのを待っているため、アクセスできません。したがって、エラー。

短いバージョン: 無人で実行されるアプリでユーザー入力を要求しないでください。

于 2012-05-21T16:43:55.853 に答える