利用VS2010调用Excel的宏

Excel中的macro已经录制好,如何通过VS完成automation呢?这是昨天师姐给我的一个小问题。之前对于这方面没有任何经验,昨晚在网上好好研究了一番,终于发现了解决问题的方法,无奈自己的VBA编程和Windows编程现在都处于小白水平,现在虽然能够解决问题了,有些细节还是不能理解掌握。菜不要紧,开始工作了是王道。

如何在VS2010中调用Excel的宏呢?
方法的原理是使用Microsoft Office Interop Excel 对象模型中的Open()打开Excel文件,使用Run()方法来运行Excel宏。步骤如下:

1. 启动VS2010,新建工程Windows Forms Application.

clip_image002

2. 在form中添加button,按照自己的需要编辑。这里我添加了一个button,用来单击执行对应Excel中的宏。

clip_image004

3. 在Project选项下选择references添加引用,需要添加这些封装的类,才能够使用对象模型中的功能函数。

clip_image005

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);
                 }
             }

最后编译执行程序即可。程序执行的结果如图所示。

出现对话框,提示运行宏。

image

宏的运行结果,这里编写的简单宏返回Excel应用名。

image

整个运行过程并不是十分复杂,需要注意的几点是:

  1. 引用的对象模型是封装好了的,而且其类成员,成员函数不是很好查,上MSDN搜索的结果是很多method和property甚至连基本的description都没有,想要进一步了解的话应该借些书,或者搜索一些外文资料。
  2. Microsof Excel的宏里面大有学问,有时间得好好看看。后来编写的时候试了一下运行另外一个宏。这个宏完成的功能是提取不同sheet中的数据进行联合操作,这就需要一些VBA命令的帮助了,对这个还不太熟练的我忙和了半天。
原文地址:https://www.cnblogs.com/bovine/p/2230804.html