Как я могу искать текст во всей книге? - PullRequest
1 голос
/ 13 января 2020

Мне нужно найти файл Excel для конкретного текста.

Я нашел эту статью в MS. https://docs.microsoft.com/en-us/visualstudio/vsto/how-to-programmatically-search-for-text-in-worksheet-ranges?view=vs-2019 Я изменил его для поиска по всей книге. Работает нормально, пока не останется только один лист с поисковым значением. Если какой-либо другой лист также имеет значение, то 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;
    }

1 Ответ

1 голос
/ 14 января 2020

Вы не сбрасываете переменные currentFind и firstFind. Это приводит к бесконечному значению l oop, поскольку вы используете значения currentFind и firstFind из предыдущего листа, если в рабочей книге больше 1 листа.

Самое простое решение будет объявить эти переменные во внутренней l oop:

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....
}
...