Excel Automation-Range.FindNext()不起作用 [英] Excel Automation-Range.FindNext() not working

查看:137
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