• Raisa © (15.05.18 10:11) [0]
    Нужен поиск по строкам листа Excel заданного значения без учета регистра, начиная с самой первой ячейки.

    exCell:=exUsedRange.Find(What:=StrTemplate) ;

    Так ищет с  учетом регистра. Но добавить в строку поиска MatchCase:=False не получается. Выходит ошибка в зависимости от вариантов (Несовпадение типов, Неверный индекс ).

    Помогите, пожалуйста.
  • RWolf © (15.05.18 11:05) [1]
           doc.Range.Find.Execute(
             FindText:=txt,
             MatchCase:=True)

  • Raisa © (15.05.18 11:51) [2]
    Пробую написать:

    exCell := exUsedRange.Find.Execute(FindText:=StrTemplate, MatchCase:=True);



    При выполнении ошибка: Недопустимое число параметров.
  • Raisa © (15.05.18 12:02) [3]
    Это точно строка поиска для Excel, а не для Word?
  • RWolf © (15.05.18 13:38) [4]
    Да, не посмотрел, откуда копипастил.
    Попробовал код из заглавного сообщения — работает.
  • Raisa © (15.05.18 14:07) [5]
    exCell:=exUsedRange.Find(What:=StrTemplate) ;


    Это работает, но с учетом регистра. Мне надо добавить поиск по строкам Excel без учета регистра (может быть, и другие параметры поиска), но не получается. Вот в этом и вопрос.
  • ку ку (15.05.18 14:07) [6]
    если в секретные архивы ватикана не пускают,
    то параметры экселевского файнда можно посмотреть здесь

    https://msdn.microsoft.com/ru-ru/vba/excel-vba/articles/range-find-method-excel
  • RWolf © (15.05.18 14:09) [7]

    > Это работает

    соль в том, что это тоже работает:
    vRange.Find(What := 'текст', MatchCase := True)

  • Raisa © (15.05.18 14:17) [8]
    exCell := exUsedRange.Find.Execute(FindText:=StrTemplate, MatchCase:=True);



    У меня выдает ошибку: Несовпадение типов.

    В этом и был вопрос.
  • ку ку (15.05.18 14:20) [9]

    exCell := exUsedRange.Find.Execute(FindText:=StrTemplate, MatchCase:=True);

    При выполнении ошибка: Недопустимое число параметров.

    exCell := exUsedRange.Find.Execute(FindText:=StrTemplate, MatchCase:=True);

    У меня выдает ошибку: Несовпадение типов.


    один и тот же код, но ДВЕ разные ошибки.

    деза в каждом слове
  • Raisa © (15.05.18 14:29) [10]
    Исправлено, ctrl+C, ctrl+v подвело. )))

    exCell:=exUsedRange.Find(What:=StrTemplate, MatchCase:=False);



    У меня выдает ошибку: Несовпадение типов.

    exCell := exUsedRange.Find.Execute(FindText:=StrTemplate, MatchCase:=True);



    При выполнении ошибка: Недопустимое число параметров.
  • ку ку (15.05.18 21:03) [11]
    const some_string = 'В букваре сказано, что MatchCase опционален с дефолтным значением False. То есть и так уже без учета регистра';

    procedure TForm1.Button1Click(Sender: TObject);
    var Excel, WorkSheet, Something : OleVariant;
    begin
    Excel := CreateOleObject('Excel.Application');
    Excel.Visible := True;
    Excel.Workbooks.Add();
    WorkSheet := Excel.Workbooks[1].WorkSheets[1];
    WorkSheet.Range['F10'].Value := AnsiUpperCase(some_string);
    Something :=  WorkSheet.Cells.Find(What := AnsiLowerCase(some_string));
    ShowMessage('Искали это: ' + AnsiLowerCase(some_string) + #13#10'нашли вот это: ' + Something.Value + #13#10'Вот где оно найдено: ' + Something.Address);
    //Excel.Workbooks.Close;
    //Excel.Quit;
    end;
  • Raisa © (16.05.18 12:43) [12]

    > ку ку   (15.05.18 21:03) [11]


    Код рабочий. Спасибо за пример.

    Хотелось бы в строку .Find(...) добавить: MatchCase:=False  или MatchCase:=True.

    А также указать, что поиск только в значениях, а не в формулах и т.п. (или наоборот в зависимости от необходимости).

    Это можно сделать или нет?
  • ку ку (17.05.18 11:45) [13]
    как минимум это сделать можно.
    как максимум это даже работает ровно таким образом как и описано в доке.

    ошибка была в том, что объектной модели куча чего имеет метод файнд.
    и разумеется с совершенно разными параметрами.
  • Raisa © (17.05.18 13:01) [14]

    > ку ку   (17.05.18 11:45) [13]


    И как будет выглядеть работающий код для поиска с параметрами?
  • ку ку (17.05.18 13:33) [15]
    const some_string = 'В букваре сказано, что MatchCase опционален с дефолтным значением False. То есть и так уже без учета регистра';

    procedure TForm1.Button1Click(Sender: TObject);
    var Excel, WorkSheet, Something : OleVariant;
    begin
    Excel := CreateOleObject('Excel.Application');
    Excel.Visible := True;
    Excel.Workbooks.Add();
    WorkSheet := Excel.Workbooks[1].WorkSheets[1];
    WorkSheet.Range['F10'].Value := AnsiUpperCase(some_string);
    Something :=  WorkSheet.Cells.Find(What := AnsiLowerCase(some_string), MatchCase := True);
    if not VarIsClear(Something)then
     ShowMessage('Искали это: ' + AnsiLowerCase(some_string) + #13#10'нашли вот это: ' + Something.Value + #13#10'Вот где оно найдено: ' + Something.Address)
    else
     ShowMessage('С учетом регистра тоже все окей. Ничего не нашли.');

    //Excel.Workbooks.Close;
    //Excel.Quit;
    end;
  • Raisa © (17.05.18 14:48) [16]

    > ку ку   (17.05.18 13:33) [15]


    Спасибо. Но у меня выдается ошибка: Несовпадение типов.
    Ничего не изменилось, в этом и был вопрос.

    Excel 2016.
  • ку ку (17.05.18 16:45) [17]
    мадмуазель.

    у меня тоже эксель 2016
    и все работает.

    ошибка была в том, что объектной модели куча чего имеет метод файнд.
    и разумеется с совершенно разными параметрами.


    там между строк громкими буквами написано,
    что файнд вы вызываете не у того объекта у которого его надо вызывать.
  • Raisa © (17.05.18 17:35) [18]

    > ку ку   (17.05.18 16:45) [17]

    Я скопировала Ваш код. И получила ошибку: Несовпадение типов.
Есть новые Нет новых   [118232   +42][b:0][p:0.002]