- 帖子
- 1726
- 积分
- 4476
- 技术
- 95
- 捐助
- 0
- 注册时间
- 2008-12-21
|
5楼
发表于 2011-8-26 19:40
| 只看该作者
本帖最后由 cjiabing 于 2011-8-26 19:59 编辑
本文讨论了如何使 Word 自动运行并运行一个宏,需要个参数中使用的 Microsoft 基础类 (MFC) 库安装与 Microsoft Visual c + + 4.2 版。
回到顶端
更多信息您可以将本文中的代码复制到消息处理函数,MFC.cpp 文件中定义的事件。但是,代码的目的是为了说明使用 IDispatch 接口和 Msword 类型库中定义...您可以将本文中的代码复制到消息处理函数,MFC.cpp 文件中定义的事件。但是,代码的目的是为了说明使用 IDispatch 接口和 Msword 类型库中定义的成员函数的过程。主要优点来自于阅读和理解代码,以便您可以修改该的示例或自动发送到 Microsoft Word VBA 宏的参数从头开始编写代码。
本示例显示了两种方法可以将参数传递给 Word VBA 宏:
第一种方法调用"ThisDocument"对象的类模块中定义的宏。该宏的定义指定的参数。
第二种方法使用 Word 变量的对象。宏定义未指定任何参数 ; 但是,宏代码访问存储在文档变量的值。使用 Run 方法调用该宏。
注: 此方法不适用于受保护的文档。
回到顶端
分步示例
在 Microsoft Word 中创建一个新的文档,然后按 ALT + F11 可显示 Visual Basic 编辑器。
在 Word Visual Basic 宏编辑器"项目"框 (通常位于左上角的 Visual Basic 窗口),双击树节点的"ThisDocument"以显示其模块窗口。添加以下代码:
Public Sub testmacro(x As String)
MsgBox "First Method" & vbcr & x
End Sub
在插入菜单上单击插入新的模块并将下面的代码添加到模块的模块:
Sub GetSetVarVals()
For Each myVar In ActiveDocument.Variables
If myVar.Name = "VarVal" Then
ActiveDocument.Variables("VarVal").Delete
End If
Next myVar
ActiveDocument.Variables.Add Name:="VarVal", _
Value:=ActiveDocument.Variables("FullName").Value
' Retrieve the contents of the document variable.
MsgBox "Second method" & _
vbcr & ActiveDocument.Variables("VarVal").Value
End Sub
Sub DelVariables() 'Delete the variable "FullName".
For Each myVar In ActiveDocument.Variables
If myVar.Name = "FullName" Then
ActiveDocument.Variables("FullName").Delete
End If
Next myVar
End Sub
将文档另存为 C:\Test.doc。关闭文档并退出 Word。
请按照步骤 1 至 12 中,以下 Microsoft 知识库文章创建示例项目使用 IDispatch 接口和 MSWord 类型库中定义的成员函数的步骤操作:
178749 (http://support.microsoft.com/kb/178749/EN-US/ ) 如何创建自动化项目使用 MFC 和类型库
要创建在步骤 4 和步骤 5 中的父项目 178749 (http://support.microsoft.com/kb/178749/EN-US/ ) 的对话框中,添加"编辑框"控件从控件工具栏 (如果这是不可见的请用鼠标右键单击灰色区域 Visual Studio 的命令栏。从上下文弹出菜单选择"控件)。
此控件将显示该 ID 的 IDC_EDIT1 编辑属性对话框的常规选项卡页中。
在视图菜单上单击类向导 (或按 CTRL + W)。在 MFC 类向导对话框成员变量选项卡上选择 IDC_EDIT1,然后单击添加变量。为成员变量名中,键入 m_Argument (不带引号),然后单击确定。单击确定关闭类向导对话框。
AutoProjectDlg.cpp 文件顶部添加以下行:
#include "msword8.h" //For Word 2000, include msword9.h. For Word 2002, include msword.h
将下面的代码添加到 CAutoProjectDlg::OnRun() AutoProjectDlg.cpp 文件中:
UpdateData(TRUE); // Transfers data from edit box
// on opening dialog box
// to the member variable m_Argument.
// Convenient constants.
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,
VT_ERROR);
// Objects.
_Application objWord;
Range objRange;
objWord.CreateDispatch("Word.Application");
objWord.SetVisible(TRUE);
Documents oDocs(objWord.GetDocuments()); // Use the Constructor
// for Documents.
_Document oDoc;
oDoc.AttachDispatch(oDocs.Open(COleVariant("C:\\Test.doc",VT_BSTR),
covFalse, //Confirm Conversions.
covFalse, // Not read only.
covTrue, // Add to recent documents.
covOptional, // PassWordDocument.
covOptional, // PassWordTemplate.
covFalse, // Revert.
covOptional, // WritePasswordDocument.
covOptional, // WritePasswordTemplate.
covOptional, // Format, e.g., WordOpenFormat.
covOptional, // New with Word 9 - Encoding
covOptional, // Visible - Ditto
covOptional, // New with Word 10 - OpenConflictDocument
covOptional, // Ditto - OpenAndRepair
(long) 0, // Ditto - DocumentDirection - Left to Right
covOptional // Ditto - NoEncodingDialog
)
);
// Here is code for the method that passes an argument to a Word
// VBA macro defined in the ThisDocument class. The macro specifies
// a string parameter. Such a macro won't appear in the document's
// macro list.
// The macro is not declared in the Word typelib, so the code
// retrieves the dispid at run time from the IDispatch interface
// for the Document object. It uses that dispid in the call to
// InvokeHelper.
OLECHAR FAR* szMember = OLESTR("testmacro");
DISPID dispid;
if(FAILED(oDoc.m_lpDispatch->GetIDsOfNames ( IID_NULL,
&szMember, //Function name.
1, //Number of functions.
LOCALE_SYSTEM_DEFAULT,
&dispid)))
{
AfxMessageBox("Unable to get dispID for testmacro");
}
COleVariant result;
UCHAR *parmStr = (BYTE *)( VTS_VARIANT );
COleVariant x;
x = COleVariant(m_Argument);
oDoc.InvokeHelper( dispid,
DISPATCH_METHOD | DISPATCH_PROPERTYGET,
VT_VARIANT,
(void *)&result,
parmStr,
&x);
// Here is code that passes an argument using Word variables.
// This method won't work on a protected document, because that
// won't let the user--in this case your MFC client--set
// variable values.
AfxMessageBox("Next, pass an argument using a Variable");
Variables oVariables = oDoc.GetVariables(); // Create Variables
// collection for current doc.
objWord.Run("DelVariables"); // Word Macro to purge the variable
// "FullName".
covOptional, covOptional, // Word 9 & Word 10 take
covOptional, covOptional, // up to 30 arguments
covOptional, covOptional, // in addition to Macro's name
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional);
VARIANT *v = new VARIANT; // Creating pointer to a VARIANT.
v->vt = VT_BSTR; // Variant type = VT_BSTR
v->bstrVal = m_Argument.AllocSysString(); //The string from Edit Box.
oVariables.Add("FullName", v); // "FullName" is the Word Variables
// item.
objWord.Run("GetSetVarVals"); // Word Macro to show the contents of
// "FullName".
covOptional, covOptional, // Word 9 & Word 10 take
covOptional, covOptional, // up to 30 arguments
covOptional, covOptional, // in addition to Macro's name
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional,
covOptional, covOptional,covOptional, covOptional);
delete v; // Release the memory block for the Variant.
objWord.Quit(covFalse, covOptional, covFalse);
// The parameters mean Save Changes, Original Format, RouteDocument.
您可能需要修改 CAutoProjectDlg::OnRun() 以指示文档 Test.doc 的文档正确的路径中的代码。在下面的行中引用该文档:
oDoc.AttachDispatch(oDocs.Open(
COleVariant("C:\\Test.doc",VT_BSTR)...
编译 VC + + 项目,然后运行它。
将出现该对话框。输入诸如"乔治华盛顿"(不带引号) 在编辑框中的字符串。
单击对话框中的运行。然后 Word 将显示"GetSetVarVals()"将显示为宏的消息框。在 MFC 编辑框中输入该参数已传递给 Word VBA 宏。
回到顶端
参考有关使用 MFC 的 Microsoft Word 自动化的详细信息请参阅 Microsoft 知识库中下面的文章:
178784 (http://suppo...有关使用 MFC 的 Microsoft Word 自动化的详细信息请参阅 Microsoft 知识库中下面的文章:
178784 (http://support.microsoft.com/kb/178784/EN-US/ ) 如何使用自动化打开并打印 Word 文档
180312 (http://support.microsoft.com/kb/180312/EN-US/ ) 如何使用自动化的 MFC 项目中设置打印机
有关自动化的 Office 应用程序的其他信息,请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
222101 (http://support.microsoft.com/kb/222101/EN-US/ ) 如何查找和使用 Office 对象模型文档
本文来自:如何使用自动化运行了参数的 Word 宏http://support.microsoft.com/kb/q183369/ |
|