Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Сложный автофильтр с условием "содержит". Доработка макроса., фильтрация номеров заказов с несколькими дополнительными условиями
 
Файл примера
Сложный автофильтр с условием "содержит". Доработка макроса., фильтрация номеров заказов с несколькими дополнительными условиями
 
Есть макрос, который автоматически фильтрует номера заказов с несколькими дополнительными условиями. Пример прикреплен.
Его работа:
На листе 2 - база заказов по которым все фильтруется. На листе 3 - 2 столбца, значения которых записываются в фильтр. Первый - номер заказа, второй - номера деталей. После работы автофильтра на 2 листе все неподходящие строки скрываются и то что осталось копируется в лист 1.

Сейчас к нему хочу дописать еще одно условие - фильтровать номера заказов по условию "содержит" (так как раньше были короткие номера заказов, то было проще их вручную записать и не париться, а теперь новый вид, который руками в 10 раз дольше забивать. Придумали способ сокращенной записи для всех, а в базе так нельзя, вот и возникла потребность в изменении макроса). Как сделать не могу понять, еще и систему работы макроса не могу правильно составить, а начальство твердит: "Надо".
Нашел как записать код для "содержит":
Код
Selection.AutoFilter Field:=1, Criteria1:="*" & Cells(1, 1) & "*", Operator:=xlAnd
но не для определенных значений, а любых, которые могут быть в ячейках, но не смог его правильным образом встроить. Так как хотел оставить текущую работу макроса, чтобы искал полные совпадения по ячейкам и добавить новое условие: "содержит" в ячейке, то возник вопрос - не будет ли работа макроса двойной? Например, сначала он найдет все по полному совпадению, а потом по "содержит" и отобразит дубликаты? Здесь важно оставить именно двойное условие, так как могут быть номера 1001 или 10011, а по "содержит" найдет оба варианта.

Очень надеюсь, что Вы поможете с этим вопросом. Обращался ни один раз и всегда выручали. Другие форумы так не могут)
Цикл копирования ячеек, которые не пустые.
 
_Igor_61, Все работает как надо! Огроменное спасибо! Достать бы себе хоть чуток похожих мозгов)  
Цикл копирования ячеек, которые не пустые.
 
вот сам файл
Цикл копирования ячеек, которые не пустые.
 
Простейший цикл, казалось бы, а извилины не работают так, чтобы сделать как надо.
Есть задача копировать содержимое одной ячейки в другую на разных столбцах. При этом копировать должны только ячейки содержащие "*20-*" или "*21-*" (надеюсь верно показал пример "содержит") и в пределах текущей строки. Пример файла прикрепил. В файле есть макрос, который показывает как должно все сработать, только без условия "содержит". Он тяжелый, упростить как раз хотел с помощью циклов. При этом количество строк может быть больше 40000, а те ячейки, которые надо проверять могут быть пустыми 50/50.
Изменено: victorSwild - 11.12.2020 14:33:11
Фильтр всех заказов из диапазона со списком заказов, с дополнительными условиями фильтрации
 
Спасибо огромное!!! Все работает как дорогие швейцарские часы) Будем пробовать теперь дальше все совершенствовать.
Фильтр всех заказов из диапазона со списком заказов, с дополнительными условиями фильтрации
 
Цитата
pantel1987 написал: У вас в таблице есть столбец "№ Детали" и "номер детали" по какому из них нужно фильтроваться?
Да, тут ошибочно сделали шапку таблицы. Нужно только по столбцу Е: "№ Детали" фильтроваться. Залил нужные названия столбцов желтым, чтобы ориентироваться более точно. В последнем столбце я удалил название, чтобы не путаться. И, спасибо, что заметили, мы даже внимания не обращали на этот пункт.)

Цитата
Mershik написал: можно же просто скрыть не нужные строки макросом и все...
Очень хорошая мысль! Да, так тоже можно) Только все равно пока не понятно как к каждому заказу определенные номера деталей только оставлять.
Фильтр всех заказов из диапазона со списком заказов, с дополнительными условиями фильтрации
 
Прикрепил таблицу с поправками. Добавил примечания и то, что хотим получить в результате работы макроса. Если что-то нужно еще добавить в таблицу, то обязательно сделаем.
Фильтр всех заказов из диапазона со списком заказов, с дополнительными условиями фильтрации
 
