ecolesnicov
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Stupido Вопрос решаемый ... Если просто "натолкнуть на мысль" то вот: 1) Создаем 2 массива на основе исходного интервала с текстовыми значениями через Код: A=Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец)) B=Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец)) | массив A будет исходным, массив B - результирующим 2) Открываем "другой" файл: Код: 3) Берем интервал в "другом" файле в еще один массив: Код: С=Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец)) | 4) Теперь надо перебор ... Можно делать это в лоб (полным перебором) можно более сложными алгоритмами (например, методом деления отрезка пополам, можно "поплавковым" способом). Пример полного перебора: Код: For r=1 to Ubound(A,1) ind=False For i=1 to Ubound(C,1) For j=1 to Ubound(C,2) -1 If A(r,1)=C(i,j) then B(r,1)=C(i,Ubound(C,2)) ind=True Exit For end if next j If ind=True then Exit For next i next r | В данном примере 3 вложенных цикла. Цикл по r перебирает строки в исходом массиве (A), Цикл по i перебирает строки в массиве (C) из "другого" файла, Цикл по j перебирает столбцы в массиве (C) из "другого" файла (кроме последней, содержащей значение на замену). При нахождении 1-го совпадения (IF ...) следует запись в результирующий массив B (т.к. строки исходного и результирующего массива совпадают) и переход к новой строке в исходном массиве. Внимание: данный перебор ищет ЛЮБОЕ ПЕРВОЕ СОВПАДЕНИЕ СВЕРХУ для ЛЮБЫХ СТРОК (это может быть не всегда правильно). 5) После обработки всех строк, "другой" файл можно закрыть ... Код: Workbooks(...).Close SaveChanges:=False | 6) Дальше сохраняем результирующий массив в исходный интервал на листе: Код: Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец))=B | 7) Очищаем память от всех массивов: Код: Вот и все ... Конечно все может быть совсем по другому ... Можно не использовать массивы, а оперировать прямо диапазонами ячеек на листе, можно применять другие методы перебора (правда большинство из них требуют дополнительной предварительной обработки - например сортировки), можно активно использовать объектные переменные, интервалы диапазонов можно вычислять динамически, а не указывать явно ... вообщем простор для творчества большой. Использование массивов целесообразно т.к. обеспечивает более чем 10-кратный прирост скорости, в случаях когда количество строк в исходом и искомом интервалах исчисляется десятками тысяч ... Добавлено: Сорри, надо добавить ... сразу не подумал. В предложенном выше описании, в случае если ничего в "другом" файле не найдено - для таких строк остается тоже значение которое и было ... наверное это не совсем правильно ... соответственно перед тем как определять результирующий массив B, требуется очистить содержимое ячеек., т.е. ПОСЛЕ определения массива A и ПЕРЕД записью B=Range(Cells(... добавьте: Код: Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец)).ClearContents | |