ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wodewan

[原创] ExcelDna,让Excel跑起来!

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-23 21:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
fxl447098457 发表于 2022-8-23 08:31
问个问题哈。在通过exceldna访问com对象模型属性方法时候,需要将函数的objet参数rng转成Microsoft.Offic ...

是可以实现的不过有点麻烦,要调用C-API,因为ExcelDna的函数参数是不支持COM类型的参数传递的,通过一个ReferenceToRange进行转换,具体可以看下官方文档,就不多说了。
看你也是用的C#写的,附上C#版本供参考!不过单单这个还不行,还有一个小坑,看你自己能不能发现,哈哈。。。
  1.   public class MyFunction: XlCall
  2.     {
  3.         private static object ReferenceToRange(ExcelReference xlRef)
  4.         {
  5.             int cntRef;
  6.             string strText;
  7.             string strAddress;
  8.             Application App =ExcelDnaUtil.Application as Application;
  9.             strAddress = (string)Excel(xlfReftext, xlRef.InnerReferences[0], true);
  10.             for (cntRef = 1; cntRef <= xlRef.InnerReferences.Count - 1; cntRef++)
  11.             {
  12.                 strText = (string)Excel(xlfReftext, xlRef.InnerReferences[cntRef], true);
  13.                 strAddress = strAddress + "," + strText.Substring(0,strText.LastIndexOf("!") + 2);
  14.             }
  15.             return App.Range[strAddress];
  16.         }


  17.         [ExcelFunction(IsMacroType = true)]
  18.         public static string GetRangeComment([ExcelArgument(Description = "含有批注的单元格",AllowReference =true)] object Rng)
  19.         {
  20.             Range r = (Range)ReferenceToRange((ExcelReference)Rng);
  21.             if (r!=null)
  22.             {
  23.                 return r.Comment.Text();
  24.             }
  25.             else
  26.             {
  27.                 return null;
  28.             }

  29.         }
  30.     }
复制代码

1.gif

TA的精华主题

TA的得分主题

发表于 2022-8-23 22:32 | 显示全部楼层
wodewan 发表于 2022-8-23 21:05
是可以实现的不过有点麻烦,要调用C-API,因为ExcelDna的函数参数是不支持COM类型的参数传递的,通过一个 ...

谢了。有空我研究下。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-24 09:29 | 显示全部楼层
fxl447098457 发表于 2022-8-23 22:32
谢了。有空我研究下。

不客气,看你的帖子已经自己解决了,这个问题官方文档里是有VB.Net的解决方案的,我只是把文档转成了C#而已,另外除了你说的Marco和AllowRefence外还有个问题就是在DNA文件里记得把ExplicitRegistration改为True,不然貌似也会报错

TA的精华主题

TA的得分主题

发表于 2022-10-19 08:14 | 显示全部楼层
wodewan 发表于 2022-7-9 23:15
吐槽一下,代码文字模式有点麻烦,代码贴进去的和显示的不一样,可能只能识别VBA吧?编辑了好几回,估计老 ...

大佬有QQ群或者QQ吗?想交流一下

TA的精华主题

TA的得分主题

发表于 2023-1-8 09:18 | 显示全部楼层
非常感谢楼主的无私分享,ExcelDna也发展很多年了,现在已经很成熟了,用起来非常方便,我感觉与VSTO比唯一不足之处就是Ribbon不能可视化开发,对新手来说有点不方便。
另外楼主能不能接着写一些技术分享贴啊,我觉得楼主写的非常通俗易懂。

TA的精华主题

TA的得分主题

发表于 2023-1-29 11:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
兰色的回忆 发表于 2023-1-8 09:18
非常感谢楼主的无私分享,ExcelDna也发展很多年了,现在已经很成熟了,用起来非常方便,我感觉与VSTO比唯一 ...

可以vsto画控件,然后导出xml给dna用

TA的精华主题

TA的得分主题

发表于 2023-1-29 11:54 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-29 15:28 | 显示全部楼层
tonychris 发表于 2023-1-29 11:54
有没有最新的手动打包xll的工具ExcelDnaPack.exe

Github下源码,在Distribution文件夹下,那个肯定是是最新的,貌似上星期刚更新。
image.jpg

TA的精华主题

TA的得分主题

发表于 2023-1-29 16:13 | 显示全部楼层
wodewan 发表于 2023-1-29 15:28
Github下源码,在Distribution文件夹下,那个肯定是是最新的,貌似上星期刚更新。

恩,我也发现了,多谢。手动把dll打包成xll,直接
ExcelDnaPack a.dna /Y /O a.XLL
就行了吧

TA的精华主题

TA的得分主题

发表于 2023-6-27 10:03 | 显示全部楼层
wodewan 发表于 2022-7-13 14:22
四、窗体和任务窗格的应用(做一个简单的二维码插件)
上面的例子中,在Ribbon功能区,设定了2个按钮,这 ...

感谢分享!
跟着楼主的帖子我一步步做完了这个Demo,深刻感受了VSTO与EXCELDNA的不同。
有一点小问题请教一下:我们在用VSTO做插件的时候,可以通过Tab的MSO标识将控件做到类似“开始(TabHome)选项卡”等内置选项卡中,但在DNA中,使用Xml生成Ribbon,如何实现在Excel内置选项卡中放置控件?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 19:45 , Processed in 0.041562 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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