如何在整个工作簿中搜索文本?
How can I search for text in whole workbook?
我需要在 Excel 文件中搜索特定文本。
我在 MS 找到了这篇文章。
https://docs.microsoft.com/en-us/visualstudio/vsto/how-to-programmatically-search-for-text-in-worksheet-ranges?view=vs-2019
我修改了它以搜索整个工作簿。
它工作正常,直到只有一个 sheet 具有搜索值。如果任何其他 sheet 也有该值,则 Excel 冻结为沙漏指针。最终我需要终止进程。
这是我的代码:
public int searchcount(string srchtrm)
{
Excel.Range currentFind = null;
Excel.Range firstFind = null;
int stcount = 0;
foreach (Excel.Worksheet w in Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets)
{
w.Select();
Excel.Range Fruits = w.UsedRange;
currentFind = Fruits.Find(srchtrm, Type.Missing,
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false,
Type.Missing, Type.Missing);
while (currentFind != null)
{
if (firstFind == null)
{
firstFind = currentFind;
}
else if (currentFind.get_Address(Excel.XlReferenceStyle.xlA1)
== firstFind.get_Address(Excel.XlReferenceStyle.xlA1))
{
break;
}
currentFind.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);
currentFind.Font.Bold = true;
currentFind = Fruits.FindNext(currentFind);
stcount = stcount + 1;
}
}
return stcount;
}
您没有重置 currentFind
和 firstFind
变量。这会导致无限循环,因为一旦工作簿中的 sheet 超过 1 个 sheet,您就会使用之前 sheet 中的 currentFind
和 firstFind
值。
最简单的解决方案是在内循环中声明这些变量:
int stcount = 0;
foreach (Excel.Worksheet w in Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets)
{
Excel.Range currentFind = null;
Excel.Range firstFind = null;
w.Select();
Excel.Range Fruits = w.UsedRange;
// REST of the code....
}
我需要在 Excel 文件中搜索特定文本。
我在 MS 找到了这篇文章。 https://docs.microsoft.com/en-us/visualstudio/vsto/how-to-programmatically-search-for-text-in-worksheet-ranges?view=vs-2019 我修改了它以搜索整个工作簿。 它工作正常,直到只有一个 sheet 具有搜索值。如果任何其他 sheet 也有该值,则 Excel 冻结为沙漏指针。最终我需要终止进程。
这是我的代码:
public int searchcount(string srchtrm)
{
Excel.Range currentFind = null;
Excel.Range firstFind = null;
int stcount = 0;
foreach (Excel.Worksheet w in Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets)
{
w.Select();
Excel.Range Fruits = w.UsedRange;
currentFind = Fruits.Find(srchtrm, Type.Missing,
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false,
Type.Missing, Type.Missing);
while (currentFind != null)
{
if (firstFind == null)
{
firstFind = currentFind;
}
else if (currentFind.get_Address(Excel.XlReferenceStyle.xlA1)
== firstFind.get_Address(Excel.XlReferenceStyle.xlA1))
{
break;
}
currentFind.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);
currentFind.Font.Bold = true;
currentFind = Fruits.FindNext(currentFind);
stcount = stcount + 1;
}
}
return stcount;
}
您没有重置 currentFind
和 firstFind
变量。这会导致无限循环,因为一旦工作簿中的 sheet 超过 1 个 sheet,您就会使用之前 sheet 中的 currentFind
和 firstFind
值。
最简单的解决方案是在内循环中声明这些变量:
int stcount = 0;
foreach (Excel.Worksheet w in Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets)
{
Excel.Range currentFind = null;
Excel.Range firstFind = null;
w.Select();
Excel.Range Fruits = w.UsedRange;
// REST of the code....
}