Excel Automation-Range.FindNext()不起作用 [英] Excel Automation-Range.FindNext() not working
本文介绍了Excel Automation-Range.FindNext()不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
大家好,
我正在尝试使用VC ++,MFC中的以下源代码搜索MSExcel表中的字符串。
使用Range.Find()找到第一次出现的字符串但是对于下一次出现Range.FindNext()给出错误:
Hi All,
I am trying to search a string in MSExcel sheet using following source code in VC++,MFC.
First occurrence of string is found using Range.Find() but for next occurrence Range.FindNext() is giving error:
error C2664: 'FindNext' : cannot convert parameter 1 from 'class MSExcel::Range' to 'const struct tagVARIANT &'
将此引用为'FindNext' http://msdn.microsoft.com/en-us/library/office/ff196143.aspx [ ^ ]
Referring this for 'FindNext' http://msdn.microsoft.com/en-us/library/office/ff196143.aspx[^]
//////Source code////////
// Convenient values declared as ColeVariants.
COleVariant vTrue((short)TRUE),vFalse((short)FALSE);
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
MSExcel::_Application objApp;
MSExcel::_Workbook objBook;
MSExcel::Workbooks objBooks;
MSExcel::Worksheets objSheets;
MSExcel::_Worksheet objSheet;
MSExcel::Range objRange = NULL;
MSExcel::Range objFoundRng = NULL;
int nI = 0;
INT nFound = 0;
// Instantiate Excel and open an existing workbook.
objApp.CreateDispatch("Excel.Application");
objBooks = objApp.GetWorkbooks();
objBook = objBooks.Open(m_straryFileList.GetAt(nI),
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional);
objSheets = objBook.GetWorksheets();
objSheet = objSheets.GetItem(COleVariant((short)1));
//Get the range object for which you wish to retrieve the
objRange = objSheet.GetUsedRange();
//find for first match
objFoundRng = objRange.Find(COleVariant(strSearchStr), VOptional,
VOptional, xlWhole, VOptional,
xlNext, xlIgnoreCase, VOptional, VOptional);
if(objFoundRng != NULL){
nFound++;
//store address where first found
CString strAddrs = _T("");
CString strFirstFound = objFoundRng.GetAddress(vTrue, vTrue,
(long)1, VOptional, VOptional);
// FindNext until the first found cell is found again
while (strFirstFound != strAddrs){
objFoundRng = objFoundRng.FindNext(objFoundRng);
if(objFoundRng != NULL){
nFound++;
strAddrs = objFoundRng.GetAddress(vTrue, vTrue, (long)1,
VOptional, VOptional);
}
}
}
//Close the workbook without saving changes
//and quit Microsoft Excel.
objBook.Close(COleVariant((short)FALSE), VOptional, VOptional);
objApp.Quit();
我做错了什么?
还有其他方法吗?
Am doing anything wrong?
Any other way to do the same?
推荐答案
使用ADO.NET而不是使用Find和/或FindNext函数来搜索MS Excel ;)这很多。最快...
使用数据访问C ++中的ADO.NET [ ^ ]
更多
Visual工作室样本 [ ^ ]
C ++应用程序自动化Excel(CppAutomateExcel) [ ^ ]
Rather than seraching MS Excel using Find and/or FindNext function, use ADO.NET ;) It's much. much quickest...
Data Access Using ADO.NET in C++ [^]
More
Visual Studio samples[^]
C++ app automates Excel (CppAutomateExcel)[^]
只需删除
FindNext()
,
而是使用
,
Instead used
Find()
两次:)
twice :)
//find for word in a range
objFoundRng = objRange.Find(COleVariant(strSearchStr), VOptional,
xlValues, xlPart, xlByRows,
xlNext, vFalse, VOptional, VOptional);
//find for next occurence
if(objFoundRng != NULL){
CString strFirstFound = objFoundRng.GetAddress(vTrue, vTrue,
(long)1, VOptional, VOptional);
CString strNextFound = _T("");
while(strFirstFound != strNextFound){
objFoundRng = objFoundRng.Find(COleVariant(strSearchStr), VOptional,
xlValues, xlPart, xlByRows,
xlNext, vFalse, VOptional, VOptional);
strNextFound = objFoundRng.GetAddress(vTrue, vTrue,
(long)1, VOptional, VOptional);
}
}
这篇关于Excel Automation-Range.FindNext()不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文