c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?

时间:2022-09-02 08:46:05
RT

已经取到了Microsoft.Office.Interop.Excel.Application对象,如何调用excel中的VBA宏?

原需求是,c# winform客户端轮询进程列表,当有指定的excel文件打开时,winform能捕捉到。在excel中有四个VBA宏的按钮,winfrom要代替人为的点击来自动点击。。。
如图:
c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?

第一步是winfrom自动点击excel中黄颜色的按钮,这时候VBA宏会弹出来一个对话框。

第二步就是winfrom还需要点击对话框中蓝颜色的 in/out按钮。。。

想着第一步点击黄色按钮其实就是调用的VBA宏函数吧。。。该怎么做谁知道?????

另外在第二步点击对话框中的按钮,是不是需要通过句柄来实现?

14 个解决方案

#1


不会又要自己顶吧。。。。大侠们求救

#2


c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?

#3


c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?
我X,还没解决。。。你们公司做法真奇葩。。

#4


用winform做这个?可也可以
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序

#5


这样搞太复杂了吧!!也就是说想在C#中调用vba的函数哦!!还真没见过!!还不如像楼上哥们说的,用vba做这个系统可能更加简单和方便。

#6


引用 3 楼 wyd1520 的回复:
c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?
我X,还没解决。。。你们公司做法真奇葩。。


取值的解决了。。。点按钮没解决。。。。。呵呵

#7


引用 4 楼 dongxinxi 的回复:
用winform做这个?可也可以
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序


客户要求用.net来做,因为还要把excel中的相关值发送到上位机去处理呢。。。

#8


而且这个excel是客户那边买来的产品,其中vba函数都是加密的。。。

#9


 //=====通过执行宏来格表格加边框=======//
              try
              {
                   myExcel.Run("宏1",missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing);
              }
              catch
              {
              }

#10


也就是说目标函数的名字你都是不知道的?
用winform需要用到API FindowWindow("#32770", 对话框标题)去筛选出对话框,然后FindWindowEx找到按钮的句柄,最后PostMessage

不过你可以先试一下用Excel的宏录制功能,把你对宏操作录制下来,生成一个宏,然后在winform中遍历那些文档,并调用这个宏,似乎更简单
http://jingyan.baidu.com/article/4853e1e51630091909f7263b.html

#11


引用 9 楼 wyd1520 的回复:
 //=====通过执行宏来格表格加边框=======//
              try
              {
                   myExcel.Run("宏1",missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing);
              }
              catch
              {
              }



如果VBA需要传参数怎么弄??

#12


引用 10 楼 dongxinxi 的回复:
也就是说目标函数的名字你都是不知道的?
用winform需要用到API FindowWindow("#32770", 对话框标题)去筛选出对话框,然后FindWindowEx找到按钮的句柄,最后PostMessage

不过你可以先试一下用Excel的宏录制功能,把你对宏操作录制下来,生成一个宏,然后在winform中遍历那些文档,并调用这个宏,似乎更简单
http://jingyan.baidu.com/article/4853e1e51630091909f7263b.html



这个 #32770 是什么意思啊

#13


引用 11 楼 xiangmei521 的回复:
Quote: 引用 9 楼 wyd1520 的回复:

 //=====通过执行宏来格表格加边框=======//
              try
              {
                   myExcel.Run("宏1",missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing);
              }
              catch
              {
              }



如果VBA需要传参数怎么弄??


小伙子,要懂的学会搜索呀,来结贴给分吧。。

http://www.cnblogs.com/yangbin1005/archive/2009/03/18/1415666.html
http://www.cnblogs.com/heekui/archive/2008/03/30/1129355.html

#14


没听说vba真能加密,发过来我给你解开算了

除非是函数运算需要大量的基础数据放在excel上,否则完全可以用C#重写代码。或者用vba完成C#的功能。

没必要用C#给vba开个外挂。
即使要开外挂,也要做成com加载项或者xll加载项。

只有啥都不会的,才想用C#调用vba,那是下策中的下策。

如果一定要调用vba的话,可以使用application.run

#1


不会又要自己顶吧。。。。大侠们求救

#2


c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?

#3


c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?
我X,还没解决。。。你们公司做法真奇葩。。

#4


用winform做这个?可也可以
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序

#5


这样搞太复杂了吧!!也就是说想在C#中调用vba的函数哦!!还真没见过!!还不如像楼上哥们说的,用vba做这个系统可能更加简单和方便。

#6


引用 3 楼 wyd1520 的回复:
c#操作excel 已经取到Interop.Excel.Application对象后如何调用excel中的VBA宏?
我X,还没解决。。。你们公司做法真奇葩。。


取值的解决了。。。点按钮没解决。。。。。呵呵

#7


引用 4 楼 dongxinxi 的回复:
用winform做这个?可也可以
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序


客户要求用.net来做,因为还要把excel中的相关值发送到上位机去处理呢。。。

#8


而且这个excel是客户那边买来的产品,其中vba函数都是加密的。。。

#9


 //=====通过执行宏来格表格加边框=======//
              try
              {
                   myExcel.Run("宏1",missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing);
              }
              catch
              {
              }

#10


也就是说目标函数的名字你都是不知道的?
用winform需要用到API FindowWindow("#32770", 对话框标题)去筛选出对话框,然后FindWindowEx找到按钮的句柄,最后PostMessage

不过你可以先试一下用Excel的宏录制功能,把你对宏操作录制下来,生成一个宏,然后在winform中遍历那些文档,并调用这个宏,似乎更简单
http://jingyan.baidu.com/article/4853e1e51630091909f7263b.html

#11


引用 9 楼 wyd1520 的回复:
 //=====通过执行宏来格表格加边框=======//
              try
              {
                   myExcel.Run("宏1",missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing);
              }
              catch
              {
              }



如果VBA需要传参数怎么弄??

#12


引用 10 楼 dongxinxi 的回复:
也就是说目标函数的名字你都是不知道的?
用winform需要用到API FindowWindow("#32770", 对话框标题)去筛选出对话框,然后FindWindowEx找到按钮的句柄,最后PostMessage

不过你可以先试一下用Excel的宏录制功能,把你对宏操作录制下来,生成一个宏,然后在winform中遍历那些文档,并调用这个宏,似乎更简单
http://jingyan.baidu.com/article/4853e1e51630091909f7263b.html



这个 #32770 是什么意思啊

#13


引用 11 楼 xiangmei521 的回复:
Quote: 引用 9 楼 wyd1520 的回复:

 //=====通过执行宏来格表格加边框=======//
              try
              {
                   myExcel.Run("宏1",missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing,
 
                       missing,missing,missing,missing,missing,missing,missing);
              }
              catch
              {
              }



如果VBA需要传参数怎么弄??


小伙子,要懂的学会搜索呀,来结贴给分吧。。

http://www.cnblogs.com/yangbin1005/archive/2009/03/18/1415666.html
http://www.cnblogs.com/heekui/archive/2008/03/30/1129355.html

#14


没听说vba真能加密,发过来我给你解开算了

除非是函数运算需要大量的基础数据放在excel上,否则完全可以用C#重写代码。或者用vba完成C#的功能。

没必要用C#给vba开个外挂。
即使要开外挂,也要做成com加载项或者xll加载项。

只有啥都不会的,才想用C#调用vba,那是下策中的下策。

如果一定要调用vba的话,可以使用application.run