powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Cells.Find...
25 сообщений из 53, страница 1 из 3
Excel. Cells.Find...
    #37781417
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подключаюсь к Excel через 1с. В книге Excel содержится примерно 100 000 ячеек, которые содержат текст "_name_". Мне необходимо найти эти ячейки и для каждой установить определенное значение.

Сейчас я делаю это следующим образом, поиск в цикле:
Ячейка = Страница.Cells.Find("_name_");

В итоге получается нереально долго и чем дальше мы обходим цикл тем поиск замедляется, по замеру производительности этот небольшой кусок кода составляет 97% всего времени.
Подскажите как решить проблему и увеличить скорость поиска? Есть ли у кого-нибудь примеры на "ADO"?
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781527
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как воспользоваться методом Find в RecordSet?

RecordSet = Новый COMОбъект("ADODB.RecordSet");
НайденнаяЯчейка = RecordSet.Find("3364YD-YE");

!!! Ошибка при вызове метода Find, что я делаю не так?
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781633
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RecordSet.Find просто перемещает указатель рекордсета на нужную строку.

На самом деле надо просто попробовать сделать UPDATE для всего файла, открыв его через ADO. Но тут неясно, что такое "установить определенное значение"
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781680
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProRecordSet.Find просто перемещает указатель рекордсета на нужную строку.

На самом деле надо просто попробовать сделать UPDATE для всего файла, открыв его через ADO. Но тут неясно, что такое "установить определенное значение"

У меня есть книга excel ячейки которых заполнены текстом типа "_name_a1", "_name_a2",... "_name_an". Сейчас я ищу текст "_name_" и для найденной ячейки устанавливаю имя "a1", "a2",... "an", а текст очищаю.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781704
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда, если это возможно по структуре файла, надо выполнить запрос типа
Код: sql
1.
UPDATE Лист1$ SET MyField=Mid(MyField, 7) WHERE Left(MyField, 6)="_name_"


это будет самый быстрый способ
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781708
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, стоп, плохо прочитал.
То есть именно ИМЯ для ячейки устанавливается?
тогда тут через ADO не сделаешь
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781711
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZixxxВ итоге получается нереально долго и чем дальше мы обходим цикл тем поиск замедляется, по замеру производительности этот небольшой кусок кода составляет 97% всего времени.тут может проблема в том, что поиск КАЖДЫЙ раз идет по всему файлу? Может вообще отказаться от поиска, а тупо пройтись циклом по ячейкам?
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781734
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, пример файла (строк на 100) никому не повредит
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781762
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В файлике небольшая выборка, которая еще не обработана. Ячейки, например которые содержат текст "_name_" им будет задано имя которое идет после "_name_", а сам текст будет очищен.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781768
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, ячейка содержащая текст:
_name__C_N_4b35a34e.6838.4fe1.92e9.55453a70e97b_C_3d273d36.3331.4dd5.af15.f781f131edd3_V_4e115265.2211.42de.bc59.7d7deec26cde_T_d0d43c5c.554d.11e1.b4a5.1c6f65d75e95

после обработки будет иметь имя:
_C_N_4b35a34e.6838.4fe1.92e9.55453a70e97b_C_3d273d36.3331.4dd5.af15.f781f131edd3_V_4e115265.2211.42de.bc59.7d7deec26cde_T_d0d43c5c.554d.11e1.b4a5.1c6f65d75e95

...а текст у ячейки будет очищен
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781772
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZixxxВ файлике небольшая выборка, которая еще не обработаная думаю,ч то если выкинуть поиск из цикла и сделать просто перебор ячеек, будет быстрее. Макроса в файле не нашел
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781809
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProZixxxВ файлике небольшая выборка, которая еще не обработаная думаю,ч то если выкинуть поиск из цикла и сделать просто перебор ячеек, будет быстрее. Макроса в файле не нашел
Макроса нет в файлике, у меня порядок следующий:

1. 1с формирует табличный документ, заполняет его необходимыми данными
2. Сохраняет табличный документ как книгу xls (1c не умеет сохранять имена ячеек поэтому есть 3 пункт)
3. Открывает его и начинает преобразовывать xls.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781816
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть макрос написан на стороне 1С? Как он его обрабатывает? Через COM?
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781828
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы попробовал что-то такое
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim i As Long, k As String
For i = 6 To 15
  k = Cells(i, 10)
  If Left$(k, 6) = "_name_" Then
    Cells(i, 10).Name = Mid$(k, 7)
    Cells(i, 10).Clear
  End If
Next
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781830
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТо есть макрос написан на стороне 1С? Как он его обрабатывает? Через COM?


Файл = ПолучитьИмяВременногоФайла(".xls");
ТабличныйДокумент.Записать(Файл, ТипФайлаТабличногоДокумента.XLS);

Попытка;
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось инициализировать Excel, ошибка: " + ОписаниеОшибки() + "");
Возврат;
КонецПопытки;

РабочаяКнига = Эксель.Workbooks.Open(Файл);
Страница = РабочаяКнига.Worksheets(1);

Порядок = 0;
Пока Истина Цикл
Порядок = Порядок + 1;
Состояние("Преобразование имен: " + Порядок + "");

Ячейка = Страница.Cells.Find("_name_");

