利用VS2010调用Excel的宏
Excel中的macro已经录制好,如何通过VS完成automation呢?这是昨天师姐给我的一个小问题。之前对于这方面没有任何经验,昨晚在网上好好研究了一番,终于发现了解决问题的方法,无奈自己的VBA编程和Windows编程现在都处于小白水平,现在虽然能够解决问题了,有些细节还是不能理解掌握。菜不要紧,开始工作了是王道。
如何在VS2010中调用Excel的宏呢?
方法的原理是使用Microsoft Office Interop Excel 对象模型中的Open()打开Excel文件,使用Run()方法来运行Excel宏。步骤如下:
1. 启动VS2010,新建工程Windows Forms Application.
2. 在form中添加button,按照自己的需要编辑。这里我添加了一个button,用来单击执行对应Excel中的宏。
3. 在Project选项下选择references添加引用,需要添加这些封装的类,才能够使用对象模型中的功能函数。
4. 为Button控件建立Click鼠标单击事件,添加如下的代码:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Excel::ApplicationClass^ MyExcel; String^ MyDoc; System::Object^ MyObj; Excel::_Workbook^ MyBook; Excel::Workbooks^ MyBooks; try { MyExcel=gcnew Excel::ApplicationClass(); //allocating space //gcnew command returns a handle that creats MyWord on the garbage collected heap. It represents the whole word app. MyExcel->Visible=true; //For any object, some methods and properties may be unavailable if the Visible property is False MyDoc=Application::StartupPath+"\\excel_test.xlsm"; MyObj=System::Reflection::Missing::Value; MyBooks=MyExcel->Workbooks; MyBook=MyBooks->Open(MyDoc,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj); MyExcel->Run("MyMacro",MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj,MyObj); MyBook->Close(MyObj,MyObj,MyObj); System::Runtime::InteropServices::Marshal::ReleaseComObject(MyBook); System::Runtime::InteropServices::Marshal::ReleaseComObject(MyBooks); MyExcel->Quit(); System::Runtime::InteropServices::Marshal::ReleaseComObject(MyExcel); GC::Collect(); //reclaim all the memory that is inacessible this->Close(); // close the dialog box } catch(Exception^ MyEx) { MessageBox::Show(MyEx->Message,"信息提示", MessageBoxButtons::OK, MessageBoxIcon::Information); } }
最后编译执行程序即可。程序执行的结果如图所示。
出现对话框,提示运行宏。
宏的运行结果,这里编写的简单宏返回Excel应用名。
整个运行过程并不是十分复杂,需要注意的几点是:
-
引用的对象模型是封装好了的,而且其类成员,成员函数不是很好查,上MSDN搜索的结果是很多method和property甚至连基本的description都没有,想要进一步了解的话应该借些书,或者搜索一些外文资料。
-
Microsof Excel的宏里面大有学问,有时间得好好看看。后来编写的时候试了一下运行另外一个宏。这个宏完成的功能是提取不同sheet中的数据进行联合操作,这就需要一些VBA命令的帮助了,对这个还不太熟练的我忙和了半天。