Имя: Пароль:
1C
1C 7.7
v7: 7.7 + поиск и замена значений в Excel
0 Масянька
 
11.07.11
16:01
День добрый!
Есть exl-файл с кодами и наименованиям номенклатуры. Нужно найти в файле код - поменять его на новый. То же нужно сделать и с наименованием. Код в 1 столбце, номенклатура - во 2.
Пока Справ.ПолучитьЭлемент() = 1 Цикл
   мТекущийКод = Прав(Справ.Код, 4);
       
   мНаименование    = Справ.Наименование;
       
   Если КорректируемФайл = 1 Тогда
       мЧтоИщем    = мТекущийКод;
       мНаЧтоМеняем    = Строка(Формат(мНовыйКод + 1, "Ч(0)4"));
       Попытка
           мПоискКод = Колонки.Find(мЧтоИщем);
           мПоискКод.Replace(мЧтоИщем, "'" + Строка(мНаЧтоМеняем));  
           мПоискКод.OffSet(мПоискКод, 0,1).Value = мНаименование;
       Исключение
       КонецПопытки;    
   КонецЕсли;

КонецЦикла;

Проблема: есть одинаковые коды в файле (соответственно, и наименованиями). Так вот: коды меняет, а наименования меняет только первый (2 одинаковых кода - меняет на новый, а наименование - только первое).
Может кто-нибудь что-нибудь подскажет?
Спасибо.
1 Масянька
 
11.07.11
16:06
Я разочек апну...
Что никто не заморачивался подобным?
2 fedoss
 
11.07.11
16:54
А он в Исключение вываливается, если не находит?
Если так:

Ищем = 1;
Пока Ищем = 1 Цикл
       Попытка
           мПоискКод = Колонки.Find(мЧтоИщем);
           мПоискКод.Replace(мЧтоИщем, "'" + Строка(мНаЧтоМеняем));  
           мПоискКод.OffSet(мПоискКод, 0,1).Value = мНаименование;
       Исключение
           Ищем = 0;
       КонецПопытки;    
КонецЦикла


Если не вываливается в Исключение, как-то проверять мПоискКод <> Nothing после поиска
3 Масянька
 
11.07.11
17:14
(2) Вообще крутится на первой строчке.
4 Масянька
 
11.07.11
17:17
(3) А как можно проверить мПоиск?
5 fedoss
 
11.07.11
17:20
(4) если Find не находит, он возвращает Экселевский Nothing. Посмотри отладчиком, может оно через ОЛЕ числом возвращается.
6 Масянька
 
11.07.11
17:23
После Find вставила сообщалку - 2 одинаковых кода, а сообщение выводится 1 раз.
7 miki
 
11.07.11
17:25
(6)ты вариант с find/findnext не захотела пробовать? Т.е. менять не сразу на всём листе, а по одному.
8 Масянька
 
11.07.11
17:27
(7) Я попробовала через перебор строк - легче утопиться - работает 40-45 минут.
9 Масянька
 
11.07.11
17:29
(7) Да и по всему листу с Find все так же.

PS Мозг уже закипел...
10 Масянька
 
11.07.11
17:30
А адрес выводит тоже первой найденной...
11 miki
 
11.07.11
17:33
(10)я ж тебе приводил аналогию с выделенным столбцом и вводом значеия в прошлой ветке...
Может Replace куа-то возвращает адреса найденных значений?..
12 Масянька
 
11.07.11
17:38
(11) Я Replace пока убрала. Код - выше. Сейчас голову морочу, как поймать одинаковые значения. А нет где-нибудь help'а, как Find работает? Погуглила - только параметры расписаны.
13 miki
 
11.07.11
17:40
"
Finds specific information in a range, and returns a Range object that represents the first cell where that information is found. Returns Nothing if no match is found. Doesn't affect the selection or the active cell.
"
14 miki
 
11.07.11
17:41
"
FindNext Method
Continues a search that was begun with the Find method. Finds the next cell that matches those same conditions and returns a Range object that represents that cell. Doesn't affect the selection or the active cell.
"
15 Масянька
 
11.07.11
17:41
А по-русски? Читаю и превожу со словарем :)
16 Mikeware
 
11.07.11
17:42
(15) и в http://www.translate.ru/ забанили?
17 miki
 
