投稿者 とくま  (社会人) 投稿日時 2024/4/8 11:06:27
>Message=CLSID {00024500-0000-0000-C000-000000000046} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラー
>Dim xlApp As New Excel.Application
Excelの起動で失敗なので、ライセンスかDLL参照か、環境依存のことも多いから、他人がズバリの回答は難しい問題ですね。
色々試して、動けば良いけど、Microsoftのサポート受けたほうが早いのでは?まである。

>この部分では、プログラムょ変更する以前は出なかったエラーなのですが、変更しようとして急にエラーになってしまいました。
変更前の動いていたプログラムの作成者は別の方ですか?特殊な設定とかしていませんでしたか?

>サーバーの実行に失敗しました
>Runtime.Remoting.Activation.ActivationServices.CreateInstance
> f:\dd\ndp\clr\src\BCL\system\runtime
Fドライブはネットワークドライブですか?
ネットワーク越しのアプリケーション実行は制限が多いので、ネットワーク越しの処理があるならローカルで試しては?

>セキュリティーソフトに問題があると、セキュリティーソフトを停止する他、方法が思いつかず、難しいです。
当たり前の話だけど、セキュリティーソフトによって仕様は違いますが、一時的に停止できたり、
安全なサイトやアプリを対象外として登録できるアプリも多いと思いますが。
思い付くどうこう以前に、セキュリティソフトの仕様を確認しては?
現状で原因が全く絞れていません。一時的に停止して動いたなら、そこで原因が特定できます。
最終的に停止して業務するかとは別の話です。試すだけならできるのでは?

>Office の再インストール
過去、別バージョンのOfficeをインストールしていた場合、レジストリにゴミ情報が残っていて、プログラムから
うまく参照できない場合があります。大抵は再インストールすれば上手くいきますが、専用のツールで
クリーンな環境にしたり、手動でレジストリを修正しないと上手くいかない場合もあります。

>参照設定
Office の再インストールなどを試した後、参照設定は一度解除して、参照しなおした方が良いかも?
これも古い情報が残る場合があります。プロジェクトフォルダ配下の bin、obj フォルダも削除して
作り直すほうが良いです。

>その他
新規プロジェクトで参照設定せず、遅延バインディングのコードで、ローカルのExcel起動のみ実行してみるとか。
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim xlApp As Object = CreateObject("Excel.Application")
        Dim xlBooks As Object = xlApp.Workbooks
        Dim xlBook As Object = xlBooks.Add()
        Try
            xlApp.Visible = True
        Finally
            MRComObject(xlBook)
            MRComObject(xlBooks)
            MRComObject(xlApp)
        End Try
    End Sub

    'https://hanatyan.sakura.ne.jp/dotnet/index.html 
    'VB2005/VB2008/VB2010 用 
    ''' <summary> 
    ''' COMオブジェクトの参照カウントをデクリメントします。 
    ''' </summary> 
    ''' <typeparam name="T">(省略可能)</typeparam> 
    ''' <param name="objCom"> 
    ''' COM オブジェクト持った変数を指定します。 
    ''' このメソッドの呼出し後、この引数の内容は Nothing となります。 
    ''' </param> 
    ''' <param name="force"> 
    ''' すべての参照を強制解放する場合はTrue、現在の参照のみを減ずる場合はFalse。 
    ''' </param> 
    Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T,
     Optional ByVal force As Boolean = False)
        If objCom Is Nothing Then
            Return
        End If
        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                If force Then
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub


Excel保存ファイルの編集だけなら、サードパーティ製のXMLファイル編集ライブラリを使って
回避する手もありますね。Excelを実行しないプログラムにします。
マクロ実行したそうなプログラムだから無理かもだけど。

>タスクスケジューラーは分からないですが、
>セキュリティーソフトを停止する他、方法が思いつかず
技術者なら知っていそうな、メジャーな知識が足りてないと感じる言葉です。
しかし、直面している問題は、セキュリティ面やライセンスまで波及する可能性があります。
技術者を雇ったり、外注できないのですか?