![]() |
![]() |
![]() |
|
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) то, что надо. Но, все равно, спасибо :)))))))))) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |