Страницы: 1 2 След.
RSS
Копирование определенных (с заливкой) ячеек на другой лист, копирование ячеек определенного цвета с нескольких листов на общий лист таблицы
 
Доброго времени суток!

Excel 2010

Имеется таблица, состоящая из 8 (в дальнейшем - более 7) листов.
На 7 из 8 листов (помимо итогового) имеются строки с данными, окрашенными в основной зеленый цвет.
Требуется следующее: из 7 листов в 8 лист скопировать все ячейки из колонки "B", окрашенные только в зеленый цвет.
По возможности на 8 листе, после копирования ячеек из предыдущих семи, удалить дубликаты, если таковые будут иметь место (а такие будут, к сожалению).

Подскажите, как можно реализовать это в макросе?
 
Что считать за дубликат? По какому столбцу или набору столбцов?
 
В модуль итогового листа:
Код
Public Sub www()
    Dim sh As Worksheet, i&
    For Each sh In ThisWorkbook.Worksheets
        For i = 2 To sh.UsedRange.Rows.Count
            If Not sh Is Me Then
                If sh.Cells(i, 2).Interior.ColorIndex = 43 Then
                    If Application.CountIf(Me.[a2].CurrentRegion, sh.Cells(i, 2).Value) = 0 Then _
                       sh.Cells(i, 2).Copy Me.Cells(Me.Rows.Count, 1).End(xlUp)(2, 1)
                End If
            End If
        Next
    Next
End Sub
Я сам - дурнее всякого примера! ...
 
У меня тоже готово, но пока не знаю, какие строки считать дубликатами.
 
Цитата
Юрий М написал:
Что считать за дубликат? По какому столбцу или набору столбцов?
Здравствуйте, Юрий!
За дубликат считать одинаковые числовые значения на всех листах из колонки "B"
 
kuklp, ошибка при попытке выполнения
(скриншот во вложении)
Изменено: MDmitriy - 19.04.2017 10:08:16
 
Цитата
MDmitriy написал:
За дубликат считать одинаковые числовые значения на всех листах из колонки "B"
Но ведь имеются разные даты для одного и того же значения в столбце В. Как тут быть?
Посмотрите пока вариант без отбора уникальных и определитесь с признаком уникальности.
Дополнение: в моём варианте не используется проверка конкретного цвета заливки, а проверяется - есть заливка ячейки или нет. Т.е. заливка может быть любым цветом.
 
Цитата
MDmitriy написал: ошибка при попытке выполнения
Вы точно
Цитата
kuklp написал: В модуль итогового листа
макрос вставили? Кнопку ткнуть осилите?
Я сам - дурнее всякого примера! ...
 
kuklp, спасибо большое за помощь!
Но, к сожалению, при 60к+ значениях макрос "кладет" ОС наглухо. Все зависает, помогает только жесткая перезагрузка.  :sceptic:

Юрий М, здравствуйте !
Колонка "B" - номер материала (артикул)
Признак уникальности - номер (восьмизначный) в ячейке из столбца "B"
В Вашем варианте на итоговый лист "сливает" строчки целиком, не только колонку "B".
Изменено: MDmitriy - 19.04.2017 13:52:22
 
Цитата
MDmitriy написал:
Колонка "B" - номер материала (артикул)
Признак уникальности - номер (восьмизначный) в ячейке из столбца "B"
Это я понял, но Вы никак не поймёте меня: в итоговой таблице, например, первые 5 строк имеют одинаковый номер - 30086408, но даты в столбце А разные. Какую из строк следует оставить?
Цитата
MDmitriy написал:
при 60к+ значениях...
Тогда и мой вариант нужно переделать на массивы.
 
Юрий М, извиняюсь, не до конца понял Вас.
Дата значения не играет, важна только уникальность восьмизначного номера артикула из колонки "B".
 
Вот уникальные.
И вопрос: лучше бы помечать строки не цветом, а каким-нибудь признаком в дополнительном столбце. Есть такая возможность? При больших объёмах исключили бы обращение к ячейкам на листе и макрос работал бы гораздо быстрее. В разы.
 
