Tag: vba

如何将C#类公开给文档级外接程序中的VBA模块?

这是一个假设的情况。 我想知道是否可以在文档级外接程序中将C#类暴露给VBA。 这是一个SSCCE: 在VS PRO 2012中,我启动了一个新项目, 选定办公室 – > Excel 2010工作簿 。 ( 确保选择.Net framework ver 4 ) 我已向Sheet1添加了DateTimePicker控件。 我可以在C#解决方案中的DateTimePicker控件中设置/获取.Value属性而不会出现问题。 在调试时:在VBA中, 不公开.Value属性。 ( 试过.OLEFormat.Object.Value ) 并非所有属性都可以向VBA公开,因为ActiveX控件DateTimePicker由MSForms包装,因此Excel可识别它(兼容性)。 我需要能够从VBA获取包装控件的实际值,但我不确定如何去做( 是否可能 )… 我知道控件本身支持事件,但这不是我想要的路径。 我希望能够从控件中获取静态/当前值。 这是我希望能够做到的: 在我的C#解决方案中添加一个类 公开它,所以它可以从像Dim obj as new MyExposedClass这样的VBA Dim obj as new MyExposedClass 然后让MyExposedClass存储对DateTimePicker引用,因为它出现在C#中(所有属性都可用) 然后我可以定义一个函数GetValue(string controlName) ,它返回C#POV中的Value 所以我发现这个解决方案 +( 这个 )似乎适用于应用程序级外接程序,但它不适用于文档级外接程序。 当我调试我的解决方案并打开VBA的对象浏览器时,我可以看到引用被自动添加到Microsoft Visual Studio 2008 […]

使用com-interop将数组从vba传递给c#

