powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Cells.Find...
53 сообщений из 53, показаны все 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
Excel. Cells.Find...
    #37783183
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zixxx или хотя бы excel умел правильно читать mxl, я был бы просто счастлив.
Не вижу причин не быть счастливым
Начиная с 2002, Ограничения xmlss
Начиная с 2007, OpenXML (pdf)
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783187
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, немного перепутал(xml mxl)
Но все равно, с xml тоже можно быть счастливым.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783206
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZixxxЯ их и беру непосредственно из 1с и они у меня есть в бланке заказа который сформирован в 1с, далее мне его нужно сохранить. Сохранить я его могу, например в mxl тогда имена останутся, а если я сохраню бланк в xls то имена не сохраняются. Поэтому, еще в момент формирования бланка в 1с, я ячейкам задаю определенный текст, который в дальнейшем мне и нужно перенести в имена ячеек.Я имел ввиду вот что
- сохраняем файл как экселевский
- подключаемся к файлу через СОМ
- добавляем в коллекцию Names нужные имена без перебора ячеек (данные для этого берем из 1С повторно)
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783234
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zixxxformul и if очень мало. Если реализация бредовая предложите другой вариант.
под спойлер стоит заглянуть при двух "если"
-имена ячеек используются исключительно для работоспособности формул в Excel
-у Вас есть возможность и желание повлиять на _создание_ отчета