11.07.11
17:42
(15)translate.ru :))
18 AnyBody
 
11.07.11
17:44
У меня правда не замена, а удаление найденого, но работает так:
                       й=СтрокаExcel(Лист.Cells(1).SpecialCells(11).Address);// Адрес последней клетки на листе в формате "$D$4"
                       Диапазон=Лист.Range("b1:"+"b"+й);
                       Попытка ф=Диапазон.Find(я, Диапазон.Cells(1, 1), -4123, 1, 1, 1, 0, 0);
                       Исключение Прервать;
                       КонецПопытки;
                       Если ф<>"" Тогда Лист.Rows(СтрокаExcel(ф.address)).Delete();Удалено=Удалено+1;КонецЕсли;
19 AnyBody
 
11.07.11
17:46
Криво скопировалось. Еще раз:
й=СтрокаExcel(Лист.Cells(1).SpecialCells(11).Address);// Адрес последней клетки на листе в формате "$D$4"
Диапазон=Лист.Range("b1:"+"b"+й);
Попытка ф=Диапазон.Find(я, Диапазон.Cells(1, 1), -4123, 1, 1, 1, 0, 0);
Исключение Прервать;
КонецПопытки;
Если ф<>"" Тогда Лист.Rows(СтрокаExcel(ф.address)).Delete();Удалено=Удалено+1;КонецЕсли;
20 Масянька
 
11.07.11
17:48
Да пошутила я :)
Написато (в переводе) : "...Не затрагивает выбор или активную клетку"
Я вставила сообщалки - после ПолучитьЭлемент, Find и Исключение.
Вот что вырисовывается:
код - взяли из справочника (23).
нашли в файле - 23 адрес $А$12
код - взяли из справочника следующий - 24.
не нашли - 23 адрес $А$12
код - взяли из справочника следующий - 25.
не нашли - 25 адрес $А$14

То бишь 13 не выводит...
21 Масянька
 
11.07.11
17:49
Спасибо всем.
(19) Завтра буду пробовать :)
Пойду мозг остужать :(
22 Масянька
 
11.07.11
17:49
(19) Забыла - а что такое -4123?
23 Масянька
 
13.07.11
11:58
Продожаю кипятить мозг.

Процедура Перенумерция(КорректируемФайл)
   
   Если КорректируемФайл = 1 Тогда                // открываем файл
       Excel    = СоздатьОбъект("Excel.Application");
       Книга    = Excel.Workbooks.Open(ИмяФайлаКорректировки);
       Лист    = Книга.WorkSheets(1);
       Колонки = Лист.Columns(1);
       мПоследняяСтрока = Лист.UsedRange.Rows.Count;
       мТекЯчейка = Лист.Range("A1:A" + Лист.UsedRange.Rows.Count).Address();
       Диапазон        = Лист.Range("A1:" + мТекЯчейка);
   КонецЕсли;
   
   мНовыйКод = 0;

   Справ = СоздатьОбъект("Справочник.Номенклатура");

   Справ.ПорядокКодов();
   Справ.ВыбратьЭлементы(0);

   Пока Справ.ПолучитьЭлемент() = 1 Цикл
       мТекущийКод = Прав(Справ.Код, 4);
       Справ.УстановитьНовыйКод(Строка(Формат(мНовыйКод, "Ч(0)8")));        // замена кода
       мНаименование    = Справ.Наименование;
       Справ.Записать();
       Состояние("Обработана запись справочника с кодом - " + мТекущийКод + ". Новый код - " + Справ.Код + ".");

       Если КорректируемФайл = 1 Тогда
           мНаЧтоМеняем    = Строка(Формат(мНовыйКод + 1, "Ч(0)4"));
           Попытка
               мПоискКод = Диапазон.Find(мТекущийКод, Диапазон.Cells(1,1),-4123,1,1,1,0,0);
               мКодАдрес = мПоискКод.Address;
               мТекСтрока = мПоискКод.Row;

               мПоискКод.Value = "'" + Строка(мНаЧтоМеняем);  
               мПоискКод.OffSet(0,1).Value = мНаименование;

               Если мПоискКод<>"" Тогда
                   ~М1:Диапазон1  = Лист.Range("A" + Строка(мПоискКод.Row + 1) + ":A" + мПоследняяСтрока);
                   мПоискКод = Диапазон1.Find(мТекущийКод, Диапазон1.Cells(мТекСтрока,1),-4123,1,1,1,0,0);
                   мКодАдрес1 = мПоискКод.Address;
                   
                   Если (мКодАдрес <> мКодАдрес1) Тогда
                       мПоискКод.Value = "'" + Строка(мНаЧтоМеняем);  
                       мПоискКод.OffSet(0,1).Value = мНаименование;
                       Перейти ~М1;
                   КонецЕсли;
               КонецЕсли;
           Исключение
           КонецПопытки;    
       КонецЕсли;

       мНовыйКод        = мНовыйКод + 1;                                        
   КонецЦикла;
   
   Если КорректируемФайл = 1 Тогда                // закрываем файл
       Книга.SaveAs(ИмяФайлаКорректировки);
       //Excel.DisplayAlerts = 0;
       Excel.Workbooks.Close();
       Excel.Quit();
   КонецЕсли;
       
   Предупреждение("Готово.");
   
КонецПроцедуры    // ПростаяПеренумерция


Вроде работает, но...
В файле есть одинаковые коды (от 2 до 4 повторений). Количество строк в файле - 331. Замена в файле происходит нормально до 181 строки. Потом (в 182 строке) такой же код, но не изменяется. И далее (со 182 строки) такая же фигня.
Может в Excel есть какое-то ограничение, о котором я не знаю? Или может в коде где накосячила? Но тогда странно, до 182 строки изменяет и 2 повторения, и 3, и 4.
Короче, если кто может - помогите.
Спасибо.
24 miki
 
13.07.11
12:22
потому что GoTo :))

