环境:xp sp3,vs2003,word2007
问题:有的电脑在执行vba里面替换的时候会报错
VARIANT_BOOL bExec = pSel->Find->Execute(
&FindText, &MatchCase, &MatchWholeWord, &MatchWildcards, &MatchSoundsLike,
&MatchAllWordForms, &Forward, &Wrap, &Format, &FindText,&vtMissing);
原因:
当您所使用的进程外客户端应用程序使用早期绑定来使 Word 97 或更高版本自动运行时,该应用程序可能会由于存在访问冲突而崩溃,或者出现以下错误消息之一:
从 Microsoft Visual Basic 中:
Run-time error '-2147023113 (800706f7)':
The method '~' of object '~' failed
Run-time error '-2147023113 (800706f7)':
Method 'Execute' of object 'Find' failed
Run-time error 430:
Class does not support automation or does not support expected interface.
从 Microsoft Visual C++ 中:
HRESULT = 0x800706F7
RPC_X_BAD_STUB_DATA - The stub received bad data.
注意:在调试版本中,将会从“声明”对话框中收到堆栈损坏警告,并且 EAX 的值与上面列出的值相同。在发行版本中,堆栈损坏将可能在此后不久使该应用程序崩溃,但 HRESULT 值可能与上面的值类似。
该问题会在某些计算机上持续发生,但在另一些计算机上却可能永远不会发生。安装新的应用程序或 Microsoft Excel Service Pack 可能导致先前正常工作的计算机遇到该问题。
要解决此问题,请执行下列操作之一:
修改您的代码,在上面列出的任何 Word 接口上调用方法或属性时都使用晚期绑定。
- 或 -
在发生该问题的系统上重新注册 Word 类型库。
建议您使用晚期绑定解决方案。因为两种类型库均描述了实现 IDispatch 接口的接口,所以对任何 IDispatch 方法的调用都将有效,而与最后在系统上注册哪个类型库无关。这是确保您的代码不会在您未管理的系统上遇到此错误的唯一方法。
解决:
方法1:
// 执行含有N个参数的方法 BOOL CDjcxView::InvokeN(IDispatch *pDisp, LPCOLESTR lpszName, VARIANT *varParams, int nParams) { DISPID dispid; VARIANT varRet = {0}; HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpszName, 1, LOCALE_USER_DEFAULT, &dispid); if (SUCCEEDED(hr)) { DISPPARAMS dispparams = { varParams, NULL, nParams, 0}; hr = pDisp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &varRet, NULL, NULL); } if (SUCCEEDED(hr) && varRet.boolVal==VARIANT_TRUE) return 1; else return 0; } BOOL CDjcxView::FindExecute(CString& sFindtext, CString& sReplaceText, int nWrap, int nReplace) { IDispatchPtr pDisp = m_lpWord->GetApplication()->GetSelection()->GetFind(); const int nParams = 11; CComVariant varParams[nParams]={ nReplace, //Replace sReplaceText, //ReplaceWith VARIANT_FALSE, //Format nWrap, //Wrap VARIANT_TRUE, //Forward VARIANT_FALSE, //MatchAllWordForms VARIANT_FALSE, //MatchSoundsLike VARIANT_FALSE, //MatchWildcards VARIANT_FALSE, //MatchWholeWord VARIANT_FALSE, //MatchCase sFindtext}; //Findtext BOOL ret = InvokeN(pDisp, L"Execute", varParams, nParams); return ret; } //调用处 FindExecute(sField, CString(""), Word::wdFindContinue, Word::wdReplaceAll);
参考:http://bbs.csdn.net/topics/310232353
http://support.microsoft.com/kb/292744/zh-cn?spid=3003&sid=611