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

Страницы: 1
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
Nordheim, спасибо!
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
Nordheim, большое спасибо! Теперь буду работать над внедрением. Но это, наверное, уже другая тема.  
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
msi2102, это гениально! Спасибо! Теперь подумаю как это автоматизировать для менеджеров

Nordheim, спасибо за помощь! Тоже интересный вариант, в целом понял, но что-то не могу найти циклы
Изменено: San Tut - 19.07.2021 17:55:23 (Дополнил сообщение, чтобы не писать два подряд)
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
Цитата
Nordheim написал:
Кнопку добавил с помощью программы RibbonXML.
Огромное спасибо!)

Цитата
Nordheim написал:
что значит добавить,
Похоже я не совсем точно выразился. Я подразумевал "добавить исключения". Первые несколько столбцов скрываться не должны ни при каких условиях.

Цитата
msi2102 написал:
Может так
Спасибо за ответ! Правильно ли я понял, что тут действует от противного и убирает столбцы, содержащие ключевое слово? Если это так, то такой вариант не подойдет, т.к. убрать надо около 500 столбцов.  
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
Nordheim, спасибо! Вариант весьма интересный. Одного понять не могу - как Вы вкладку с кнопками добавили? Три раза код просмотрел - не нашел. Не поделитесь?
И второй вопрос — как добавить в код те столбцы, которые не попадают под фильтрацию? Пример файла подробнее прилагаю.
Изменено: San Tut - 16.07.2021 18:29:35 (изменил файл)
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
msi2102, за желание помочь все равно спасибо.  :)  Вот вывернуть бы такой фильтр... Но как?..
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
msi2102, или я чего-то не понимаю, или расширенный фильтр работает только вертикально. Мне надо скрыть не строки, а именно столбцы, в которые не входит заданное слово.
Горизонтальный фильтр по вхождению, а не по точному совпадению
 
Добрый день, уважаемые форумчане! Заранее прошу прощения у модераторов, что не могу написать в соответствующую ветку, т.к. она в архиве
В теме https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=12247 предложен замечательный скрипт для горизонтального фильтрования:
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim myControlRange As Range
 Dim rng As Range, Stolbec As Range

 'назначаем конролируемую ячейку при изменении которой бдет запускаться макрос
 'и с этим занчением будут сравниваться данные
  Set myControlRange = Range("B3")

  'пропускаем ошибки
  On Error Resume Next

  If Selection.Cells.Count > 1 Then Exit Sub

   If Not Intersect(Target, myControlRange) Is Nothing Then

     'отключаем обновление и контроль событий
      Application.ScreenUpdating = False
      Application.EnableEvents = False

     'отображаем все столбцы, если были скрыты/со столбца F в данном случае
     Range(Cells(7, 6), Cells(7, Columns.Count)).EntireColumn.Hidden = False

     'устанавливаем диапазон данных где будем проверять данные/это строка 7 со столбца F
      Set Stolbec = Range(Cells(7, 6), Cells(7, Columns.Count).End(xlToLeft))

        'проверяем данные в каждой ячейке равенству для фильтра
          For Each rng In Stolbec
             If rng.Value <> Target.Value Then rng.EntireColumn.Hidden = True
          Next
   End If

  Application.EnableEvents = True
  Application.ScreenUpdating = True
End Sub

Как сделать так, чтобы фильтровал он не по точному совпадению, а по вхождению?
Представим, что столбцы называются
Артикул Цена  Кастрюля: белая Кастрюля: краснаяКастрюля: зеленаяТарелка: белаяТарелка: прозозрачнаяЧашка: полная
И нам надо оставить только столбцы, например, сначала с кастрюлями, артикулом и ценой, а остальный скрыть, а затем с тарелками. Артикул и цена должны быть видны при любых условиях. Таких столбцов всего около 500. Как сделать так, чтобы вводя слово "кастрюля" я мог отфильтровать все кастрюли и т.д.?

Файлы прилагаю
Оригинал

То, что я хочу