мПоследняяСтрока нормально присваивается?
Ещё раз: почему не юзаешь FindNext?
25 Масянька
 
13.07.11
12:35
(24) Какая разница между Find и FindNext?
Говорю же, до 182 строки - работает шикарно (2, 3, 4 одинаковых кода). А потом - меняет только в первой строке, а во второй и третьей остаются старые коды.
26 miki
 
13.07.11
15:09
проверил (23) на файле из 700 строк. Меняет везде. И до 182 и после. Может xls выложешь посмотреть?
27 Масянька
 
13.07.11
15:42
А как выложить?
28 Масянька
 
13.07.11
16:01
29 miki
 
13.07.11
17:18
подтверждаю глюк.
На файлике, который я проверял - просто одинаковые значения раскиданные вдоль столбца, а не вподряд, как у тебя. И не было автофильтров.
Ладно, попробую разобраться... позже.
30 Масянька
 
13.07.11
17:25
Буду ждать... Спасибо.
31 fedoss
 
13.07.11
17:42
Поменяй
~М1:Диапазон1  = Лист.Range("A1:A" + мПоследняяСтрока);
мПоискКод = Диапазон1.Find(мТекущийКод);

Код, конечно кривоват, но работает :)
32 Масянька
 
13.07.11
17:45
(31)Спасибо, попробую. Так поправь код - буду признательна. Критику по делу всегда рада выслушать :)
33 fedoss
 
13.07.11
17:50
(32) Можно все написать гораздо проще, много лишнего :)
Ранее правильно рекомендовали FindNext, с ним получается примерно так:

Попытка
 Нашли = Диапазон.Find(мТекущийКод);
 Нашли.Value = "'" + Строка(мНаЧтоМеняем);
 Нашли.OffSet(0,1).Value = мНаименование;
 Пока 1=1 Цикл
   Нашли = Диапазон.FindNext(Нашли);
   Нашли.Value = "'" + Строка(мНаЧтоМеняем);
   Нашли.OffSet(0,1).Value = мНаименование;
 КонецЦикла
Исключение
КонецПопытки
34 Масянька
 
13.07.11
18:01
(33) Огромное спасибо! Буду пробовать :)))
35 fedoss
 
13.07.11
18:04
(34) нп. Но твой код тоже работает, только поменять 2 строчки (31)
36 Масянька
 
14.07.11
10:55
Мальчики! Огромнейшее спасибо! Все работает и (31) и (33).
СПАСИБО!!! :)))))
37 Масянька
 
14.07.11
11:52
Пардон, слегка обшиблась - женщина же :)
(32) не арбайтен.
А (31) то, что надо.
Но, все равно, спасибо :))))))))))