1

Windows サービスからいくつかの Excel VBA コードを実行したいと考えています。サービスは、fileSystemWatcher を使用して、追加される xml ファイルのディレクトリを監視しています。ファイルが追加されると、xml ファイルの内容がオブジェクト プロパティに逆シリアル化されます。この段階で、Excel ファイルを開き、これらの値を特定のセルに渡し、そのブックから vba コードを実行したいと考えています。これは Windows フォーム アプリケーションからは完全に機能していますが、Windows サービス アプリケーションからは機能しません。アプリケーションにデバッガーを接続して何が起こっているのかを確認しましたが、エラーはスローされず、すべての手順が正常に完了しました。UI との対話とそれが持つユーザー権限に問題があるため、Windows サービスが MS Office ファイルを開くことをサポートしていないことは知っています。しかし、この vba コードをサービスから実行できるようにするための回避策を探しています。Windows 7 Home Premium 32 ビットを使用しており、サービスのアカウントを LocalSystem に設定しています。使用しているコードは次のとおりです。

    private void FSWatcherTest_Created(object sender, System.IO.FileSystemEventArgs e)
    {
            Trade t;
            XmlSerializer serializer;
            XmlReader reader;
            XmlWriter writer;

            string filePath = @"C:\Inbox\TradeInfo.xml";


            serializer = new XmlSerializer(typeof(Trade));
            reader = XmlReader.Create(filePath);
            t = (Trade)serializer.Deserialize(reader);
            reader.Close();



            string path=@"C:\Windows\System32\config\systemprofile\Desktop\TwsDde.xls";

            oXL = new Microsoft.Office.Interop.Excel.Application();

            oXL.Visible = true;

            oXL.DisplayAlerts = false;

            mWorkBook = oXL.Workbooks.Open(path,2, false, 5, "", "", true,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true,false, false);

            //Get all the sheets in the workbook

            mWorkSheets = mWorkBook.Worksheets;

            //Get the allready exists sheet

            mWSheet1=(Microsoft.Office.Interop.Excel.Worksheet)mWorkSheets.get_Item("Basic Orders");

            // Microsoft.Office.Interop.Excel.Range range= mWSheet1.UsedRange;

            mWSheet1.Cells[12, 1] = "GE";
            mWSheet1.Cells[12, 2] = "STK";
            mWSheet1.Cells[12, 7] = "SMART";
            mWSheet1.Cells[12, 9] = "USD";
            mWSheet1.Cells[12, 12] = "Buy";
            mWSheet1.Cells[12, 13] = "100";
            mWSheet1.Cells[12, 14] = "MKT";

            Excel.Range range;
            Excel.Range row;

            range = mWSheet1.get_Range("A12", "O12");
            range.EntireRow.Select();

            oXL.Run("TwsDde.xls!Sheet2.placeOrder");
        }

どんな助けでも大歓迎です。または、同じことを行う別の方法、つまり、このコードを含む Windows フォームを実行する方法はありますか?

4

3 に答える 3

5

あなたがしようとしていることはサポートされていません:

Office が不安定な動作を示したり、/または、この環境で Office を実行するとデッドロックが発生します。

プロセスが対話型デスクトップで実行されている場合は、Excel を自動化できます。非対話型デスクトップ (セッションなど) から Excel を自動化しようとする試みはサポートされておらず、失敗します。

于 2013-02-24T19:25:06.860 に答える
1

こんにちは、私はこれを一種のラウンドアバウトな方法で機能させることができました。私は基本的にこのチュートリアルに従い、サービスから対話型プロセスを起動するコードに従って、サービスをSYSTEMユーザーとして実行できるようにしましたが、最初にログオンしたユーザーのセッションIDを採用し、GUIアプリケーションなどの対話型プロセスを実行するための管理者権限をユーザーに付与しました. Excel を開いて Windows サービスを介してマクロを実行するには、まず Windows フォーム アプリケーションでこれを行うためのすべてのコードを作成し、最初にそこで動作することをテストしました。次に、実行可能ファイルを変更したところ、完全に機能しました。これが同じ問題を抱えている他の誰かに役立つことを願っています。

于 2013-02-27T15:41:10.837 に答える