0

一部の Excel レポートを自動化しようとしています。現在、Essbase サーバーからいくつかのデータを取得する必要があります。これを実現するために、Excel シートでデータを取得して設定するマクロを作成しました。私の VBA コードは次のとおりです。

Option Explicit
Declare Function EssVRetrieve Lib "ESSEXCLN.XLL" (ByVal sheetName As Variant, ByVal range As Variant, ByVal lockflag As Variant) As Long
Declare Function EssVConnect Lib "ESSEXCLN.XLL" (ByVal sheetName As Variant, ByVal userName As Variant, ByVal password As Variant, ByVal server As Variant, ByVal application As Variant, ByVal database As Variant) As Long
Declare Function EssVDisconnect Lib "ESSEXCLN.XLL" (ByVal sheetName As Variant) As Long

Sub Essbase_Update_Pulls()
Dim rangeString As String
rangeString = "B3:AC5033"
MsgBox ("Starting macro")
Dim wbSrc As Workbook
Dim m As Variant
Dim mySheetname As Variant, myUserName As Variant, myPassword As Variant, myServer, myApp As Variant, myDB As Variant
Dim lockflag As Integer
Dim myrng As range
Dim x As Integer
Dim y As Integer
Dim z As Integer
Dim strMsgTxt As String
Dim blnRetVal As Boolean

Set wbSrc = ActiveWorkbook

Set myrng = range(rangeString)

lockflag = 1
MsgBox ("Data set")
        mySheetname = "Sheet"
        myServer = "Server"
        myApp = "App"
        myDB = "DB"
        myUserName = "User"
        myPassword = "Pass"

MsgBox ("Trying connection")
        x = EssVConnect(mySheetname, myUserName, myPassword, myServer, myApp, myDB)
        MsgBox (CStr(x))
        If x < 0 Then
           blnRetVal = False
           strMsgTxt = "Essbase Login - Local Failure"
           MsgBox (strMsgTxt)
        ElseIf x > 0 Then
           blnRetVal = False
           strMsgTxt = "Essbase Login - Server Failure"
           MsgBox (strMsgTxt)
        Else
           blnRetVal = True
           strMsgTxt = "Success"
           MsgBox ("Connection Succeeded")
           y = EssVRetrieve(mySheetname, myrng, lockflag)
            If y = 0 Then
                MsgBox ("Retrieve successful.")
                z = EssVDisconnect(mySheetname)
                If z = 0 Then
                    MsgBox ("Disconnect Succeed.")
                    Else
                    MsgBox ("Disconnect failed.")
                End If
                Else
                MsgBox ("Retrieve failed.")
            End If
        End If
End Sub

変数 x はステータス コードを返すことになっています (0 は成功、それ以外は失敗)。Excel 内でこのマクロを実行すると、完全に実行されますが、C# から呼び出すとxlApp.Run("Essbase_Update_Pulls");、-3 のステータス コードが返されます。いくつかの調査を行ったところ、Excel アプリケーションがコードで作成されるたびに、アドインが読み込まれないため、 https://community.oracle.com/thread/2480398を手動で読み込む必要があることがわかりました。を繰り返したxlApp.AddInsところ、「essexcln.xll」が正しくインストールされていることがわかったので、今何をすべきかわかりません。また、実行時にアドインを追加できることもわかりましたが、これは例外を引き起こすだけです。ソースは次のとおりです 。 +call+to+Essbase

4

1 に答える 1

1

Essbase サーバーへの接続に必要なすべての dll および xll が Excel にロードされていないことがわかりました。それを機能させるには、Excel をプロセスとして起動し、インスタンスを取得して相互運用クラスに関連付ける必要があります。ここで解決策を見つけました:
Excel interop loading XLLs and DLLs
ユーザーはほとんど同じ問題を抱えていましたが、Bloomberg でした。SearchExcelInteropExcel が適切にロードされるのを待つ必要があることをメソッドに追加するだけThread.Sleep()です。私の場合は、StackOverflowException がスローされました。

于 2015-10-06T16:30:29.690 に答える