2015-10-06 68 views
0

我試圖自動化一些Excel報告。目前,我需要檢索從Essbase的服務器的一些數據,爲了達到這一點,我已經創建了一個宏來檢索和在Excel工作表中設定的數據,我的VBA代碼如下:用C測試Essbase宏#

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中運行這個宏,它就可以完美運行,但是當我使用xlApp.Run("Essbase_Update_Pulls");從C#調用它時,它會返回狀態碼-3。 做了一些研究,我發現無論何時在代碼中創建Excel應用程序時,它都沒有加載加載項,因此必須手動加載 https://community.oracle.com/thread/2480398。 我重複了xlApp.AddIns,發現「essexcln.xll」安裝正確,所以我不知道現在該做什麼。此外,我發現可以在運行時添加外接程序,但這只是導致異常,這裏是源: http://www.network54.com/Forum/58296/thread/957392331/Visual+Basic-Excel+Api+call+to+Essbase

回答

1

發現,Excel未加載所有的DLL和XLL的需要連接到去的Essbase服務器。爲了使其工作,有必要啓動excel作爲一個過程,並獲取實例並將其與interop類相關聯。我在這裏找到了解決方案:
Excel interop loading XLLs and DLLs
用戶幾乎有同樣的問題,但彭博社。我只是在SearchExcelInterop方法中添加它需要Thread.Sleep()等待Excel加載正確,在我的情況下,它拋出一個StackOverflowException。