Есть макрос, который был написан около года назад, с Вашей помощью, за что спасибо. А сейчас его полезности не хватает. Точнее нужно больше функций.
Сам макрос работает как автофильтр, который берет диапазон номеров заказов из одного листа и применяет его в фильтре другого листа, где ищет совпадения и выдает таблицу с отобранными заказами. После этого копирует все полученное в другой лист.
Сейчас надо добавить еще один фильтр в этот цикл. В таблице заказов кроме номера заказа теперь появляется еще одна переменная - номер детали в заказе. То есть нужно при фильтрации каждого заказа фильтровать еще и номера деталей. В каждом заказе количество деталей разное, от 1 до 50, и нужно выбирать всегда разные. При этом количество заказов может быть тоже от 1 до 100. В итого работа макроса должна иметь тот же вывод, что и сейчас, но еще и уметь выбирать номера деталей для каждого заказа.
В программировании VBA не силен, больше в Pithon работаю, поэтому не догоняю многих вещей из VBA. Думал добавить в оператор цикла for еще и while, чтобы работал так: взять из списка значений для фильтра первое и присвоить в автофильтр фильтруемого диапазона на другом листе; пока фильтруем текущее значение по номеру заказа, запускаем фильтр по номеру детали (номера деталей записаны на том же листе, где и номера заказов. В одной ячейке указаны номера через запятую. Ячейка с номерами деталей напротив ячейки с номерами заказов), полученный двойной автофильтр для первого заказа оставляем и переходим на следующий заказ (i+1) и повторяем те же действия. Полученный результат из всех фильтрованных заказов с деталями копируем в лист1.
Пример файла прикрепил, только там попыток изменить нету, так как ни одна не сработала я решил оставить только исходную рабочую версию макроса.
Мозгов не хватает как это дело сделать параллельным. Объяснение, конечно, тоже хромает.
Если эта тема уже была где-то на форуме, то буду очень не против ее прочесть, чтобы сделать задуманное, но пока подобное не получилось найти. Может плохо ищу)
Автоматическая фильтрация столбца с определенными значениями, взятыми из другого столбца.
 
tolstak, так вот как это делать, а я пробовал без кавычек, просто в скобках имя прописывать, потом ошибка все равно была. Спасибо большое за помощь! Вы мне очень помогли с вопросом!
Автоматическая фильтрация столбца с определенными значениями, взятыми из другого столбца.
 
tolstak, сейчас попробую уменьшить свою таблицу и скинуть пример.

Вот:
Я понял ошибку. У меня порядок листов был не верный: Лист4, Лист1, Лист2, Лист3, а надо по порядку верному. Поменял их между собой и все заработало!
Изменено: victorSwild - 18.07.2019 14:17:30
Автоматическая фильтрация столбца с определенными значениями, взятыми из другого столбца.
 
Большое спасибо за вариант! Прям то, что нужно. Я настроил его под свою книгу и у меня вылетела ошибка. Я только поменял имена столбцов и листов, а так же изменил величину диапазона ячеек. Ваш пример в документе работает отлично, вот то что надо, а когда настраиваю под себя, то дает сбои почему-то. Пытался и ячейку выделить, к которой применять фильтр и проверил ячейки на объединение, но все напрасно. Пока не знаю в чем причина ошибки.
Код
Sub Макрос1()
    Dim filterValuesRn  As Range, RangeToAutofilterRn As Range, filterArr() As String, i As Long
    ' Диапазон 2 (значения в фильтр)
    Set filterValuesRn = ThisWorkbook.Sheets(3).Range("A1:A150")
    ' Диапазон 1 (что фильтруем)
    Set RangeToAutofilterRn = ThisWorkbook.Sheets(4).Range("F1:F70000")
     
    ' Массив со значениями для фильтрациии
    ' Заполняем из диапазона 2
    ReDim filterArr(0 To filterValuesRn.Cells.Count - 1)
    For i = 0 To filterValuesRn.Cells.Count - 1
        filterArr(i) = filterValuesRn.Cells(i + 1)
    Next i
     
    ' Если на листе с диапазоном 1 уже есть автофильтр - сначала снимем все текущие фильтры
    If RangeToAutofilterRn.Parent.AutoFilterMode = True Then RangeToAutofilterRn.Parent.AutoFilter.ShowAllData
    ' Применим фильтр
    RangeToAutofilterRn.AutoFilter Field:=1, Criteria1:=filterArr, Operator:=xlFilterValues
