添加使用c#(或c+;+;/cli)访问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))添加使用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甚至没有智能。重新启动程序也不能解决问题。(尽管以前出了点问
是否还有其他方法,向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。(程序立即退出)但我认为这应该在另一个问题中解决。您想添加什么具体功能?我知道你的问题比较笼统,但如果你能详细说明你想做什么,那么也许有一个“权宜之计”可以做到。