убрать из 'формул' префиксы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
есть
_formula_=SUM(....
_if_=IF(...

сделать
=SUM(....
=IF(...



изменить формулы, содержащие имена
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
колонки 'Сумма'
есть 
=SUM(name(1)+name(2)+...+name(N)+0)*RC[-(N+1)]
сделать
=SUM(RC[-N]:RC[-1])*RC[-(N+1)]

небольшие сложности возникнут для колонки 'Итого, штук'
есть
=SUM(name(1)+name(2)+...+name(K)+0)
сделать
=RC[-X1]+RC[-X2]+...+RC[-XK]+0



не заполнять ячейки именами ВООБЩЕ

в таком случае обработка файла станет до смешного простой:

Код: vbnet
1.
2.
3.
4.
5.
// ...
  РабочаяКнига = Эксель.Workbooks.Open(Файл);
  Диапазон = РабочаяКнига.Worksheets(1).UsedRange;
  Диапазон.Formula = Диапазон.Formula;
// ...




ЗЫ: простите, если эпитет бредовая Вас обидел.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783290
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zixxx,

для более ясной схемы таблицы
__name_ количество по товару_ип_точке_.....
_formula_количество * цену или сумма по столбцу
_iif_признак группировки по ип

у ип или ооо может быть несколько точек
№НаименованиеЕд.Ед. местК.Кол. местАБЦенаВысоцкого, 44Невельского, 51СуммаИтого, штук1Бифидо кефир 2,5% 420 г ПЭТштмест10 _formula _=SUM (RC[29] /RC[-1]) 100.00 _name _ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95 _name _ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95 _formula _=SUM( _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+0)*RC[-3] _formula _=SUM( _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 _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _403ab811.54da.43e4.b998.5454fe5a7475 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _3e716fa5.17ee.4d2a.86eb.b2647f34ceb0 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _c9237718.def7.442c.978d.a86c36492149 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _333fec40.63ed.4e93.83cd.3106eb6a7fb7 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _333fec40.63ed.4e93.83cd.3106eb6a7fb7 _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _3ebd32de.8070.47ac.9d60.1918ee055739 _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _4b35a34e.6838.4fe1.92e9.55453a70e97b _C _3ebd32de.8070.47ac.9d60.1918ee055739 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+0)2Бифидо кефир 2,5% 950 г тетра рексштмест10 _formula _=SUM (RC[29] /RC[-1]) 100.00 _name _ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95 _name _ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95 _formula _=SUM( _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+0)*RC[-3] _formula _=SUM( _C _N _3737e743.d080.4649 .adb8.1d00b69eef68 _C _3d273d36.3331.4dd5.af15.f781f131edd3 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _191b3bc1.c4d4.42a0.85f4.a8c25aac161a _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _403ab811.54da.43e4.b998.5454fe5a7475 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _3e716fa5.17ee.4d2a.86eb.b2647f34ceb0 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _c9237718.def7.442c.978d.a86c36492149 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _333fec40.63ed.4e93.83cd.3106eb6a7fb7 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _333fec40.63ed.4e93.83cd.3106eb6a7fb7 _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _3ebd32de.8070.47ac.9d60.1918ee055739 _V _b910ecef.9cc8.44e8.b0df.bc705acb83ed _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+ _C _N _3737e743.d080.4649.adb8.1d00b69eef68 _C _3ebd32de.8070.47ac.9d60.1918ee055739 _V _4e115265.2211.42de.bc59.7d7deec26cde _T _d0d43c5c.554d.11e1.b4a5.1c6f65d75e95+0)Итого сумма по группе_if _=IF(RC[1]>0, "+","")_formula _=SUM(R[-10]C[3]:R[-1]C[3])_formula _=SUM(R[-10]C:R[-1]C)
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783333
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProZixxxЯ их и беру непосредственно из 1с и они у меня есть в бланке заказа который сформирован в 1с, далее мне его нужно сохранить. Сохранить я его могу, например в mxl тогда имена останутся, а если я сохраню бланк в xls то имена не сохраняются. Поэтому, еще в момент формирования бланка в 1с, я ячейкам задаю определенный текст, который в дальнейшем мне и нужно перенести в имена ячеек.Я имел ввиду вот что
- сохраняем файл как экселевский
- подключаемся к файлу через СОМ
- добавляем в коллекцию Names нужные имена без перебора ячеек (данные для этого берем из 1С повторно)

Я привязал имена к ячейкам, при загрузки бланка я читаю через com именованные ячейки и беру их значения, на основании имени я понимаю какая это номенклатура, какой адрес, какой контрагент и какой тип цен. Поэтому просто перенести туда имена для меня не имеет смысла я их связываю с определенными ячейками.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783355
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZixxxЯ привязал yимена к ячейкам, при загрузки бланка я читаю через com именованные ячейки и беру их значения, на основании имени я понимаю какая это номенклатура, какой адрес, какой контрагент и какой тип цен. Поэтому просто перенести туда имена для меня не имеет смысла я их связываю с определенными ячейками


- из 1С выгружаете в .xls;
- "доводите до ума" файл .xls;
- отдаете пользователю;
- заполненный пользователем файл "импортируете" в 1С.

Правильно понял схему ?
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783398
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZixxxПоэтому просто перенести туда имена для меня не имеет смысла я их связываю с определенными ячейками.А я разве говорил, что их не надо связывать? Вы, видимо, не посмотрели пример ElenHim 12507044 - я предлагаю использовать эту схему, только не на стороне экселя, а на стороне SQL
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783415
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProZixxxПоэтому просто перенести туда имена для меня не имеет смысла я их связываю с определенными ячейками.А я разве говорил, что их не надо связывать? Вы, видимо, не посмотрели пример ElenHim 12507044 - я предлагаю использовать эту схему, только не на стороне экселя, а на стороне SQL
Может я что-то не так понял из-за незнакомой мне терминологии, но у меня на стороне sql все нормально, у меня mxl заполнен именованными ячейками.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783442
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, я сказал SQL, имея ввиду 1С.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783444
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не вполне понятна конечная цель... Чтоб потом подставить это имя в формулу?
Как вариант для разработки - просматриваем диапазон, запоминаем адреса всех таких ячеек в словаре (ну и корректируем значение этих ячеек)
Затем снова просматриваем диапазон, и во всех формулах заменяем такие имена на их адреса (достаём из словаря). сразу преобразуем текст в формулу.
И побыстрее будет, и объём файла можно в несколько раз уменьшить.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783489
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProОй, я сказал SQL, имея ввиду 1С.
На стороне 1с все есть
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783492
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121Не вполне понятна конечная цель... Чтоб потом подставить это имя в формулу?
Как вариант для разработки - просматриваем диапазон, запоминаем адреса всех таких ячеек в словаре (ну и корректируем значение этих ячеек)
Затем снова просматриваем диапазон, и во всех формулах заменяем такие имена на их адреса (достаём из словаря). сразу преобразуем текст в формулу.
И побыстрее будет, и объём файла можно в несколько раз уменьшить.
Конечная цель - получить из excel ссылки на контрагента, номенклатуру, тип цен, и адрес доставки из одной ячейки в которой будет значение. С этим проблем нет.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783560
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то тема куда-то в лес уходит.

Изначальная проблема была в том, что код отрабатывал медленно.
Были предложены решения, которые отрабатывают быстрее.
При таких форматах и условиях это - лучшее, что может быть сделано.

Дальнейшая оптимизация потребует изменение форматов, логики и, возможно, много чего ещё.
Только это уже совсем другая история.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783657
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> ElenHim
> Что-то тема куда-то в лес уходит.

> Изначальная проблема была в том, что код отрабатывал медленно.

А поговорить?...
полуофф (тест)
Код: 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.
56.
57.
Option Explicit

' попытка добавить на лист 100к имён
' Excel 2003
' время работы ~5 минут и
' runtime error '1004': Application-defined or object-defined error 
' на попытке добавить 65473-е имя :((

Sub names100k()
Const NAMEADD& = 100000
Const NAMEFORCOL& = 10000
Const STARTROW& = 1
Const STARTCOL& = 1

Dim xl As Object
Dim i&, ii&, r&, k&
Dim t!


Set xl = New Excel.Application

With xl
    .ScreenUpdating = False
    '.Calculation = xlCalculationManual
    .EnableEvents = False
    
    t = Timer
    k = STARTCOL: ii = 0
    
    With .Workbooks.Add
        With .Worksheets(1).Names
            For i = 1 To NAMEADD
                If ii >= NAMEFORCOL Then ii = 0: k = k + 1: Debug.Print i - 1, Int(Timer - t)
                
                .Add Name:="_name" & i, Visible:=False, _
                    RefersToR1C1:="=R" & ii + STARTROW & "C" & k
                
                ii = ii + 1
            Next i
        End With '.Worksheets(1).Names
    
MsgBox "Создать 100к имён в новой пустой книге: ~ " & Int(Timer - t) & " c"
        
        .Close False
    End With '.Workbooks.Add
    
    .ScreenUpdating = True
    '.Calculation = xlCalculationAutomatic
    .EnableEvents = True
    
    .Quit

End With 'xl

Set xl = Nothing

End Sub

...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783747
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я думаю, что затея с именами изначально неверная - слишком много накладных расходов. Писать все эти значения, потом их обрабатывать, заменять...
Неужели нет другого пути - сразу где-то на стороне 1С это проделывать? (правда я 1С не видел...)
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783838
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на стороне 1с видимо
--вводятся данные
--формируется дикий отчет

а что делается на стороне екселя

для просмотра сводными таблицами такой монстр не нужен

достаточно получить текстовик через табулятор для открытия екселем
--фирма
--адрес
--товар
--тип цены
--цена
--количество

и настроить на него сводную
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783849
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Hugo121
> Неужели нет другого пути - сразу где-то на стороне 1С это проделывать? (правда я 1С не видел...)

Приоткрыть завесу тайны может только ТС, но он, видимо, потерял интерес к данной теме...


Камрады, кому так же скучно, как мне, запустите, плз, у себя тест 12513716 и отпишитесь о результатах.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783857
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> ПЕНСИОНЕРКА
> ...
> а что делается на стороне екселя

Набиваются данные.
После чего эта вся красотень импортируется обратно в 1С. Чтобы упростить/сделать вообще возможным этот импорт ТС так извращается.

ЗЫ: это всё мои досужие вымыслы.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783932
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаА поговорить?...


Обо что тут гутарить?

скукотищаКамрады, кому так же скучно, как мне, запустите, плз, у себя тест 12513716 и отпишитесь о результатах.

Чтот мне этот ваш код не очень нравится, поэтому предлагаю свой
Код: 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.
Option Explicit

Sub Ex()
Dim rng As Range, nome As Name, process As Variant
Dim i As Long, j As Long
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    .DisplayAlerts = False
End With
With ThisWorkbook
    Set rng = .WorkSheets(1).Cells(1, 1).Resize(1000, 100)
    rng.Value = "test"
    process = rng
    Debug.Print "Names.Count: " & .Names.Count
    Debug.Print Now()
    For i = LBound(process, 1) To UBound(process, 1)
        For j = LBound(process, 2) To UBound(process, 2)
            If Left$(process(i, j), 4) = "test" Then
                Set nome = .Names.Add(Name:=process(i, j) & "_" & i & "_" & j, RefersToR1C1:="=R" & i & "C" & j) 
            End If
        Next j
    Next i
    Debug.Print Now()
    Debug.Print "Names.Count: " & .Names.Count
    .SaveAs Filename:="C:\Test.xls"
End With
With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
    .DisplayAlerts = True
End With
Set rng = Nothing
Set nome = Nothing
End Sub




Мои результаты (E7300, 2ГБ ОЗУ,Excel 2010, в файле *.xls)

Names.Count: 0
05.05.2012 16:27:57
05.05.2012 16:30:19
Names.Count: 100000
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37783998
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> ElenHim
> Чтот мне этот ваш код не очень нравится, поэтому предлагаю свой

Не нравтся, так не нравтся. Насильно мил не будешь.

(ASUS X51L, Intel T2370@1.73GHz, RAM 2GB, Excel 2003 SP1)
Время работы ~5 минут, ошибка та же, что и с моим кодом.
Имён добавляет на одно больше ))

ЗЫ: Памяти потребляет при этом ~ на 60% больше, чем мой код ( 58 KB против 35) .
ЗЗЫ: спасибо, что уделили мне внимание.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37787177
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища> Hugo121
> Неужели нет другого пути - сразу где-то на стороне 1С это проделывать? (правда я 1С не видел...)
Приоткрыть завесу тайны может только ТС, но он, видимо, потерял интерес к данной теме...

Нет, интерес не пропал. Я просто уже писал почему так пришлось делать. Одна из причин это то что ячейка должна хранить больше данных чем позволило бы определить по колонке и строке, во вторых скорость разбора с именами у меня очень быстрая. Также я говорил что 1с на своей стороне все делает, она создает файл с именами так как мне и нужно, по при сохранении в xls платформа их не переносит.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37787198
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zixxx,
я до сих пор так и не понял, зачем выгружать в Excel а потом обратно тянуть, если можно(?) всё делать в 1С.

А с экселем можно попробовать не писать имена в ячейки таблицы, а сохранить пары Name-RefersToR1C1 в таблице значений и при обработке xls-файла добавить имена, используя эту таблицу значений.

ЗЫ: в экселе у объекта Name есть свойство Visible. Влияет на отображение в пользовательском интерфейсе.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37787207
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаZixxx,
я до сих пор так и не понял, зачем выгружать в Excel а потом обратно тянуть, если можно(?) всё делать в 1С.

А с экселем можно попробовать не писать имена в ячейки таблицы, а сохранить пары Name-RefersToR1C1 в таблице значений и при обработке xls-файла добавить имена, используя эту таблицу значений.

ЗЫ: в экселе у объекта Name есть свойство Visible. Влияет на отображение в пользовательском интерфейсе.

Почему промежуточное звено excel, это связано с некоторыми особенностями, удаленных не автоматизированных рабочих точек.
При обработке мне так и так придется определить какой ячейки что писать. В момент формирования табличного документа в 1с, у меня адрес ячейки всегда R1C1. Соответственно, я не смогу определить и где-то запомнить имена ячеек
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37787210
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Zixxx
> Соответственно, я не смогу определить и где-то запомнить имена ячеек

Да запросто.
Настроенные секции есть, размеры (высота, ширина) известны. Вычислить адрес той или иной ячейки - как два байта переслать. Но это уже оффтоп в данной ветке.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37787224
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища> Zixxx
> Соответственно, я не смогу определить и где-то запомнить имена ячеек

Да запросто.
Настроенные секции есть, размеры (высота, ширина) известны. Вычислить адрес той или иной ячейки - как два байта переслать. Но это уже оффтоп в данной ветке.

Секции только именованные, придется считать что когда выводится и жестко задавать в коде сколько в секции строк, также если секции объединяются, порядок нужно отнимать, количество это будет знать в конце цикла - запустим еще один. Все это весьма геморойно и сгодится только для говнокода.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37787226
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Zixxx
> Все это весьма геморойно и сгодится только для говнокода.

Альтернатива - неприемлимое время выполнения замен значений в ячейках на имена. Решать Вам.
...
Рейтинг: 0 / 0
Excel. Cells.Find...
    #37787494
Zixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища> Zixxx
> Все это весьма геморойно и сгодится только для говнокода.

Альтернатива - неприемлимое время выполнения замен значений в ячейках на имена. Решать Вам.
Перебор вполне устроил, find был не вариант
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Cells.Find...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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