End Sub
Изменено: victorSwild - 18.07.2019 09:23:04
Заменить формулы на значения и удалить нули
 
Огромное спасибо за помощь!!! Тема закрыта!
Автоматическая фильтрация столбца с определенными значениями, взятыми из другого столбца.
 
Ребят, HELP!!! Не пойму как сделать макрос, который будет работать с фильтрами. Цель такая: Есть первый столбец с n количеством значений и есть второй столбец, в другом листе этой же книги, который содержит в себе повторяющиеся значения как в первом столбце. Нужно отфильтровать первый столбец так, чтобы фильтр взял за основу значения из второго столбца, засунул себе в критерий отбора (не знаю как правильно, для меня это список значений с галочками, которые вручную очень долго надо клацать) и выдал результат в виде отфильтрованных значений. Я приложил файл где пример этих столбцов есть. Я даже не понимаю с чего начать, поэтому и обращаюсь к Вам.

Пример макроса могу показать из макрорекордера со своими дополнениями, но как обычно по незнанию лезут ошибки.
Код
Sub Ìàêðîñ1()
    ActiveSheet.Range("$D$2:$I$51586").AutoFilter Field:=3, Criteria1:=Array( _
        ActiveWorkbook.Worksheets("Ëèñò3").Range("$D$2:$I$51586")), Operator:=xlFilterValues
End Sub
Изменено: victorSwild - 18.07.2019 13:55:56
Заменить формулы на значения и удалить нули
 
Вот спасибо!!! Работает! Благодарю Вас! Всегда знал, что на этом сайте есть люди, которые реально знают свое дело :)  
Заменить формулы на значения и удалить нули
 
Попытался сообразить макрос на всю книгу, но ничего не выходит. Он-то работает и ячейки разъединяет для удаления, все как надо, но на всю книгу никак не получается сделать. Скину код, который на данный момент получился. Не доработан, но рабочий. Прошу помощи с этим вопросом. Сам - никак не в силах. На текущий лист только работает
Код
Sub DELETE()
For Each sh In ActiveWorkbook.Worksheets
Dim AllRows As Object, FirstCell As Object, FoundCell As Object
 
    sh.Application.ScreenUpdating = False
 
    Set FirstCell = Columns("F:G").Find(what:=0, LookAt:=xlWhole)
    If FirstCell Is Nothing Then Exit Sub
 
    Set AllRows = Rows(FirstCell.Row)
    Set FoundCell = FirstCell
 
    Do
        Set FoundCell = Columns("F:G").FindNext(After:=FoundCell)
        Set AllRows = Union(Rows(FoundCell.Row), AllRows)
        If FoundCell.Address = FirstCell.Address Then Exit Do
    Loop
    AllRows.UnMerge
        AllRows.Clear
        Next
End Sub
Изменено: victorSwild - 14.07.2019 18:47:37
Заменить формулы на значения и удалить нули
 
Цитата
Ігор Гончаренко написал:
в F и G 2 значения. удалять - это удалить или очистить (последствия этих действий очень разные, сделайте вручную - увидите)
прошу прощения - очистить, если быть точнее. Чтобы содержимое ячеек было пустым

Код
Sub DELETE()

Dim AllRows As Object, FirstCell As Object, FoundCell As Object

    Application.ScreenUpdating = False

    Set FirstCell = Columns("F:G").Find(what:=0, LookAt:=xlWhole)
    If FirstCell Is Nothing Then Exit Sub

    Set AllRows = Rows(FirstCell.Row)
    Set FoundCell = FirstCell

    Do
        Set FoundCell = Columns("F:G").FindNext(After:=FoundCell)
        Set AllRows = Union(Rows(FoundCell.Row), AllRows)
        If FoundCell.Address = FirstCell.Address Then Exit Do
    Loop
    AllRows.Clear
End Sub
Вот этот макрос работает. оказывается и строку может очищать.
Сейчас буду пробовать на всю книгу так же пилить. Может получится.  
Заменить формулы на значения и удалить нули
 
