ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6227|回复: 14

[求助] VBA 调用 C# 生成的DLL 文件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-11-15 21:37 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:封装
小弟用C# 生成的DLL 文件,函数返回值为:string 或者数组的时候,在VBA中能正常调用,但返回值为:DataTable 时,可以调用,但只能:call  rs.DataReadDataTable   ,var =rs.DataReadDataTable 就会报错。
在VBA中不知道怎么调用。

求各位帮助:怎么写,通过VBA代码取到C#  DataTable 中的数据,DataTable 其实也就是一张表。


VBA 代码:
Private Sub CommandButton1_Click()
   Dim rs As New XmlEvent
   Dim var As Variant
   var = rs.DataReadDataTable        '出错,call  rs.DataReadDataTable 没有错误提示
End Sub



C#代码:
using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections;
using System.Data;
namespace Common
{
    [Guid("694C1820-04B6-4988-928F-FD858B95C880")]
    /**/
    /// <summary>
    /// XML生成
    /// </summary>
    public interface XmlEvent_Interface
    {
        [DispId(1)]
        int DataWrite(String filePath, String serviceID, ref String[] tag);
        [DispId(2)]
        String[,] DataRead(String filePath);
        [DispId(3)]
        System.DataTable DataReadDataTable();//如果为:String,则可以正常调用

    }
    // Events interface Database_COMObjectEvents
    [Guid("47C976E0-C208-4740-AC42-41212D3C34F0"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface XmlEvent_Events
    {
    }
    [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(XmlEvent_Events))]
    /**/
    /// <summary>
    /// XML生成
    /// </summary>
    public class XmlEvent : XmlEvent_Interface
    {
        public XmlEvent()
        {
        }

        public int DataWrite(String filePath, String serviceID, ref String[] tag)
        {
            //Do Something;
            return 1000;
        }

        public String[,] DataRead(String filePath)
        {
            //Do Something;
            string[,] s = new string[,] { { "A", "ABC****-****123" },
                                          { "B", "ABC1****-****1232" },
                                          { "C", "www1****-****2ggg" },
                                          { "D", "1ggg****-****2ggg" }
                                        };
            return s;
        }
        public System.DataTable DataReadDataTable()//如果为:String,则可以正常调用
        {
            DataTable dt = new DataTable("Table_AX");
            dt.Columns.Add("column0", System.Type.GetType("System.String"));
            DataColumn dc = new DataColumn("column1", System.Type.GetType("System.Boolean"));
            dt.Columns.Add(dc);
            DataRow dr = dt.NewRow();
            dr["column0"] = "AX";
            dr["column1"] = true;
            dt.Rows.Add(dr);
            return  dt;
        }
    }
}

点评

知识树内容索引:10楼,演示通过VBA调用C#托管代码DLL的方法  发表于 2013-11-18 01:59

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-15 21:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
自己顶一下。

TA的精华主题

TA的得分主题

发表于 2013-11-15 22:01 | 显示全部楼层
用object读出来看看,如果不能识别的话,还是转成数组输出吧

或者看看Adodb里面是否支持这个类型

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-16 11:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-11-16 13:18 | 显示全部楼层
不懂C,所以猜一下,这样试一试:
var =rs.DataReadDataTable
改为
Set var =rs.DataReadDataTable

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-17 22:23 | 显示全部楼层
cbtaja 发表于 2013-11-16 13:18
不懂C,所以猜一下,这样试一试:
var =rs.DataReadDataTable
改为

var =rs.DataReadDataTable,这是对函数的调用,是没有问题的。
set var =rs.DataReadDataTable 是错误的。

TA的精华主题

TA的得分主题

发表于 2013-11-17 22:58 | 显示全部楼层
liuhengping 发表于 2013-11-17 22:23
var =rs.DataReadDataTable,这是对函数的调用,是没有问题的。
set var =rs.DataReadDataTable 是错误的 ...

似乎不能向上调用
向下调用是通过生成互操作库进行的

TA的精华主题

TA的得分主题

发表于 2013-11-17 23:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liuhengping 发表于 2013-11-17 22:23
var =rs.DataReadDataTable,这是对函数的调用,是没有问题的。
set var =rs.DataReadDataTable 是错误的 ...

加一对括号试试呢:
set var = rs.DataReadDataTable()

TA的精华主题

TA的得分主题

发表于 2013-11-18 01:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liucqa 于 2013-11-18 01:45 编辑

http://hi.baidu.com/daode1212/item/ac1002916a1315f328164749

http://bbs.csdn.net/topics/390201171

我觉得从效率上来讲,还是把DataTable转成二维数组,然后一次性写入Excel比较快。

http://blog.sina.com.cn/s/blog_8d3821d30101iikp.html

TA的精华主题

TA的得分主题

发表于 2013-11-18 01:57 | 显示全部楼层
本帖最后由 liucqa 于 2013-11-18 08:05 编辑

以下代码在VS2010+Excel2010调试通过,调试时,勾选 1.JPG

CS代码
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Data;