Изменено: San Tut - 16.07.2021 18:28:51 (Добавил пример данных для фильтрации)
Замена результата вычисления фиксированным значением, Прошу помочь разобраться как обнулить формулу и поставить вместо нее фиксированное значение
 
Сам же решение и нашел. Если вдруг кто-то столкнется, то решил так
Код
=(ЕСЛИ(ИЛИ(E2='Служебная информация'!$I$4;E2='Служебная информация'!$I$6);
        (ВПР(E2;'Служебная информация'!I:J;2;ЛОЖЬ));(ВПР(D2;'Служебная информация'!B:C;2;ЛОЖЬ)*
        (ВПР(E2;'Служебная информация'!I:J;2;ЛОЖЬ)))))

Всем спасибо за внимание. Извините, если отвлек.
Изменено: vikttur - 07.07.2021 12:58:21
Замена результата вычисления фиксированным значением, Прошу помочь разобраться как обнулить формулу и поставить вместо нее фиксированное значение
 
Добрый день, уважаемые форумчане! Заранее извиняюсь за расплывчатую формулировку. Читать вопрос без файла перед глазами не имеет смысла. Файл приложен.

Это файл отчета контент-менеджера. Он заполняет вкладку "Отчет". Во вкладке "Служебная информация" содержатся тарифы и коэффициенты.

Столкнулся с такой ситуацией:
Есть дополнительные работы, часть из них оплачивается коэффициентами от условной целой работы, стоимость которой вычисляется формулой. Но некоторые дополнительные работы имеют фиксированную ставку.