使用com-interop将用户定义的类数组从vba传递到.net(特别是c#)的正确方法是什么? 这是我的c#代码。 如果我从vba调用Method1,它会因“期望的数组或用户定义类型”或“函数使用visual basic中不支持的自动化类型”而失败。 public class MyClass { public Method1(UserDefinedClass[] Parameters) { … } public Method2(Object Parameters) { … } } 我已经阅读了一些关于MarshallAsAttribute类的内容。 这可能是c#代码中缺少的部分吗? 这是我正在使用的vba代码: Dim udt As New UserDefinedClass Dim myArray() myArray(1) = udt myClass.Method1(myArray) myClass.Method2(myArray)

来自Int的C#Char用作String – VB Chr()的真正等价物

我正在将VBA宏转换为C#。 在VBA中, chr(7)可以简单地连接到一个string ,就像chr()会产生一个string 。 为什么不能在C#中完成? 我试图找到我的问题的明确答案。 我已经在SO和其他几个网站上阅读了很多关于此的post和相关问题。 例如,这是一个关键答案(许多其他人被标记为dulpicates并重定向到这个): 在C#中VB的Asc()和Chr()函数的等价物是什么? 不幸的是,答案并不清楚,很多时候他们说这是正确的用法: string mystring=(char)7; 然而它给了我一个编译器错误,因为它不作为字符串进行求值。 我不得不用它来使它工作: string mystring=((char)7).ToString(); 这将等同于VB Chr()函数,实际上VB中的Chr()计算为字符串。 我的问题是:我是否总是需要将char显式转换为string或者在某些情况下它会隐式转换? 更新: Per @ Dirk的答案,这也有效: string mystring = “” + (char)7; 这并没有减少我的神秘感。 如果连接有效,为什么没有隐式转换? 我想对VB Chr()与C#中的等价物之间的区别进行全面解释。 我会很感激任何我可以阅读的参考资料,甚至可以做的例子。 提前致谢。

VBA相当于使用C#或VB.NET导入/创建别名

基础参考: VBA,Visual Basic .NET和C#的十个代码转换 注意: 我已经创建并导入了一个*.dll ,这个问题是关于 别名的 。 假设Test类的编程名称是TestNameSpace.Test [ProgId(“TestNamespace.Test”)] public class Test … 现在,假设一个C#解决方案已被密封并编译成*.dll ,我在Excel的VBE中引用它。 注意:此时我无法修改程序名称,就好像*.dll不是我编写的那样。 这是在VBA :而不是像这样声明一个变量: Dim myTest As TestNameSpace.Test Set myTest = new TestNameSpace.Test 我更喜欢称之为(仍在VBE中) Dim myTest As Test Set myText = new Test 在C#中你通常会说 using newNameForTest = TestNamespace.Test; newNameForTest myTest = new NewNameForTest; 注意:假设VBA项目中没有命名空间冲突 问题: 在VBA中using或VB.NET imports别名是否有相同的调用?

操作方法:从C#Ribbon Addin运行现有的Word VBA宏

背景:我在Word中使用了一组广泛的专用VBA宏来进行文档格式化。 在Word 2003中,这些宏是从自定义工具栏激活的。 我最近转换到Word 2007,并希望能够从使用VS 2010创建的新Wordfunction区运行这些现有的VBA宏。我创建了一个function区; 但是,我无法弄清楚如何从新的function区按钮调用现有的宏。 问题:如何从C#Word加载项调用存储在.dotm模板中的现有VBA宏? 任何帮助将不胜感激。

如何从C#代码中捕获Microsoft Access VBA调试错误?

我有一个C#程序,它打开几个Microsoft Access文件,并从每个文件中执行function。 本质上,代码看起来像这样: Microsoft.Office.Interop.Access.Application app = new Microsoft.Office.Interop.Access.Application(); app.Visible = true; app.OpenCurrentDatabase(accessFileFullPath, false, “”); //Call the function app.Eval(function); 但是,当VBA代码中发生调试错误时,我想将其捕获到我的C#程序中。 请不要回答:“在您的VBA程序中捕获错误”。 由于我不会涉及的原因,这是不可能的。 我过去使用的一种方法是让一个线程间歇性地监视任何Visual Basic Debug窗口的句柄(FindWindowEx Win32函数返回非零值)。 我不喜欢这种方法,也不想继续使用它。 我找到了这个适用于Microsoft Excel的线程 。 本质上,它使用Microsoft.VisualBasic.CallByName()函数,它显然可以被捕获在try / catch块中,而无需用户交互。 但是,我无法使用Microsoft Access – 主要是因为我无法弄清楚如何使用此命令调用函数/ sub。 任何建议都将真诚地感谢! 编辑:正如我在下面的一个答案中提到的,我尝试将Eval()包装在try / catch块中,我的C#程序似乎忽略它,直到用户点击“Microsoft Visual Basic”上的“结束”按钮“错误对话框。 我不希望任何用户交互,而是想要捕获VBA错误以便在我的C#程序中处理。

访问等效于C#List 的VBA

我有一个用C#编写的COM可见对象,它接受一个字符串数组列表。 我可以将Access 2000中的字符串数组集合发送到此对象吗? 如果没有,那么从Access 2000向C#对象发送多个字符串数组的最佳方法是什么?

如何在不使用Interop的情况下将VBA代码注入Excel .xlsm?

我的目标是将宏添加到Excel工作簿,而无需在Excel信任中心中启用“信任访问VBA项目对象模块”。 (启用访问似乎存在安全风险)。 在我最初的事实查找搜索中找到了随机拼图: – 我看到VBA脚本作为vbaProject.bin存储在压缩的.xlsm文件中。 – 有几个免费/商业资源可以使用excel文件: 创建excel没有interop和模板,有或没有行和列 如果只是在C#项目中有一个VBA脚本文件,C#代码从中提取并注入Excel文档而没有VBA互操作,那将是很好的。 任何快速/快速/简单/直接的方式,或者我应该使用上面链接的免费/商业资源吗?

在VBA中对C#COM库进行早期绑定

虽然这是一个很长的问题,但编码和测试部分应该很容易重现。 我在C#创建了两个单独的Class Libraries ,我认为我遇到了由我以前的项目和试验中的现有注册表项引起的名称冲突问题。 这是我的两个class级: using System; using System.Runtime.InteropServices; namespace Test { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid(“ED5D264B-1D80-4A5D-9C14-8297D90B7037”)] public interface ITest { // body } [ClassInterface(ClassInterfaceType.None)] [Guid(“8B261B92-8EC5-4CDC-A551-67DEB42137FF”)] [ProgId(“Test.TestClass”)] public class TestClass : ITest { // body } } 和 using System; using System.Runtime.InteropServices; using ADODB; namespace Test { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid(“ED5D264B-1D80-4A5D-9C14-8297D90B7037”)] public interface IConnection { // body } [ClassInterface(ClassInterfaceType.None)] [Guid(“8B261B92-8EC5-4CDC-A551-67DEB42137FF”)] […]

无法从VBA实例化用C#编写的COM对象(VB6确定)

使用VS 2008,这是我的COM对象 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; namespace TestCom { [Guid(“9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E”)] [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId(“Test9.COMINT”)] public class TestComClass { public void Init(string userid, string password) { MessageBox.Show(string.Format(“{0}/{1}”, userid, password)); } } } 如果我构建它并在生产机器上注册如下 REGASM /CODEBASE TESTCOM.DLL 从一个简单的VB6应用程序,这工作正常 Private Sub Form_Load() Dim o As Object Set o = CreateObject(“Test9.COMINT”) o.Init “A”, “B” End […]