zoukankan      html  css  js  c++  java
  • 利用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命令的帮助了,对这个还不太熟练的我忙和了半天。
  • 相关阅读:
    php---观察者模式
    elasticsearch常用查询和注意点
    linux镜像iso格式
    Mysql查询今天、昨天、7天、近30天、本月、上一月数据
    php常用算法
    算法之斐波纳契数列递归和迭代实现
    带你了解session和cookie作用原理区别和用法
    mysql大数据量的分页优化
    常用链接
    自然语言处理
  • 原文地址:https://www.cnblogs.com/bovine/p/2230804.html
Copyright © 2011-2022 走看看