Сама оплата вычисляется на первой вкладке в графе Ca$h формулой =(ВПР(D2;'Служебная информация'!B:C;2;ЛОЖЬ))*(ВПР(E2;'Служебная информация'!I:J;2;ЛОЖЬ)). Первый ВПР выбирает ставку, а второй - коэффициент. Мне нужно, чтобы в двух случаях ("Правка 1 вкладки" и "Правка фото" первый ВПР умножался на 0 и ставилось фиксированное значение. Нагромождения "Если" хотелось бы избежать.  
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Kuzmich, огромное спасибо! Честно, как мне казалось, я уже пробовал то, что Вы предложили, но решил сделать еще раз и... Заработало! Вот оно, решение:
Код
Sub UniqArticul()
Dim Sht As Worksheet
Dim i As Long
Dim iLastRow As Long
Dim FoundCell As Range
Dim ColArticul As Integer
Dim dict As Object
Dim arr
Dim Col As String

Col = Application.InputBox("Укажите название столбца", , , , , , , 2)

ThisWorkbook.Sheets.Add.Name = "Дубликаты"

   Set dict = CreateObject("Scripting.Dictionary"): dict.comparemode = 1
  For Each Sht In Worksheets
    If Sht.Name <> "Дубликаты" Then
      With Sht
       Set FoundCell = .Rows(1).Find(Col, , xlValues, xlWhole)
        If Not FoundCell Is Nothing Then
          ColArticul = FoundCell.Column
          iLastRow = .Cells(.Rows.Count, ColArticul).End(xlUp).Row
          arr = .Range(.Cells(2, ColArticul), .Cells(iLastRow, ColArticul))
          For i = 1 To UBound(arr)
            dict.Item(arr(i, 1)) = dict.Item(arr(i, 1)) + Sht.Name & " строка: " & i + 1 & "; "
          Next
        End If
        Set FoundCell = Nothing
      End With
    End If
  Next
   Columns("C:D").ClearContents
   Range("C1").Resize(dict.Count, 2) = Application.Transpose(Array(dict.keys, dict.Items))
End Sub
Огромное спасибо всем, кто не остался равнодушен! Отдельное спасибо Kuzmich!
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Kuzmich, оу, прошу прощение, раскладка глюканула. Столбец может называться не "Артикул", а "Номенклатура". Я пытаюсь сделать так, чтобы пользователь сам определял область поиска или название столбца, в котором программа будет искать.
Код
...

Dim Col As Variant  ' Создаем переменную, которой присвоим значение - имя столбца (заголовок)
 
Set Col = Application.InputBox("Укажите название столбца", , , , , , , 2) ' Запрашиваем у пользователя имя столбца (заголовок) и заключаем его в переменную Col
 
ThisWorkbook.Sheets.Add.Name = "Дубликаты" ' Создаем лист для вывода
 
   Set dict = CreateObject("Scripting.Dictionary"): dict.comparemode = 1
  For Each Sht In Worksheets
    If Sht.Name <> "Дубликаты" Then
      With Sht
       Set FoundCell = .Rows(1).Find(Col, , xlValues, xlWhole) 'Подставляем переменную вместо слова "Артикул"

...
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Kuzmich, да, пожалуй, это выход. Огромное спасибо! Я позволил себе добавить небольшую вишенку на торт в виде создания листа.
Код
Sub UniqArticul()
Dim Sht As Worksheet
Dim i As Long
Dim iLastRow As Long
Dim FoundCell As Range
Dim ColArticul As Integer
Dim dict As Object
Dim arr

ThisWorkbook.Sheets.Add.Name = "Дубликаты"

    Set dict = CreateObject("Scripting.Dictionary"): dict.comparemode = 1
  For Each Sht In Worksheets
    If Sht.Name <> "Дубликаты" Then
      With Sht
       Set FoundCell = .Rows(1).Find("Артикул", , xlValues, xlWhole)
        If Not FoundCell Is Nothing Then
          ColArticul = FoundCell.Column
          iLastRow = .Cells(.Rows.Count, ColArticul).End(xlUp).Row
          arr = .Range(.Cells(2, ColArticul), .Cells(iLastRow, ColArticul))
          For i = 1 To UBound(arr)
            dict.Item(arr(i, 1)) = dict.Item(arr(i, 1)) + Sht.Name & " строка: " & i + 1 & "; "
          Next
        End If
        Set FoundCell = Nothing
      End With
    End If
  Next
   Columns("C:D").ClearContents
   Range("C1").Resize(dict.Count, 2) = Application.Transpose(Array(dict.keys, dict.Items))
End Sub
Вот если б можно было бы название столбца сделать не жестко прописанным в код, а как-то так:
Код
Sub UniqArticul()
Dim Sht As Worksheet
Dim i As Long
Dim iLastRow As Long
Dim FoundCell As Range
Dim ColArticul As Integer
Dim dict As Object
Dim arr
Dim Col As Variant

Set Col = Application.InputBox("Укажите название столбца", , , , , , , 2)

ThisWorkbook.Sheets.Add.Name = "Дубликаты"

   Set dict = CreateObject("Scripting.Dictionary"): dict.comparemode = 1
  For Each Sht In Worksheets
    If Sht.Name <> "Дубликаты" Then
      With Sht
       Set FoundCell = .Rows(1).Find("Col", , xlValues, xlWhole)
        If Not FoundCell Is Nothing Then
          ColArticul = FoundCell.Column
          iLastRow = .Cells(.Rows.Count, ColArticul).End(xlUp).Row
          arr = .Range(.Cells(2, ColArticul), .Cells(iLastRow, ColArticul))
          For i = 1 To UBound(arr)
            dict.Item(arr(i, 1)) = dict.Item(arr(i, 1)) + Sht.Name & " строка: " & i + 1 & "; "
          Next
        End If
        Set FoundCell = Nothing
      End With
    End If
  Next
   Columns("C:D").ClearContents
   Range("C1").Resize(dict.Count, 2) = Application.Transpose(Array(dict.keys, dict.Items))
End Sub
Но этот вариант не взлетел. Если подскажете, где я ошибся, буду благодарен. А так, предложенный Вами вариант в большинстве случаев уже спасет.
Изменено: San Tut - 05.05.2021 15:07:55
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Kuzmich, а у меня получилось 935. Файл прилагаю. В файле есть скрипт, которым считал. Это почти то, что нужно, за исключением жестко прописанного диапазона, который я хотел бы заменить на переменную, но никак не могу додуматься как.

Ігор Гончаренко, рад видеть Вас в добром здравии! Как раз и делаем примерно то, что Вы описали.

Цитата
Marat Ta написал:
Замените Cells(1,1) на
А вот этим Вы мне подали интересную идею попробовать выразить диапазон через Cells, заменяя значения переменными. В ближайшее время попробую.
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Marat Ta, артикулы могут быть в произвольных колонках в рамках определенного диапазона, как и компаньоны.По первоначальной задумке, каждый артикул, встречающийся более 1 раза должен был быть подсвечен своим уникальным цветом, чтобы его сразу было видно. Но, если это труднореализуемо, то спасет и информация о дублях артикулов как на разных листах, так и на одном. Но именно артикулов, а не компаньонов или артикулов и компаньонов. И тут как раз требуется выделить диапазон в 2-3-4 столбца, в зависимости от того, как они гуляют в очередной выгрузке поставщика. Пользоваться этим решением будут люди, для которых Excel - это если не программа для рисования табличек, то что-то около того. Им нужно показать какую кнопку нажимать и что писать.

Вот список дублей по артикулам, собранный с помощью PLEX (лицензия, последняя версия) и условного форматирования
Скрытый текст

Каюсь, пятница, вечер, голова не варит, могу и тупить. Вернусь к размышлениям во вторник, 4-го (да, меня внезапные выходные не касаются). Всем хороших праздников!

Огромное спасибо всем неравнодушным!
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Marat Ta, спасибо, но в этом варианте как-то много лишнего выделилось (файл прилагаю)
В этом документе по сути не так много дубликатов. Скорее всего, вот они:
5012-1
5012-2
5012-3
5012-5
5012-6
5012-7
84214-3
84217-2
84217-5
84202-1
84202-14

Судя по всему, Ваш вариант берет еще графу с компаньонами. В случае выделения одним цветом всех дубликатов получается, что дубликатами являются практически все артикулы. Тут или разные цвета или выбор проверяемых столбцов.
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Цитата
Kuzmich написал:
Из правил форума2.3. Приложите файл(ы) с примером (общим весом не более 300Кб) в реальной структуре
Я прошу прощения, но мне незачем сочинять. Я очень уважаю этот форум и его участников. Возможно, в выведенном сообщении ошибка. Как я писал ранее, на рабочем компе форум иногда работает неправильно.

Изменено: San Tut - 30.04.2021 18:00:00 (Перезалил скриншот)
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Marat Ta, спасибо, ни разу не пользовался этим форматом, буду знать.

Так, решение практически найдено вот тут, спасибо, опять же, Вам.
Вот оно:
Код
Sub FindDuplicates() 
         ' Declare ws as a worksheet object variable.
         Dim ws As Worksheet
 
Dim Dict As Object, aa As Range, arr()
Set Dict = CreateObject("Scripting.Dictionary")
          
         ' Loop through all of the worksheets in the active workbook.
         For Each ws In Worksheets
For Each aa In ws.Range("H2:I60000") ' <= 2. здесь был жестко прописан Sheets(1). , замененный на ws.
If aa <> "Сводная" Then
  If Len(aa.Value) > 0 Then
    If Not Dict.exists(aa.Value) Then
      Dict.Add aa.Value, 1
    Else
      Dict.Item(aa.Value) = Dict.Item(aa.Value) + 1
    End If
  End If
End If
Next
Next
 
On Error Resume Next
Set aa = Application.InputBox("Выберите ячейку для вывода результата", , , , , , , 8)
If aa <> "Сводная" Then
If Err.Number > 0 Then Set aa = [AA1]
On Error GoTo 0
If aa.Cells.Count > 1 Then Set aa = Range(Left(aa.Address, InStr(":", aa.Address) - 1))
aa.Resize(Dict.Count) = Application.Transpose(Dict.keys)  ' <= 1. здесь приводилась ошибка пустого словаря
aa.Offset(0, 1).Resize(Dict.Count) = Application.Transpose(Dict.items)
End If
 
End Sub

Теперь осталось сообразить, как в
Код
For Each aa In ws.Range("H2:I60000")

заменить диапазон "H2:I60000" на переменную и дело сделано (ведь те, кто будет этим пользоваться, макросы только в кошмарах видели). В данный момент курю форумы и мануалы на эту тему. Пока не догоняю. Если кто может указать мне, где я не прав и что с этим делать, то было бы супер.

Пока застрял вот на этом:
Код
Sub FindDuplicates()
         ' Declare ws as a worksheet object variable.
         Dim ws As Worksheet
 
Dim Dict As Object, aa As Range, arr()
Dim myRange As Range

Set Dict = CreateObject("Scripting.Dictionary")
Set myRange = Application.InputBox("Выберите исследуемый диапазон", , , , , , , 8)          
         ' Loop through all of the worksheets in the active workbook.
         For Each ws In Worksheets
For Each aa In ws.Range(myRange) ' <= вот тут ошибка. Что я делаю не так?
If aa <> "Сводная" Then
  If Len(aa.Value) > 0 Then
    If Not Dict.exists(aa.Value) Then
      Dict.Add aa.Value, 1
    Else
      Dict.Item(aa.Value) = Dict.Item(aa.Value) + 1
    End If
  End If
End If
Next
Next
 
On Error Resume Next
Set aa = Application.InputBox("Выберите ячейку для вывода результата", , , , , , , 8)
If aa <> "Сводная" Then
If Err.Number > 0 Then Set aa = [AA1]
On Error GoTo 0
If aa.Cells.Count > 1 Then Set aa = Range(Left(aa.Address, InStr(":", aa.Address) - 1))
aa.Resize(Dict.Count) = Application.Transpose(Dict.keys)  ' <= 1. здесь приводилась ошибка пустого словаря
aa.Offset(0, 1).Resize(Dict.Count) = Application.Transpose(Dict.items)
End If
 
End Sub

Дебаг вылетает в строке 12.
Если может кто посоветовать литературу по теме (желательно бумажную), чтобы подтянуть теорию, отдельное спасибо.
Изменено: San Tut - 30.04.2021 17:55:25
Поиск дубликатов в КНИГЕ
 
Дмитрий Марков, Огромное спасибо!
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Цитата
Mershik написал:
придётся переделывать макрос
Да, действительно, если заменить, то выдает ошибку.
Цитата
Mershik написал:
получать список дубликатов на отдельном листе
Вы о чем-то типа этого?
Код
Sub FindDuplicates()
Dim Dict As Object, aa As Range, arr()
Set Dict = CreateObject("Scripting.Dictionary")
For Each aa In Sheets(1).UsedRange
  If Len(aa.Value) > 0 Then
    If Not Dict.exists(aa.Value) Then
      Dict.Add aa.Value, 1
    Else
      Dict.Item(aa.Value) = Dict.Item(aa.Value) + 1
    End If
  End If
Next
On Error Resume Next
Set aa = Application.InputBox("Select distination cell.", , , , , , , 8)
If Err.Number > 0 Then Set aa = [AA1]
On Error GoTo 0
If aa.Cells.Count > 1 Then Set aa = Range(Left(aa.Address, InStr(":", aa.Address) - 1))
aa.Resize(Dict.Count) = Application.Transpose(Dict.keys)
aa.Offset(0, 1).Resize(Dict.Count) = Application.Transpose(Dict.items)
End Sub
Он тоже ищет только на одном листе. Есть другой вариант, но в нем ошибка. Но я никак не могу понять где конкретно.
Код
Sub FindDuplicates()
 
       ' Declare Current as a worksheet object variable.
         Dim Current As Worksheet
 
 
Dim Dict As Object, aa As Range, arr()
Set Dict = CreateObject("Scripting.Dictionary")
          
         ' Loop through all of the worksheets in the active workbook.
For Each Current In Worksheets
For Each aa In Sheets(1).Range("H2:I60000") '[H2:I60000]
If aa <> "Сводная" Then
  If Len(aa.Value) > 0 Then
    If Not Dict.exists(aa.Value) Then
      Dict.Add aa.Value, 1
    Else
      Dict.Item(aa.Value) = Dict.Item(aa.Value) + 1
    End If
  End If
End If
Next
Next
 
 
On Error Resume Next
Set aa = Application.InputBox("Select distination cell.", , , , , , , 8)
If aa <> "Сводная" Then
If Err.Number > 0 Then Set aa = [AA1]
On Error GoTo 0
If aa.Cells.Count > 1 Then Set aa = Range(Left(aa.Address, InStr(":", aa.Address) - 1))
aa.Resize(Dict.Count) = Application.Transpose(Dict.keys)
aa.Offset(0, 1).Resize(Dict.Count) = Application.Transpose(Dict.items)
End If
 
End Sub
Есть подсказка, что ошибка потому что словарь получается пустой.
Чтоб его заполнить - нужно не только перебирать листы, но и их ячейки. И приведена строка
Код
For Each aa In Current.Range("H2:I60000")
Но  я что-то никак не могу додуматься, куда эту строку запихнуть. Как мартышка с очками.  
Поиск дубликатов в КНИГЕ
 
Дмитрий Марков, я, наверное, не так сформулировал вопрос, прошу прощения. Что именно Вы изменили в коде, чтобы исправить ошибку?
Поиск дубликатов в КНИГЕ
 
Hugo, Дмитрий Марков, я понимаю, что многого прошу, а можно специально для меня указать в коде, где именно была ошибка?
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Mershik, большое спасибо! Это практически решение. Только один лист выпадает из общей канвы. Если я ставлю E:F, то на что заменить 5?

Цитата
Marat Ta написал:
Я вам выделил участок вашего кода с циклом, где ясно что проход по листам пустышка.
Которую посоветовали на Stack Overflow  :cry:  

Цитата
Marat Ta написал:
учитесь применять поиск на форуме.
Не знаю, с чем это связано, но у меня форум с рабочего компа как-то неправильно работает. Мне приходится по 10 раз редактировать сообщения, т.к. при публикации они или исчезают, как было с первым сообщением темы, или изменяются до неузнаваемости.Комп проверял всем чем только можно - никакого результата. С другими сайтами все в порядке. А тема, указанная Вами, мне не попадалась, хоть я и искал. За ссылку большое спасибо - изучу.

Цитата
БМВ написал:
смысла в использовании разных цветов не вижу. каков он? Ну я б еще понял что заливка соответствовала б цвету листа на котором дубликат, а если он на нескольких листах?
Смысл в том, чтобы каждый артикул имел свой цвет и было видно сколько раз повторяется именно он. Иначе ребятки мои тратят очень много времени на выискивание дубликатов вручную, а им за это никто не платит. Не для себя стараюсь. А мысль тоже интересная, спасибо
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Огромное спасибо всем, кто не остался равнодушен!
Цитата
Marat Ta написал:
А зачем нам все 750 кб ваших данных?Для файла-примера хватило бы и части данных.
К сожалению, то, что работает на части данных не сработало на целом файле. Я пробовал решения из аналогичной темы. На файлах-примерах все работало, а применимо к этому файлу - нет. К тому же, один раз меня тут уже отчитали за то, что не прилагаю конкретные примеры  :)

