Доброго...

Подскажите, пожалуйста, как можно ускорить работу с книгами Excel с помощью макросов? Книги открываю для поиска и получения информации из других книг в основную. Открытие произвожу при помощи метода open коллекции workbooks поиск произвожу функцией UsedRange.Find

Заранее спасибо, всем откликнувшимся.

Excel в данном случае используется для отладки. Основной код будет написан и перенесен на Delphi. Вот пример, как это работает сейчас. Одну книгу открывает и обрабатывает в среднем 9 секунд.

procedure TForm2.Button1Click(Sender: TObject);
var
  Book_Name, Sheet_Name, Find_Site, Range_Find:string;
  FindParam: integer;
  ima_name, E1_Pos, E1_Qty, minE1_Qty, A2EA, B_Node, Node_Id, OAM_MASK, RBS_L3,
  mub_a, mask_mub_a, mub_b, mask_mub_b : string;
  Sheet : Variant;
  vFind: OleVariant;
  XL_Col, XL_Row : string;

    begin
      // Создание Excel
      ExcelApp := CreateOleObject('Excel.Application');

      // Отключаем реакцию Excel на события, чтобы ускорить вывод информации
      ExcelApp.Application.EnableEvents := false;

      //  Открываем Книгу (Workbook) в режиме только для чтения
      ExcelApp.WorkBooks.Open(ExtractFilePath(ExtractFilePath(Application.ExeName)) + Book_Name, ReadOnly:=true);

      WorkBookCount := ExcelApp.WorkBooks.Count;
    end;

  Sheet := ExcelApp.WorkBooks[WorkBookCount].Sheets[Sheet_Name];
  ThisWorkbook.Sheets("Data").Cells(1, 1).Select

  Sheet.Cells[1, 1].select;

  application.ProcessMessages;
  // поиск адреса ячейки
  vFind := Sheet.Range[''+Range_Find+''].Find( What:=Find_Site,
                                        LookIn:=xlValues, // поиск в значениях
                                        LookAt:=xlPart // частичное совпадение
                                       // SearchDirection:=xlNext // направление вверх
                                      ).Address;

          XL_Col := Trim(Copy(XL_Col, 1, Pos('$', XL_Col) -1) );
          XL_Row := Trim(Copy(XL_Row, Pos('$', XL_Row) +1) );

          ima_name := Sheet.Cells.Item[XL_Row, 6].Value;
          E1_Pos :=  Sheet.Cells.Item[XL_Row, 7].Value;
          E1_Qty :=  Sheet.Cells.Item[XL_Row, 8].Value;
          minE1_Qty :=  Sheet.Cells.Item[XL_Row, 9].Value;
          A2EA := Sheet.Cells.Item[XL_Row, 13].Value;
          B_Node :=  Sheet.Cells.Item[XL_Row, 14].Value;
          Node_Id :=  Sheet.Cells.Item[XL_Row, 15].Value;
          OAM_MASK := Sheet.Cells.Item[XL_Row, 16].Value;
          RBS_L3  := Sheet.Cells.Item[StrToInt(XL_Row) + 1, 18].Value;
end;

задан 23 Апр '12 17:05

изменен 26 Апр '12 11:53

Expert's gravatar image


51625

Доброго...

сделал по этой статье http://basicsprog.ucoz.ru/blog/2011-10-02-9 время обработки одного файла сократилось с 9 секунд до 467 мс.

(24 Апр '12 13:16) Ivan_

Здравствуйте

БитКод - это совместно редактируемый форум вопросов и ответов для продвинутых пользователей компьютерной техники.

Присоединяйтесь!

отмечен:

×48
×4

задан
23 Апр '12 17:05

показан
1151 раз

обновлен
26 Апр '12 11:53

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии

Дизайн сайта/логотип © «Сеть Знаний». Контент распространяется под лицензией cc by-sa 3.0 с обязательным указанием авторства.
Рейтинг@Mail.ru