Всем доброго дня! Решила создать свою тему, хотя она обсуждалась примерно неделю назад вот здесь: (http://www.planetaexcel.ru/forum.php?thread_id=41678) Я немножко усложнила задачку Евгения. Нужно сделать, чтобы копирование из листа "Date" происходило по двум критериям, заданным в листе "Condition". Возможно ли это? Крутила сама макрос, но так ни к чему не пришла. Заранее благодарю за помощь файл в формате xlsm так как по утверждению уважаемого Hugo, макрос работает только на 2007/10 экселе.
Попробуйте так: .[E:E].AutoFilter Field:=1, Operator:=xlFilterValues, Criteria1:=Application.Transpose(Sheets("Condition").[A2].CurrentRegion.Columns(1).Value) .[F:F].AutoFilter Field:=1, Operator:=xlFilterValues, Criteria1:=Application.Transpose(Sheets("Condition").[B2].CurrentRegion.Columns(2).Value) [A2] или [B2] - роли не играет, т.к. это одна таблица и один CurrentRegion. Я проверить не могу - на 2003 сижу сейчас. Вам нужно было получить как критерий массив из одного столбца. Другой вариант - писать критерии в "отдельностоящие" столбцы.
Hugo! Спасибо что откликнулись. При добавлении строки для второго столбца, копирование вообще не происходит. Даже с ...[B2].CurrentRegion.Columns(2) "Отдельностоящие" столбцы (А и С), если я правильно поняла, так же не дали результата. Может есть еще варианты? Если нет, тогда будем ждать 2007-й...:-))
Хотя я не то предложил - так отфильтрует все города и все продукты, без привязки к парам. Т.е. и Москва-Редис тоже. Думаю фильтром не получится... Нужно циклом перебирать и скрывать ненужное, потом видимые копировать.
В моем файле пара сотен строк.)) Из всего этого надо выбрать около пары десятков совпадений. Файл приходит раз в месяц. Хотелось бы все это автоматизировать
{quote}{login=Julis}{date=30.05.2012 01:44}{thema=}{post}В моем файле пара сотен строк.)) Из всего этого надо выбрать около пары десятков совпадений. Файл приходит раз в месяц... {/post}{/quote} Надорваться можно!.. ;) А мо быть ну его макрос, давай AF (расширенный фильтр)?! Делов-то - раз в месяц... Как вариант... И если чё - рекордером его это самое - записать... -29682-
Если нужно выбрать только значения - тогда делайте перебором массива из диапазона выборку нужных значений в другой массив. Будет быстро. Примеров было много - мне сейчас некогда делать, обед на носу :)
With CreateObject("Scripting.Dictionary") .CompareMode = 1
a = Sheets("Condition").[A1].CurrentRegion.Value For i = 1 To UBound(a) .Item(Trim(a(i, 1)) & "|" & Trim(a(i, 2))) = vbNullString Next
a = Sheets("Data").[A1].CurrentRegion.Value ReDim b(1 To UBound(a), 1 To 6) For i = 1 To UBound(a) If .exists(Trim(a(i, 5)) & "|" & Trim(a(i, 6))) Then ii = ii + 1 For x = 1 To 6: b(ii, x) = a(i, x): Next End If Next
End With
With Sheets("Moved") .[A:F].Clear If ii > 0 Then .[A1].Resize(ii, 6) = b .Select End With
End Sub
Кстати, количество condition тоже может быть любое - особо на скорость не повлияет.
Все прекрасно работает. И под 2003-й подходит. Еще раз спасибочки.
PS. Вопрос совсем не по теме: последние дни Планета очень долго загружается. Именно Планета. Другие сайты загружаются быстро. У кого то есть подобная проблема?
Еще вопросик: Чисто теоретически, если понадобиться сортировка по ТРЁМ критериям, нужно переделывать весь код или достаточно изменить какое то значение?
Достаточно изменить тут .Item(Trim(a(i, 1)) & "|" & Trim(a(i, 2))) = vbNullString и тут If .exists(Trim(a(i, 5)) & "|" & Trim(a(i, 6))) Then Дописать ещё например & Trim(a(i, 3) Т.е. сперва запоминаем в словаре строку из нужных данных (разделитель ставьте любой, какого нет в этих данных, для надёжности). Затем из анализируемых данных извлекаем аналогичную строку и смотрим, есть ли она в словаре (т.е. нужно ли эту строку отбирать). Можно сперва создать несколько разных словарей из разных комбинаций параметров, затем аналогично проверить по этим словарям, и по результату проверки копировать строки в разные массивы. Т.е. например разложить общий список на 3 по "кондишкам" за один проход по списку. Быстро.
Ну не так уж сложно - глаза боятся, руки делают :) И уточню одну деталь - Trim() ставить не обязательно, это "защита от дурака". Если данные в таблице не вводятся "дураками", то очищать от возможных лишних пробелов по концам нет нужды. С другой стороны, если данные вводят совсем уж "дураки", то возможно нужен уже application.trim(), чтоб и внутри связки слов убирать возможные задвоения пробелов.