Цитата
Kuzmich написал:
Вроде на форуме 300 Кб разрешено
Мне пишет: "Загружаемые файлы не должны быть размером более 100 Кб.

Цитата
Mershik написал:
а нужно искать во всех ячейках или определенном столбце - предположил что берем только значения столбца E:E
Mershik , интересный вариант, спасибо, завтра на работе попробую. Я же правильно понимаю, что чтобы изменить столбец, например, на B, нужно E:E заменить на B:B и 5 везде заменить на 2?

Цитата
Marat Ta написал:
По логике - если на 1 листе у ТС все работает как надо и вопрос стоит только почему это не работает по циклу по листам.... то вопрос: а что выполняется в цикле по листам?

По логике - да. Но есть опасения, что в этом как раз ошибка, что алгоритм работает каждый раз в рамках итерации, а не сравнивает листы между собой. А вот как его изменить, чтобы он начал сравнивать листы между собой и почему он все красит в один-два цвета - до этого я додуматься пока что не могу.
Изменено: San Tut - 29.04.2021 20:15:53
Сквозной поиск и подсветка дубликатов в книге, Прошу помощи в автомализиции поиска повторяющихся артикулов
 
Не совсем понял, куда пропало мое сообщение...
Дублирую
Уважаемые форумчане! Прошу помощи вот в таком вопросе. Есть файл https://yadi.sk/d/XbjB8sE9f8qkBQ. Сжать его меньше 100 Кб никак не получается. В нем на каждом листе есть артикулы. Мне надо выделить те, что повторяются на разных листах. Методы из похожей темы пробовал - не подошли. Помогите, пожалуйста.