  4. namespace CSComObjectForVBA
  5. {
  6.     [System.Runtime.InteropServices.ComVisible(true)]  
  7.     /// <summary>
  8.     /// XML生成
  9.     /// </summary>
  10.     public interface XmlEvent_Interface
  11.     {
  12.         [DispId(1)]
  13.         int DataWrite(String filePath, String serviceID);
  14.         [DispId(2)]
  15.         String[] DataRead(String filePath);
  16.         [DispId(3)]
  17.         object[,] DataReadDataTable();

  18.     }

  19.     // Events interface Database_COMObjectEvents
  20.     [System.Runtime.InteropServices.ComVisible(true),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
  21.     public interface XmlEvent_Events
  22.     {
  23.     }

  24.     [System.Runtime.InteropServices.ComVisible(true), ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(XmlEvent_Events))]
  25.     /// <summary>
  26.     /// XML生成
  27.     /// </summary>
  28.     public class XmlEvent : XmlEvent_Interface
  29.     {
  30.         public XmlEvent()
  31.         {
  32.         }

  33.         public int DataWrite(String filePath, String serviceID)
  34.         {
  35.             return  (filePath + serviceID).ToString().Length;
  36.         }

  37.         public String[] DataRead(String filePath)
  38.         {
  39.             return filePath.Split('\\');
  40.         }

  41.         public object[,] DataReadDataTable()
  42.         {
  43.             DataTable dt = new DataTable("Table_AX");
  44.             dt.Columns.Add("column0", System.Type.GetType("System.String"));
  45.             DataColumn dc = new DataColumn("column1", System.Type.GetType("System.Boolean"));
  46.             dt.Columns.Add(dc);
  47.             DataRow dr = dt.NewRow();
  48.             dr["column0"] = "AX";
  49.             dr["column1"] = true;
  50.             dt.Rows.Add(dr);
  51.             return DataTable2Array(dt);
  52.         }

  53.         private object[,] DataTable2Array(DataTable tb)
  54.         {
  55.             //获得表的行,列数目
  56.             int row_num = tb.Rows.Count;
  57.             int column_num = tb.Columns.Count;

  58.             //生成一个二维数组
  59.             object[,] dataArry = new object[row_num, column_num];

  60.             //把表中的数据放到数组中

  61.             for (int i = 0; i < row_num; i++)
  62.             {
  63.                 for (int j = 0; j < column_num; j++)
  64.                 {
  65.                     dataArry[i, j] = tb.Rows[i][j];
  66.                 }
  67.             }
  68.             //返回数组
  69.             return dataArry;
  70.         }        
  71.     }
  72. }
复制代码

VBA代码,引用生成的dll 捕获.JPG

  1. Sub testCSdll()
  2.     Dim obj As CSComObjectForVBA.XmlEvent
  3.     Set obj = New CSComObjectForVBA.XmlEvent
  4.    
  5.     Dim filePath As String
  6.     Dim serviceID As String

  7.     Debug.Print obj.DataWrite("sd", "asdf")
  8.    
  9.     Dim ary
  10.     ary = obj.DataReadDataTable()
  11.     Stop
  12.     Set obj = Nothing
  13. End Sub
复制代码





点评

学习了,收藏  发表于 2013-11-18 07:52

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 16:25 , Processed in 0.034746 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表