打開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程序設計者出於什麼樣的考慮?
From:http://tw.wingwit.com/Article/program/net/201311/14834.html