添加使用c#(或c+;+;/cli)访问vba的功能

添加使用c#(或c+;+;/cli)访问vba的功能,c#,c++,vba,excel,C#,C++,Vba,Excel,我需要在access中为vba添加新功能。我已经尝试了很多教程: (德语)和 (无法发布更多的代表原因) 但是没有一个适合我。客户有office 2013,我正在使用.net 4.5 我们想为客户提供一个RESTAPI,它已经用c#/.net编写,并且需要一些.net世界的加密DLL 我试图在“Interop COM”开关打开的情况下创建一个dll,并且可以将dll的引用添加到我的VBA测试表中,但是对象和静态测试函数都没有工作。VBA甚至没有智能。重新启动程序也不能解决问题。(尽管以前出了点问

我需要在access中为vba添加新功能。我已经尝试了很多教程: (德语)和 (无法发布更多的代表原因)

但是没有一个适合我。客户有office 2013,我正在使用.net 4.5

我们想为客户提供一个RESTAPI,它已经用c#/.net编写,并且需要一些.net世界的加密DLL

我试图在“Interop COM”开关打开的情况下创建一个dll,并且可以将dll的引用添加到我的VBA测试表中,但是对象和静态测试函数都没有工作。VBA甚至没有智能。重新启动程序也不能解决问题。(尽管以前出了点问题)

我检索到的错误消息是“运行时错误429-ActiveX组件无法创建对象”(对于我自己的代码以及来自codeplex的代码(对于所有模块、C#、VBA、C++/Cli))


是否还有其他方法,向VBA添加新功能/使用自己的功能扩展它?

好的,所以我终于找到了自己的方法

在本文中,链接了NuGet包的非托管导出。 因此,我创建了一个新的C#DLL项目,为测试目的插入以下代码:

using RGiesecke.DllExport;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    internal static class Class1
    {
        [DllExport("square", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        static Double Square(Double dateValue)
        {
            return dateValue * dateValue;
        }

        [DllExport("test", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        static String Test()
        {
            return " ok";
        }

        [DllExport("mytest2", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        static void Test4(String doSomething)
        {
            // Manipulate (and obisously create new) String
            doSomething += " ok";
        }
    }
}
在打开x64开关的情况下编译此文件,并在excel中使用以下内容创建VBA工作表:

Option Explicit

Private Declare PtrSafe Function square Lib "C:\Users\<Name>\documents\visual studio 2013\Projects\ClassLibrary1\ClassLibrary1\bin\x64\Release\ClassLibrary1.dll" (ByVal dateValue As Double) As Double
Private Declare PtrSafe Function test Lib "C:\Users\<Name>\documents\visual studio 2013\Projects\ClassLibrary1\ClassLibrary1\bin\x64\Release\ClassLibrary1.dll" () As String
Private Declare PtrSafe Function mytest2 Lib "C:\Users\<Name>\documents\visual studio 2013\Projects\ClassLibrary1\ClassLibrary1\bin\x64\Release\ClassLibrary1.dll" (ByRef dateValue As String)

Private Sub CommandButton1_Click()
    Dim zahl As Double
    zahl = CInt(TextBox1.text)
    zahl = square(zahl)
    Label1.Caption = CStr(zahl)

    Dim text As String
    text = "This is"
    mytest2 (text)
    MsgBox text
End Sub
选项显式
私有声明PtrSafe函数方库“C:\Users\\documents\visual studio 2013\Projects\ClassLibrary1\ClassLibrary1\bin\x64\Release\ClassLibrary1.dll”(ByVal dateValue为Double)为Double
私有声明PtrSafe函数测试库“C:\Users\\documents\visual studio 2013\Projects\ClassLibrary1\ClassLibrary1\bin\x64\Release\ClassLibrary1.dll”为字符串
私有声明PtrSafe函数mytest2 Lib“C:\Users\\documents\visual studio 2013\Projects\ClassLibrary1\ClassLibrary1\bin\x64\Release\ClassLibrary1.dll”(ByRef dateValue作为字符串)
私有子命令按钮1_单击()
Dim zahl作为替身
zahl=CInt(TextBox1.text)
zahl=正方形(zahl)
标签1.标题=CStr(zahl)
将文本变暗为字符串
text=“这是”
mytest2(文本)
MsgBox文本
端接头

我仍然得到的唯一错误是调用test函数时。返回字符串似乎会破坏excel。(程序立即退出)但我认为这应该在另一个问题中解决。

您想添加什么具体功能?我知道你的问题比较笼统,但如果你能详细说明你想做什么,那么也许有一个“权宜之计”可以做到。