在VC中如何处理嵌入的excel事件?如用户修改某单元的值

venkin 2009-12-14 04:21:33
根据微软的技术文章Article ID: 309301 - HOW TO: Handle Events for Excel by Using Visual C++ .NET,在VC工程中自动生成了用于接收处理excel事件的代码。
自动生成的处理函数HandleSheetChange( IDispatch* xlSheet,IDispatch* xlRange)太简单,只有向debug窗口输出打印的功能。
我在里面增加一些处理代码,用于实现用户修改某个单元格时能做一些自动处理,但调试运行时老提示内存访问异常。请高手指教,谢谢了:

/******************************************************************************
* Invoke -- Takes a dispid and uses it to call another of this class's
* methods. Returns S_OK if the call was successful.
******************************************************************************/
STDMETHODIMP CAppEventListener::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo,
UINT* puArgErr)
{
switch(dispIdMember){
case 0x00622:
if(pDispParams->cArgs !=2)
return E_INVALIDARG;
else
{
if(pDispParams->rgvarg[1].vt & VT_BYREF)
{
HandleBeforeWorkbookClose( // Call the function.
*(pDispParams->rgvarg[1].ppdispVal),
pDispParams->rgvarg[0].pboolVal);
}
else
{
HandleBeforeWorkbookClose( // Call the function.
(pDispParams->rgvarg[1].pdispVal),
pDispParams->rgvarg[0].pboolVal);
}
}

case 0x0061c:
{
if(pDispParams->rgvarg[1].vt & VT_BYREF) //这个分支在什么时候用到?
{
HandleSheetChange( // Call the function.
*(pDispParams->rgvarg[1].ppdispVal),
*(pDispParams->rgvarg[0].ppdispVal));
}
else
{
HandleSheetChange( // Call the function.
pDispParams->rgvarg[1].pdispVal, //为什么上面用指针指向的内容,这里用的却是指针做参数?
pDispParams->rgvarg[0].pdispVal);
}
}
break;
}
return S_OK;
}

……
/******************************************************************************
* HandleSheetChange -- This method processes the SheetChange event for the
* application attached to this event handler.
******************************************************************************/
STDMETHODIMP CAppEventListener::HandleSheetChange( IDispatch* xlSheet,IDispatch* xlRange)
{
OutputDebugString("HandleSheetChange\n");

COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

CApplication V_app;
CWorkbook V_book;
CWorksheet V_sheet;
CRange0 V_range;
long V_Row = 0;
long V_Column = 0;

V_sheet.AttachDispatch(xlSheet);
V_app=V_sheet.get_Application();
V_range.AttachDispatch(V_app.get_ActiveCell());
V_book=V_app.get_ActiveWorkbook();

V_Column=V_range1.get_Column();
V_Row=V_range1.get_Row();

V_range.put_Value2(COleVariant("测试成功!"));


HRESULT hr = S_OK;
return hr;
}

请教:
1)红色部分为我加的代码,虽然能运行,但总是出问题,执行到V_range.put_Value2(COleVariant("测试成功!"));这句代码时总是提示内存访问异常!
2)HandleSheetChange( IDispatch* xlSheet, IDispatch* xlRange)为什么要带两个参数?应该怎么样分别使用?
其实我希望能获取的是用户刚刚修改过的单元格的位置,但用 get_ActiveCell()却未必准确,因为用户改完后可能按回车,这样get_ActiveCell()获取的是下一个单元格了
...全文
147 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

5,139

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