已经取到了Microsoft.Office.Interop.Excel.Application对象,如何调用excel中的VBA宏?
原需求是,c# winform客户端轮询进程列表,当有指定的excel文件打开时,winform能捕捉到。在excel中有四个VBA宏的按钮,winfrom要代替人为的点击来自动点击。。。
如图:
第一步是winfrom自动点击excel中黄颜色的按钮,这时候VBA宏会弹出来一个对话框。
第二步就是winfrom还需要点击对话框中蓝颜色的 in/out按钮。。。
想着第一步点击黄色按钮其实就是调用的VBA宏函数吧。。。该怎么做谁知道?????
另外在第二步点击对话框中的按钮,是不是需要通过句柄来实现?
14 个解决方案
#1
不会又要自己顶吧。。。。大侠们求救
#2
#3
我X,还没解决。。。你们公司做法真奇葩。。
#4
用winform做这个?可也可以
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序
#5
这样搞太复杂了吧!!也就是说想在C#中调用vba的函数哦!!还真没见过!!还不如像楼上哥们说的,用vba做这个系统可能更加简单和方便。
#6
取值的解决了。。。点按钮没解决。。。。。呵呵
#7
客户要求用.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
{
}
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
用winform需要用到API FindowWindow("#32770", 对话框标题)去筛选出对话框,然后FindWindowEx找到按钮的句柄,最后PostMessage
不过你可以先试一下用Excel的宏录制功能,把你对宏操作录制下来,生成一个宏,然后在winform中遍历那些文档,并调用这个宏,似乎更简单
http://jingyan.baidu.com/article/4853e1e51630091909f7263b.html
#11
如果VBA需要传参数怎么弄??
#12
这个 #32770 是什么意思啊
#13
小伙子,要懂的学会搜索呀,来结贴给分吧。。
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
除非是函数运算需要大量的基础数据放在excel上,否则完全可以用C#重写代码。或者用vba完成C#的功能。
没必要用C#给vba开个外挂。
即使要开外挂,也要做成com加载项或者xll加载项。
只有啥都不会的,才想用C#调用vba,那是下策中的下策。
如果一定要调用vba的话,可以使用application.run
#1
不会又要自己顶吧。。。。大侠们求救
#2
#3
我X,还没解决。。。你们公司做法真奇葩。。
#4
用winform做这个?可也可以
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序
但是为何你不查查VBA资料,自己写个VBA遍历自有文档,运行宏不是更方便吗?宏通常就是一个小型的VBA程序
#5
这样搞太复杂了吧!!也就是说想在C#中调用vba的函数哦!!还真没见过!!还不如像楼上哥们说的,用vba做这个系统可能更加简单和方便。
#6
我X,还没解决。。。你们公司做法真奇葩。。
取值的解决了。。。点按钮没解决。。。。。呵呵
#7
用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
{
}
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
用winform需要用到API FindowWindow("#32770", 对话框标题)去筛选出对话框,然后FindWindowEx找到按钮的句柄,最后PostMessage
不过你可以先试一下用Excel的宏录制功能,把你对宏操作录制下来,生成一个宏,然后在winform中遍历那些文档,并调用这个宏,似乎更简单
http://jingyan.baidu.com/article/4853e1e51630091909f7263b.html
#11
//=====通过执行宏来格表格加边框=======//
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
也就是说目标函数的名字你都是不知道的?
用winform需要用到API FindowWindow("#32770", 对话框标题)去筛选出对话框,然后FindWindowEx找到按钮的句柄,最后PostMessage
不过你可以先试一下用Excel的宏录制功能,把你对宏操作录制下来,生成一个宏,然后在winform中遍历那些文档,并调用这个宏,似乎更简单
http://jingyan.baidu.com/article/4853e1e51630091909f7263b.html
这个 #32770 是什么意思啊
#13
//=====通过执行宏来格表格加边框=======//
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
除非是函数运算需要大量的基础数据放在excel上,否则完全可以用C#重写代码。或者用vba完成C#的功能。
没必要用C#给vba开个外挂。
即使要开外挂,也要做成com加载项或者xll加载项。
只有啥都不会的,才想用C#调用vba,那是下策中的下策。
如果一定要调用vba的话,可以使用application.run