打开Excel的VBA帮助查看Excel的对象模型很容易找到完成这个功能需要的几个集合和对象ApplicationWorkbooksWorkbookWorksheets还有Worksheet和RangeApplication创建Excel应用Workbooks打开Excel文档Workbook获得Excel文档工作薄Worksheets操作工作表集合Worksheet获得单个工作表
搜索的思路对应上述集合和对象可以这样表述要搜索的文本可能存在Excel文档当中的某个工作表上搜索应该遍历目标Excel文件的每个工作表中的有效区域如果找到则退出本次搜索如果没有找到则继续搜索直到完成本次搜索
跟Word对象模型不一样的是Excel对象模型没有提供Find对象不过没有关系可以通过两种方法来实现一个是通过Range对象的Find()方法来实现另外一个比较麻烦取得工作表Worksheet的有效区域UsedRange之后遍历该Range对象中的所有行列实际开发中用第二种方法时发现了一个特别的现象所以第二种方法也准备详细记述一下
第一步打开Excel文档
object filename=;
object MissingValue=TypeMissing;
string strKeyWord=; //指定要搜索的文本如果有多个则声明string[]
ExcelApplication ep=new ExcelApplicationClass();
ExcelWorkbook ew=epWorkbooksOpen(filenameToString()MissingValue
MissingValueMissingValueMissingValue
MissingValueMissingValueMissingValue
MissingValueMissingValueMissingValue
MissingValueMissingValueMissingValue
MissingValue);
然后准备遍历Excel工作表
ExcelWorksheet ews;
int iEWSCnt=ewWorksheetsCount;
int i=j=;
ExcelRange oRange;
object oText=strKeyWordTrim()ToUpper();
for(i=;i<=iEWSCnt;i++)
{
ews=null;
ews=(ExcelWorksheet)ewWorksheets[i];
oRange=null;
(ExcelRange)oRange=((ExcelRange)ewsUsedRange)Find(oTextMissingValueMissingValue
MissingValueMissingValueExcelXlSearchDirectionxlNext
MissingValueMissingValueMissingValue);
if (oRange!=null && oRangeCellsRowsCount>= && oRangeCellsColumnsCount>=)
{
MessageBoxShow(文档中包含指定的关键字!搜索结果MessageBoxButtonsOK);
break;
}
}
这里要说两个值得注意的地方一个是遍历工作表的索引不是从开始而是从开始另外一个是Find方法的第六个参数SearchDirection指定搜索的方向帮助文档中说这个参数是可选项但是我用MissingValue如论如何编译不能通过不知什么原因于是显式指定它的默认值xlNext
第一种方法实现了再看看第二种方法这种方法除了要遍历工作表还要对工作表使用区域的行和列进行遍历其它一样只对遍历说明代码如下
bool blFlag=false;
int iRowCnt=iColCnt=iBgnRowiBgnCol;
for(m=;m<=iEWSCnt;m++)
{
ews=(ExcelWorksheet)ewWorksheets[m];
iRowCnt=+ewsUsedRangeCellsRowsCount;
iColCnt=+ewsUsedRangeCellsColumnsCount;
iBgnRow=(ewsUsedRangeCellsRow>)?
ewsUsedRangeCellsRow:ewsUsedRangeCellsRow;
iBgnCol=(ewsUsedRangeCellsColumn>)?
ewsUsedRangeCellsColumn:ewsUsedRangeCellsColumn;
for(i=iBgnRow;i<iRowCnt+iBgnRow;i++)
{
for(j=iBgnCol;j<iColCnt+iBgnCol;j++)
{
strText=((ExcelRange)ewsUsedRangeCells[ij])TextToString();
if (strTextToUpper()IndexOf(strKeyWordToUpper())>=)
{
MessageBoxShow(文档中包含指定的关键字!搜索结果MessageBoxButtonsOK);
}
}
}
}
显然这种方法比第一种繁琐得多不过这里有一个关于遍历单元格的索引很特别的地方当工作表中的使用区域UsedRange为单行单列的时候对UsedRange中的单元格遍历起始索引值为为多行多列的时候起始索引值为不知这是Excel程序设计者出于什么样的考虑?