0

我在 VBA 有一堂课:

Option Explicit

Private mo As omMsg.Message

Private Sub Class_Initialize()
 Set mo = New omMsg.Message
End Sub

Private Sub mo_OnMessageSend(ByVal status As omMsg.ProcessStatus, ByVal msg As String)
   ProcessComMessage status, msg
End Sub

mo_OnMessageSend 没有被调用。

C#类如下:

namespace omMsg
{   
public interface IMessage
{
    void sendMessage(Message.ProcessStatus status, string msg);       
    event Message.MessageHandler OnMessageSend;
}

[ClassInterface(ClassInterfaceType.None)]
public class Message : IMessage
{
    public enum ProcessStatus { Retrieving, Generating, Error, Complete }

    public delegate void MessageHandler(ProcessStatus status, string msg);
    public event MessageHandler OnMessageSend;

    public void sendMessage(ProcessStatus status, string msg)
    {
        if (OnMessageSend != null)
            OnMessageSend(status, msg);
    }
}
}

请帮忙。我做对了吗?

谢谢。

4

1 回答 1

1

基本演练

我们将从一个非常基本的示例开始。我们将让 Excel 调用一个 .NET 方法,该方法将字符串作为输入(例如“World”)并返回与该输入字符串连接的“Hello”(例如,“Hello World”)。

- 在 Visual Studio 2005 中创建一个名为“DotNetLibrary”的 C# Windows 类库项目。就本示例而言,它位于哪个文件夹中并不重要。

- 要从 Excel 调用我们库中的类中的方法,我们需要该类具有默认的公共构造函数。显然,该类还需要包含我们想要调用的任何方法。对于这个演练,只需将以下代码复制并粘贴到我们的默认类文件中:

using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetLibrary
{
    public class DotNetClass
    {
        public string DotNetMethod(string input)
        {
            return "Hello " + input;
        }
    }
}

就是这样:如果您查看网络上的现有文章,或阅读 MSDN 帮助,您可能会认为您需要使用接口,或者使用属性和 GUID 来装饰您的类。但是,对于基本的互操作方案,您不需要这样做。

-Excel 将使用 COM 与我们的库进行通信。为了让 Excel 使用 COM 库,注册表中需要有适当的条目。Visual Studio 可以为我们生成这些条目。

为此,请调出项目属性(在解决方案资源管理器中双击“属性”)。然后: i) 在“应用程序”选项卡上单击“程序集信息...”按钮。在出现的对话框中选中“使程序集 COM 可见”复选框。单击“确定”。ii) 在“构建”选项卡上选中“注册 COM 互操作”复选框(朝底部:您可能需要向下滚动)。

- 建立图书馆。

- 现在启动 Excel 并打开一个新的空白工作簿。打开 VBA 代码编辑器: i) 在 Excel 2007 中,这有点难找。如果尚未设置,您必须在功能区上显示开发人员选项卡。为此,请单击 Microsoft Office 按钮(屏幕左上角),然后单击 Excel 选项(位于最底部)。在结果选项对话框中选中“在功能区中显示开发人员选项卡”复选框。单击确定。这会将“开发人员”添加到功能区菜单的末尾:单击此按钮。然后单击功能区左端的“Visual Basic”图标。ii) 在 Office 的早期版本(2003、XP、2000)中,只需转到菜单栏上的工具/宏/Visual Basic 编辑器。

- 我们现在需要包含对我们新库的引用。在 Visual Basic 编辑器的“工具”菜单上选择“参考”。如果您在结果对话框中向下滚动,您应该会发现“DotNetLibrary”在列表中。选中旁边的复选框,然后单击“确定”。

- 现在打开 Sheet1 的代码窗口(在项目窗口中双击 Sheet1)。将下面的 VBA 代码粘贴到 Sheet1 的代码窗口中:

Private Sub TestDotNetCall() 
Dim testClass As New DotNetClass 
MsgBox testClass.DotNetMethod(“World”) 
End Sub

- 单击刚刚粘贴的代码中的任意位置,然后按“F5”运行代码。您应该会看到一个“Hello World”消息框。

于 2012-08-21T01:41:27.223 回答