Нашел вот такой макрос:
Код
Sub DELETE()

Dim AllRows As Object, FirstCell As Object, FoundCell As Object

    Application.ScreenUpdating = False

    Set FirstCell = Columns("F:G").Find(what:=0, LookAt:=xlWhole)
    If FirstCell Is Nothing Then Exit Sub

    Set AllRows = Rows(FirstCell.Row)
    Set FoundCell = FirstCell

    Do
        Set FoundCell = Columns("F:G").FindNext(After:=FoundCell)
        Set AllRows = Union(Rows(FoundCell.Row), AllRows)
        If FoundCell.Address = FirstCell.Address Then Exit Do
    Loop
    AllRows.DELETE
End Sub
работает на страницу, но удаляет не всю строку, а только часть
Удаляет. только вот как раз "удаляет" строку. А надо очищать))
Изменено: victorSwild - 14.07.2019 16:48:30
Заменить формулы на значения и удалить нули
 
Сам я в любом случае пытаюсь разобраться как и что сделать, только без помощи не обойтись.
Я не пойму какой надо макрос написать, чтобы он проверял значение в определенных столбцах (F и G) таблицы и, если это значение равно нулю, то удаляет текущую строку. Но в этой строке есть объединенные ячейки, которые не позволяют всю ее удалить. А чтобы удалить то, что мне нужно из этой строки , то достаточно удалить содержимое первых 8 ячеек этой строки. Может чего непонятно объясняю, поэтому критику воспринимаю адекватно.
Заменить формулы на значения и удалить нули
 
Все круто, и еще осталось последнее, с чем пока даже не представляю как бороться.
Мы удалили из книги все формулы, оставив значения - отлично
Мы удалили ноли из полученных значений - замечательно
Теперь сложнее. Ищем в столбцах "F" и "G" ноли(которые мы удачно удаляли из всей книги, теперь надо немного откатиться назад), и если они есть, то удаляем содержимое строки с этими нолями, но не всю строку, а только определенные ячейки из столбцов, конкретно: "B, C, D, E, F, G, H".
Можно и всю строку, но тут есть проблема, у меня есть объединенные ячейки, которые не позволят просто так это сделать, поэтому и вынужден убивать только диапазон значений по горизонтали
Заменить формулы на значения и удалить нули
 
Супер!  :)
Отрабатывает как часы! 10 секунд и вся книга обработана. Огромное спасибо!
Заменить формулы на значения и удалить нули
 
в ошибке пишет: "Переменная объекта или переменная блока не установлены"
Run-time error 91
Заменить формулы на значения и удалить нули
 
Спасибо!!! Только немного не хочет работать макрос. Ошибку выдает.
И была опечатка, видимо, после <End> не было <sub>.
Заменить формулы на значения и удалить нули
 
Решил проблему с запуском второго макроса для всей книги.
Код
Sub delzero()
For Each ws In ActiveWorkbook.Worksheets
ws.Columns("F:G").Replace What:="0", Replacement:="", LookAt:=xlWhole
Next
End Sub

В моем случае этих двух столбцов как раз достаточно, для обработки.

Теперь другой вопрос возник, а как объединить эти 2 макроса в один?

оформляйте код в сообщениях с помощью кнопки <...> [МОДЕРАТОР]
Заменить формулы на значения и удалить нули
 
 Нашел как удалять формулы из всей книги, применил и работает, остаются только значения. Нашел и вторую часть замысла - удалить ноли, путем автозамены через макрос, пример взял с этого же сайта, но там всего дня двух столбцов было условие, а мне нужно на всю книгу. Тут я в тупике.
Первая часть:
Код
Sub DelFormula()
For Each sh In ActiveWorkbook.Sheets
 sh.UsedRange.Value = sh.UsedRange.Value
Next
End Sub

Это вот чудо удаляет формулы оставляя значения (на удивление быстро, случайно нашел макрос на форумах), в книге более 100 листов, каждый заполнен прилично. Вес книги от 10мб до 56(в среднем). Макрос работает, к нему претензий нет.

Вторая часть:
Код
Sub Del_zero()
Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        ws.Replace What:="0", Replacement:="", LookAt:=xlWhole
    Next
End Sub

