2011-03-10 184 views
1

如果你以前見過類似的東西,我會盡我所能去道歉。我試圖得到一個明確的答案,我想我已經看到了在另一個論壇上回答的問題 - 我只是非常希望我誤解了答案。總之,我想編寫vba subs /函數,它們通過C#業務邏輯層和ExcelDNA從SQL數據庫獲取參數和檢索數據。ExcelDNA:帶參數的命令,返回數據類型

C#圖層是.Net解決方案的一部分,它將來自多個應用程序的請求封送到多個數據庫。 Config是集中管理的,DataAccess對象是在工廠運行時創建的。

返回類型可能因請求應用程序而異 - 相同的數據可能會被請求爲Dictionary,DataTable等。根據用戶權限/訪問權限,輸入參數等,業務層將對數據執行各種聚合和計算操作然後將對象返回給請求的應用程序。

不幸的是,一個用戶有一個基於Excel的應用程序,我現在必須集成。從閱讀關於VSTO,COM,Automation Add-in和ExcelDNA,我決定最好將項目添加到與ExcelDNA接口的解決方案中。但是,經過許多嬰兒步驟,從單元格中的SQL返回簡單的字符串到Excel函數,我現在需要嘗試並返回一個DataTable(這裏靈活)到VBA函數。該VBA會採取一些參數,如數據庫名稱,環境(PROD,UAT,DEV),ModelRunId,startDate,endDate ....

但從我讀過的,這是不可能的。有沒有人做到這一點?我正在編寫一個簡單的WinForms應用程序,並在某些網格上公開「導出到Excel」功能 - 讓Excel用戶完成腿部工作....

直接寫入SQL服務器並使用像CopyFromRecordSet這樣的方法不是一種選擇。

在此先感謝

+0

ExcelDNA的目標是使其創建.NET UDF的效率和簡單 - 您爲什麼需要創建VBA UDF? – 2011-03-10 08:42:24

+0

如果您的問題是如何使Excel UDF向多個單元格返回值表,請查看創建數組UDF。 – 2011-03-10 08:47:34

+0

我不想在VBA中使用UDF。所有功能都在C#圖層中。它執行數據檢索,聚合,計算字段,根據安全規則刪除數據等。我只想從VBA調用這些C#函數。該調用將不得不包含一些參數。返回的表的大小可以根據列和行而變化,所以我認爲這可能會使vba中的數組變得困難。也許我可以返回DOM文檔? – JamesR 2011-03-11 01:20:08

回答

2

這聽起來像你想創建一個C#/。NET COM服務器,並讓本到Excel VBA。

舉個例子,C#創建一個類,使COM可見,並給它一個GUID和程序id,就像這樣:

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDual)] 
[Guid("AAA82C86-91CF-496C-A8BA-70742DC58475")] 
[ProgId("MyVbaFunctions")] 
public class MyVbaFunctions 
{ 
    public string GetSomeData(string arg1) 
    { 
     return "Return your data"; 
    } 
} 

然後,您需要勾選「註冊爲COM Interop」選項在Visual Studio中的「生成」首選項中。一旦你建立了你的項目,你可以進入Excel VBA編輯器,點擊工具 - >參考菜單,在註冊類型庫列表中找到你的程序集並勾選它。

然後你應該可以編寫一個使用C#類的VBA宏。在VBA事情是這樣的:

Sub MyMacro() 
    Dim MyFuncs As New MyLibrary.MyVbaFunctions 
    Debug.Print MyFuncs.GetSomeData("hello") 
End Sub 

很明顯,你可以擴展你的庫包含多個類和方法,全部由C#的支持。

當涉及到部署您的程序集給用戶時,您需要使用「regasm.exe/codebase MyLibrary.dll」(使用'/ u'註銷它)註冊它。

由於您已經在使用Excel-DNA,因此您應該查看一下支持[ExcelComClass]屬性的幹線源代碼,該屬性允許Excel-DNA承載您的COM服務器而不是默認值(mscoree.dll )。這意味着您的功能將與您的UDF在同一個應用程序域中運行。