И мое:
Код
Public Sub www()
    Dim sh As Worksheet, i&, a, d1 As Object
    Set d1 = CreateObject("scripting.dictionary")
    For Each sh In ThisWorkbook.Worksheets
        If Not sh Is Me Then
            For i = 2 To sh.UsedRange.Rows.Count
                If sh.Cells(i, 2).Interior.ColorIndex = 43 Then
                    d1(sh.Cells(i, 2).Value) = ""
                End If
            Next
        End If
    Next
    a = d1.keys
    ReDim b(1 To UBound(a) + 1, 1 To 1)
    For i = 0 To UBound(a): b(i + 1, 1) = a(i): Next
    Me.[a1].Resize(i) = b
End Sub
Я сам - дурнее всякого примера! ...
 
Юр, а зачем ты строки копируешь?
Цитата
MDmitriy написал:
в 8 лист скопировать все ячейки из колонки "B"
:)
Я сам - дурнее всякого примера! ...
 
А как иначе? Залита - копирую. Но можно забирать в массив, а потом сбросить его на лист. Я же не знал, что в оригинале 60 000 строк )
 
Серж, понял тебя: нужно не всю строку, а только одну ячейку? Значит я невнимательно прочитал условия )
 
А я все гадал, что ты все о датах спрашиваешь, когда нужен код материала(артикул)  :)
Я сам - дурнее всякого примера! ...
 
kuklp, применить Ваш макрос ко всей книге или отдельно к листу?
 
Потому и спрашивал, что фактически уникальными получаются все )
 
Который раз пишу
Цитата
kuklp написал:
В модуль итогового листа
Цитата
MDmitriy написал:
применить Ваш макрос ко всей книге или отдельно к листу?
- это как у Вас получится? Макрос перебирает все листы. :(
Я сам - дурнее всякого примера! ...
 
kuklp,не получается :(
Не пойму никак, как добавить
 
Цитата
MDmitriy написал:
Не пойму никак, как добавить
добавить что? Не можете код в модуль скопировать?
Я сам - дурнее всякого примера! ...
 
Если только из одного столбца, тогда такой вариант:
Код
Sub MacroCollector()
Dim LastRow As Long, i As Long, n As Long, Arr, Uniq As New Collection, x As Long, Material
    Application.ScreenUpdating = False
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Range(Cells(2, 1), Cells(LastRow + 1, 1)).Clear
    For n = 1 To Sheets.Count
        With Sheets(n)
            If .Name <> ActiveSheet.Name Then
                LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
                For i = 2 To LastRow
                    On Error Resume Next
                    If .Cells(i, 1).Interior.Color <> 16777215 Then Uniq.Add .Cells(i, 2), CStr(.Cells(i, 2))
                Next
            End If
        End With
    Next
    ReDim Arr(1 To Uniq.Count, 1 To 1)
    For Each Material In Uniq
        x = x + 1
        Arr(x, 1) = Material
    Next
    Range("A2").Resize(x, 1).Value = Arr
    Application.ScreenUpdating = True
End Sub
 
kuklp, работает!!! Спасибо!
Юрий М, вам, Юрий, тоже спасибо за предложенные варианты и уделенное время!
 
kuklp, Подскажите, если
Interior.ColorIndex = 43
а я знаю код цвета в RGB, на который необходимо поменять, как мне вычислить это число?
 
Код
Interior.Color=RGB(1,2,3)
Пишу по памяти. Могу ошибиться. Проверьте.
Ессно, вместо чисел подставьте свои.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
MDmitriy написал:
я знаю код цвета в RGB, на который необходимо поменять, как мне вычислить это число?
А зачем? Почему не устраивает Interior.ColorIndex или просто Interior.Color?
Если же нужно узнать про перевод цвета в RGB, то это уже вопрос для другой темы.
 
Юрий М, здравствуйте!

В конечном итоге поменял на Interior.Color и задал необходимый цвет в RGB.
 
kuklp, добрый день!

Тестировал Ваш макрос, очень удобно!
Но обнаружил, что он удаляет дубликаты только в пределах одного конкретного листа, после чего добавляет "пачку" уникальных значений со следующего листа.
Подскажите, возможно ли дописать макрос так, что бы в итоге, после того, как все значения будут подобраны, уже с итогового листа удалялись дубликаты чисел?
 
Цитата
MDmitriy написал:
удаляет дубликаты только в пределах одного конкретного листа
- не верю! Пример в студию, пожалуйста. Где в результате остались бы дубликаты.
Я сам - дурнее всякого примера! ...
Страницы: 1 2 След.
Читают тему
Наверх