描述:
我要在VC程序里调用Excel中的VBA程序,如何实现??
能操作Excel的菜单也行!
在VC里嵌入Excel后如何控制混合的菜单?
哪位高手清楚请指教!!!!!
有实现的例子吗?或实现的方法!
解决方案1:
如何利用MFC添加VBA宏?
有时程序员需要从一些应用程序如Word调用自动化客户(如Microsoft Excel),下来我们就看看如何利用VC++来实现这一点。本文主要讨论如何使用MFC向Word中添加VBA宏。此程序同时也添加CommandBar控件按钮,此按钮用来运行此宏以实例化Excel。
如果您需要对Office的不同版本进行开发,请注意不同的类型库。下面我们针对Office97进行说明。Microsoft Office 97的类型库为:
C:\Program Files\Microsoft Office\mso97.dll.
而Microsoft Office 2000的类型库为Mso9.dll,对于XP,它的类型库则为C:\Program Files\Common Files\Microsoft Shared\Office10\MSO.dll.
除了要添加上面所说的类型库以外,还需要添加VBE编辑器类型库,此类型库为:C:\Program Files\Common Files\Microsoft Shared\VBA
现在,你会得到不许多ColeDispatchDriver包装类,这些类均是刚才导入类型库得到的。为了解决重复的问题,我们引入"namespace"机制。在Mswordx.h文件开始处加入:
namespace word { // that's an opening brace.
而在结尾处加入"};"
在Mswordx.cpp文件中,在"#endif"和LPDISPATCH _Application:GetApplication之前加入 using namespace word;
找到LPDISPATCH Shapes::GetApplication(),在此行前加入using namespace word;
在Vbeext1.h file中找到class Window : public COleDispatchDriver,在此行前加入
namespace ext {
在文件结尾补上另一半大括号。在Vbeext1.cpp中,找到LPDISPATCH Window::GetVbe(),在此行前加入using namespace ext;
下面我们就要在AutoProjectDlg.cpp加入这些头文件了:
#include "msword8.h" // or appropriate version's header
#include "vbeext1.h"
#include "mso97.h" // or appropriate version's header
将下面的代码加入到CAutoProjectDlg::OnRun()中(它位于AutoProjectDlg.cpp中):
// Sample Code
// -----------
//
// 代码完成下面的功能:
// 1. 启动Microsoft Word.
// 2. 加入"TestMacro"宏
// 3. 为上面的宏加入新按钮
// 4. 双击此按钮,启动Microsoft Excel.
// 6. 再次双击会关闭Excel.
//
#define FUNCTION_TEXT "Dim oXL as Object\n\r" \
"Dim oBook as Object\n\r" \
"Public Sub TestMacro()\n\r" \
"Set oXL = CreateObject(\"excel.application\")\n\r" \
"oXL.Visible = True\n\r" \
"Set oBook = oXL.Workbooks.Add()\n\r" \
"End Sub\n\r" \
"Public Sub CloseExcel()\n\r" \
"oBook.Saved = True\n\r" \
"Set oBook = Nothing\n\r" \
"oXL.Quit\n\r" \
"Set oXL = Nothing\n\r" \
"End Sub\n\r"
// Declarations:
word::_Application oWord;
HRESULT hr;
DISPID dispID = 0;
LPDISPATCH lpDisp = 0;
VARIANT vResult; // A Struct with a pdispVal member
long lCount = 0;
char buf[1024]; // General purpose message buffer
OLECHAR *strCBs = L"CommandBars";
word::Shapes oShapes; // using namespace
word::Shape oShape;
// Convenient values declared as ColeVariants.
COleVariant covTrue((short)TRUE), covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
// Get the Word IDispatch pointer and
// attach it to the objWord object.
if (!oWord.CreateDispatch("Word.Application"))
{
AfxMessageBox("Couldn't get Word object.");
return;
}
oWord.SetVisible(TRUE); //This shows the application.
word::Documents oDocs(oWord.GetDocuments());
word::_Document oDoc;
/*
oDoc.AttachDispatch(oDocs.Add(
covOptional, // Template.
covFalse // NewTemplate.
));
/* // End of Word 97 code
/* 下面的代码是为Word 2002设计的 */
oDoc.AttachDispatch(oDocs.Add(
covOptional, // Template.
covFalse, &n