Наиболее близким к тому, что нужно, является этот скрипт
Код
Sub ColorsDoubles()    On Error Resume Next
    ' массив цветов, используемых для заливки ячеек-дубликатов
    Colors = Array(12900829, 15849925, 14408946, 14610923, 15986394, 14281213, 14277081, _
                   9944516, 14994616, 12040422, 12379352, 15921906, 14336204, 15261367, 14281213)

    Dim coll As New Collection, dupes As New Collection, _
        cols As New Collection, ra As Range, cell As Range, n&
    Err.Clear: Set ra = Intersect(Selection, ActiveSheet.UsedRange)
    If Err Then Exit Sub

    ra.Interior.ColorIndex = xlColorIndexNone: Application.ScreenUpdating = False
    For Each cell In ra.Cells ' запонимаем значение дубликатов в коллекции dupes
    Err.Clear: If Len(Trim(cell)) Then coll.Add CStr(cell.Value), CStr(cell.Value)
        If Err Then dupes.Add CStr(cell.Value), CStr(cell.Value)
    Next cell
    For i& = 1 To dupes.Count ' заполняем коллекцию cols цветами для разных дубликатов
    n = n Mod (UBound(Colors) + 1): cols.Add Colors(n), dupes(i): n = n + 1
    Next
    For Each cell In ra.Cells ' окрашиваем ячейки, если для её значения назначен цвет
    cell.Interior.Color = cols(CStr(cell.Value)) ' если надо окрасить всю строку,то cell.EntireRow.Interior.color = cols(CStr(cell.Value))
    Next cell
    Application.ScreenUpdating = True