это уже удаление нолей. Уже сам пытался нахимичить рабочую версию, но никак. Для всего листа не работает, а когда что-то пытается запуститься, то выдает ошибку, типа: "Эта команда не может выполнятся для всех листов". Может чего и путаю, но вот с этим макросом у меня проблема. Нужно, чтобы он так же как и первый выполнялся во всей книге.

Изначально выглядел данный макрос так:
Код
Sub Удалить_нули()   
   Columns("A:B").Replace What:="0", Replacement:="", LookAt:=xlWhole   
End Sub

После чего я попытался его на всю книгу применить, но увы...

Помогите, пожалуйста.
Копирование примечания из одного листа в другой с условием.
 
Цитата
panix1111 написал:
Но.
Зачем вам хранить в екселе изображения, когда у вас прописаны пути к ним?
Вот тут подробно прописано
http://www.planetaexcel.ru/techniques/9/128/
Именно отсюда я начал. Мне были нужны именно примечания с картинками, что и показано в той теме. Да файл становиться тяжелым, но для меня это не проблема и нет необходимости что-то в этом менять. За совет спасибо, попробую конечно же разобраться.

По теме: подставил цифру 6 - и да, все заработало!!)) Спасибо!)
Теперь буду дальше пытать книгу, чтобы  упростить и облегчить ее использование другими пользователями.Еще раз всем спасибо за помощь, без Вас сам бы точно не разобрался.
Копирование примечания из одного листа в другой с условием.
 
Спасибо всем, кто подсказывает как и что нужно сделать, начал разбираться хоть.
Но все равно ничего не получается. Изменял 2 на 5, как говорил panix1111. Менял a и bzx на разные буквы(zx - не трогал). Уже и по незнанию поменял положение листов, чтобы были так же, как и в приложенном файле и ни чего не происходит. Макрос выполняется без ошибок(бывает вообще такое???), а изменений нет никаких.
Только когда удаляю столбцы B,C,D , чтобы F стал на место B, тогда макрос работает как надо. Но тогда все нужные данные пропадают, выручает только одно - просто поменять местами содержимое, но тогда задумка с добавлением подобных примечаний к другим ячейкам книги становиться невыполнимой...
Приложу еще один файл, может подскажете как заставить работать макрос. В нем те же 2 листа. Только теперь на одном листе столбец куда надо копировать не B , а F.  
Копирование примечания из одного листа в другой с условием.
 
В книге, которую прикрепил к теме все работает как часы. Попытался применить макрос в другую книгу. Там отличия только в одном листе, названия листов те же, только столбец, в который нужно примечание копировать изменен с "b" на "f". И чего-то не получилось... Макрос выполняется без ошибок, но изменений никаких нет.
Код
Sub zx()
Dim a, fzx As Worksheet
Dim aa, ff As Long
 
Set a = Sheets("Лист3")
Set fzx = Sheets("Движение заказов")
aa = a.Cells(Rows.Count, 1).End(xlUp).Row
ff = fzx.Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
    For i = 2 To ff
    For j = 1 To aa
    If fzx.Cells(i, 2).Value = a.Cells(j, 1).Value Then
    a.Cells(j, 1).Copy
    fzx.Cells(i, 2).PasteSpecial Paste:=xlPasteComments
    End If
    Next j, i
    Application.ScreenUpdating = True
End Sub
100% мог не правильно переделать код макроса. Просто заменил все "b" на "f".
Изменено: victorSwild - 19.07.2017 19:36:30
Копирование примечания из одного листа в другой с условием.
 
Например:
Код
aa = a.Cells(Rows.Count, 1).End(xlUp).Row
bb = bzx.Cells(Rows.Count, 1).End(xlUp).Row

В этих двух строчках я правильно понял, что "aa" и "bb" это столбцы?
Копирование примечания из одного листа в другой с условием.
 
Супер, работает! Спасибо огромное!!!))
У меня просьба. Можете пояснить как работает этот макрос, хочу понять что означает каждая строка, если такое можно.
У меня есть и другая книга, там 15 листов и весит немало, порядка 70мб. База огромная. Так вот если мне нужно будет сделать подобную штуку в этой таблице, неплохо было бы знать синтаксис макроса. Заранее спасибо)
Страницы: 1 2 След.
Наверх