Если Ячейка = Неопределено Тогда
Прервать;
КонецЕсли;

Ячейка.Name = СтрЗаменить(Ячейка.Value, "_name_", "");
Ячейка.Value = "";

КонецЦикла;
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781835
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я и думал - поиск каждый раз идет по всему листу.
Либо надо указать дополнительные параметры поиска, чтобы искал от определенной позиции.
Либо попробуйте мой код.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781842
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProКак я и думал - поиск каждый раз идет по всему листу.
Либо надо указать дополнительные параметры поиска, чтобы искал от определенной позиции.
Либо попробуйте мой код.

Попробовать обойти все ячейки?
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781846
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZixxxShocker.ProКак я и думал - поиск каждый раз идет по всему листу.
Либо надо указать дополнительные параметры поиска, чтобы искал от определенной позиции.
Либо попробуйте мой код.

Попробовать обойти все ячейки?

Зачем все? Только те, где предположительно есть нужные данные.
Иначе потратится много лишнего времени
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781903
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, в массиве гораздо быстрее будет. Ведь, изначально, всё дело в скорости
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37781927
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выделение памяти под массив в сто тыщ строк тоже немало времени и ресурсов займет.

В принципе, действительно, если есть возможность, надо вообще не перебирать ячейки, а прямо на стороне 1С работать с коллекцией Names, ведь данные выгружаются из 1С, следовательно там уже есть все данные.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37782828
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProВыделение памяти под массив в сто тыщ строк тоже немало времени и ресурсов займет.

В принципе, действительно, если есть возможность, надо вообще не перебирать ячейки, а прямо на стороне 1С работать с коллекцией Names, ведь данные выгружаются из 1С, следовательно там уже есть все данные.

Согласен, но на выходе из 1с у меня есть *.mxl в нем есть ячейка имя у которой "FFF", максимум что я могу сделать это открыть этот *.mxl в excel, но имя у ячейки будет R2C2. Если же открыть этот файл в 1с то имя для ячейки установлено "FFF". Т.е. оно храниться в файла *.mxl но в excele не интерпретируется.

Файлик для примера во вложении.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37782857
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zixxxно на выходе из 1сно это на выходе, а ведь эти данные берутся из 1С, почему бы не брать их непосредственно?
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783056
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProZixxxно на выходе из 1сно это на выходе, а ведь эти данные берутся из 1С, почему бы не брать их непосредственно?
Я их и беру непосредственно из 1с и они у меня есть в бланке заказа который сформирован в 1с, далее мне его нужно сохранить. Сохранить я его могу, например в mxl тогда имена останутся, а если я сохраню бланк в xls то имена не сохраняются. Поэтому, еще в момент формирования бланка в 1с, я ячейкам задаю определенный текст, который в дальнейшем мне и нужно перенести в имена ячеек.
Если бы 1с могла сохранить сформированный бланк в xls с сохранением имен ячеек, или хотя бы excel умел правильно читать mxl, я был бы просто счастлив.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783066
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zixxx,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Файл = ПолучитьИмяВременногоФайла(".xls");
ТабличныйДокумент.Записать(Файл, ТипФайлаТабличногоДокумента.XLS);

Попытка;
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось инициализировать Excel, ошибка: " + ОписаниеОшибки() + "");
Возврат;
КонецПопытки;

РабочаяКнига = Эксель.Workbooks.Open(Файл);
// Страница = РабочаяКнига.Worksheets(1);

// (?) немного сузит диапазон поиска
Диапазон = РабочаяКнига.Worksheets(1).UsedRange;

// Порядок = 0;
// Пока Истина Цикл
// Порядок = Порядок + 1;
// Состояние("Преобразование имен: " + Порядок + "");
//
// Ячейка = Страница.Cells.Find("_name_");
//
// Если Ячейка = Неопределено Тогда
// Прервать;
// КонецЕсли;
//
// Ячейка.Name = СтрЗаменить(Ячейка.Value, "_name_", "");
// Ячейка.Value = "";
//
// КонецЦикла;

Ячейка = Диапазон.Find("_name_");

Если (Ячейка <> Неопределено) Тогда
  АдресПервой = Ячейка.Address;

  Порядок = 0;
  Пока Истина Цикл
    Порядок = Порядок + 1;
    Состояние("Преобразование имен: " + Порядок + "");
  
    // отработает быстрее, чем СтрЗаменить()
    Ячейка.Name = Сред(Ячейка.Value, 7);
    Ячейка.Value = "";
  
    // не создается новый контекст Find, поиск продолжается после Ячейка
    Ячейка = Диапазон.FindNext(Ячейка); 
  
    Если (Ячейка = Неопределено) или (Ячейка.Address = АдресПервой) Тогда
    Прервать;
    КонецЕсли;

  КонецЦикла; 
КонецЕсли;


> В книге Excel содержится примерно 100 000 ячеек, которые содержат текст "_name_". Мне необходимо ...
... еще 80 000 ячеек, которые содержат текст "_formula_" ...
... еще 10 000 ячеек, которые содержат текст "_if_" ...

Реализация бредовая, ИМХО. И не спасут никакие замены поиска на перебор и использование массивов.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783162
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
formul и if очень мало. Если реализация бредовая предложите другой вариант.
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 1 из 3
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Cells.Find...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]