End Sub
Но он действует только в рамках одного листа и выделенного диапазона ячеек.

Я попробовал распространить его на всю книгу
Код
Sub ColorsDoubles()
    On Error Resume Next
    ' массив цветов, используемых для заливки ячеек-дубликатов
    Colors = Array(12900829, 15849925, 14408946, 14610923, 15986394, 14281213, 14277081, _
                   9944516, 14994616, 12040422, 12379352, 15921906, 14336204, 15261367, 14281213)

    Dim coll As New Collection, dupes As New Collection, _
        cols As New Collection, ra As Range, cell As Range, n&
    For Each oneSheet In ThisWorkbook.Sheets
    Err.Clear: Set ra = worksheet.UsedRange
   Next
    If Err Then Exit Sub

    ra.Interior.ColorIndex = xlColorIndexNone: Application.ScreenUpdating = False
    For Each cell In ra.Cells ' запонимаем значение дубликатов в коллекции dupes
    Err.Clear: If Len(Trim(cell)) Then coll.Add CStr(cell.Value), CStr(cell.Value)
        If Err Then dupes.Add CStr(cell.Value), CStr(cell.Value)
    Next cell
    For i& = 1 To dupes.Count ' заполняем коллекцию cols цветами для разных дубликатов
    n = n Mod (UBound(Colors) + 1): cols.Add Colors(n), dupes(i): n = n + 1
    Next
    For Each cell In ra.Cells ' окрашиваем ячейки, если для её значения назначен цвет
    cell.Interior.Color = cols(CStr(cell.Value)) ' если надо окрасить всю строку,то cell.EntireRow.Interior.color = cols(CStr(cell.Value))
    Next cell
    Application.ScreenUpdating = True End Sub
Но в итоге все окрасило одним цветом по непонятному мне принципу https://yadi.sk/i/vt7kK9hJN7e5Pg . Я ошибся или пошел не тем путем?
Изменено: San Tut - 29.04.2021 17:17:35
Страницы: 1
Наверх