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

Страницы: 1
Суммирование и удаление дубликатов с сохранением значений в строке
 
Сделал сортировку чуть иначе.
Вроде работает. (без заголовка)
Код
Sub part()
Dim k As Long, j As Long, c(), b()   
ActiveSheet.UsedRange.Sort [B1], xlAscending, , , , , , xlNo
    j = Cells(Rows.Count, 1).End(xlUp).Row
    c = Range("B1:B" & j).value: b = Range("N1:N" & j).value
    For k = UBound(c, 1) To 2 Step -1
        If c(k, 1) = c(k - 1, 1) Then
            b(k - 1, 1) = b(k - 1, 1) + b(k, 1): c(k, 1) = Empty
        End If
    Next
    [B1].Resize(UBound(c, 1)).value = c: [N1].Resize(UBound(b, 1)).value = b
    On Error Resume Next
    Range("B1:B" & j).SpecialCells(4).EntireRow.Delete
    On Error GoTo 0
End Sub
Изменено: DrUM64 - 24.07.2017 16:59:23
Суммирование и удаление дубликатов с сохранением значений в строке
 
Цитата
The_Prist написал:
Header:=xlYes
подумайте, что надо сделать, если заголовка нет...
Сделал Header:=xlNo
Не помогло.
Или  N2->N1 и B2->B1 менять не надо ?
Изменено: DrUM64 - 21.07.2017 16:07:18
Суммирование и удаление дубликатов с сохранением значений в строке
 
SAS888,
Еще вопрос.
Если в таблице нет заголовка, как изменить макрос?
Я поменял N2->N1 и B2->B1, но так сортировка почему-то не корректно работает.
Что-то я недоглядел?
Суммирование и удаление дубликатов с сохранением значений в строке
 
SAS888, спасибо огромное!
Век живи - век учись...
Были подозрения на формат, но не знал как победить.  
Суммирование и удаление дубликатов с сохранением значений в строке
 
Что-то не пойму. С первым примером макрос работает, а вставляю другую таблицу (вложение) - не удаляются дубликаты после суммирования.
То есть вот эта строка не срабатывает:
Цитата
   Range("B2:B" & j).SpecialCells(4).EntireRow.Delete

UPD.
Я кажется понял, почему.
Столбец  К - там появились еще одни данные о количестве.
Как бы сделать. чтобы это значение игнорировалось? Оно в дальнейшем не нужно.
Нет, дело не в этом. Если значения очистить - все равно не удаляются дубликаты.
SAS888, Огромная просьба посмотреть. почему не удаляется!
Изменено: DrUM64 - 20.07.2017 13:32:21 (дополнено)
Суммирование и удаление дубликатов с сохранением значений в строке
 
SAS888,
Да, все работает как надо. спасибо огромное!
Сортировка - это имеется в виду, что группируются одинаковые строки? Это ведь никак не влияет на результат, так что все в порядке.:)
Суммирование и удаление дубликатов с сохранением значений в строке
 
Цитата
Sanja написал:
Нужно удалить СТРОКУ с дубликатом в столбце B, суммировав количество?
Имеется в виду, что вся строка сохраняется, только изменяется количество товара. Удаляться должны строки дубликатов целиком.
Например, если взять строки 12 и 13, то должна остаться только строка 12 (полностью, не измененная), а количество должно стать равным 2.
Просто в некоторых ячейках значения у дубликатов могут не совпадать. Вот например столбец А (склад) - точно будет разным. А надо оставить один. В общем-то в моем случае не имеет значения, какой. Главное - не пустое значение.
Изменено: DrUM64 - 18.07.2017 01:40:22
Суммирование и удаление дубликатов с сохранением значений в строке
 
Здравствуйте.
Нашел в архиве вот такой макрос:
Код
Sub Storm_ZCooler() 'http://www.planetaexcel.ru/forum.php?thread_id=45363
Dim Uniq As New Collection, Lastrow As Long, i As Long, j As Long, Arr(), Arr2()
Lastrow = Cells(Rows.Count, 5).End(xlUp).Row
Range(Cells(2, 5), Cells(Lastrow + 1, 6)).Clear
Lastrow = Cells(Rows.Count, 1).End(xlUp).Row
Arr = Range(Cells(2, 1), Cells(Lastrow, 2)).Value
    For i = 1 To UBound(Arr, 1)
        On Error Resume Next
        Uniq.Add Arr(i, 1), CStr(Arr(i, 1))
    Next
    ReDim Arr2(1 To Uniq.Count, 1 To 2)
    For i = 1 To Uniq.Count
        For j = 1 To UBound(Arr, 1)
            If Arr(j, 1) = Uniq(i) Then
                Arr2(i, 1) = Uniq(i)
                Arr2(i, 2) = Arr2(i, 2) + Arr(j, 2)
            End If
        Next
    Next
    Range(Cells(2, 5), Cells(Uniq.Count + 1, 6)) = Arr2
End Sub
Хочу приспособить его под свою таблицу (во вложении), но что-то не осилить мне.
Задача такая: есть одинаковые товары (столбец В) с разных складов. Надо просуммировать их количество (столбец N), удалив дубликаты и не затрагивая остальные значения, относящиеся к этому товару.
Надо чтобы все операции производились в самой таблице, а не создавались столбцы по соседству. И не должно оставаться пустых строк после удаления дубликата.
Количество строк не известно, и оно у меня определяется так:
Код
n = Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count

Это должен быть именно макрос, поскольку я его буду вставлять в уже сделанный основной макрос по сортировке таблицы.
Переименование: всем одинаковым словам присваивать одинаковое число
 
Возник ещё вопрос. Немного в "сторону". Не знаю, можно ли здесь задать, или новую тему создавать...
Спрошу для начала здесь.
В приложенном файле два столбца выделены зелёным. В "А" наименования, среди которых есть одинаковые. А в столбце "G" их количество.
Задача: убрать дубликаты, просуммировав количество.  
Переименование: всем одинаковым словам присваивать одинаковое число
 
Еще раз спасибо огромное всем за помощь!
Вставил эту процедуру в свой макрос для трех разных участков таблицы.
Удалось полностью автоматизировать процесс.
Переименование: всем одинаковым словам присваивать одинаковое число
 
Цитата
Nordheim написал: для Mac
вот, кстати, хотел спросить, почему у меня на маке ошибка на словарь выскакивала? Там как-то иначе работает?
Переименование: всем одинаковым словам присваивать одинаковое число
 
"всё гениальное просто..."
Переименование: всем одинаковым словам присваивать одинаковое число
 
Цитата
Nordheim написал:
Изменил код пробуйте!
Да, так работает. Спасибо.
Единственное, что нумерация начинается со 101, но это не принципиально, меня так тоже устраивает.
Немного изменил код, мне надо эту операцию делать для столбца Е.
И, кстати, то что операция проходит с заменой содержимого - это именно то, что и было нужно.
Как говорится, "снимаю шляпу"!:)
Переименование: всем одинаковым словам присваивать одинаковое число
 
Nordheim,
Ругается на вторую строчку.
"User-defined type not defined"
Переименование: всем одинаковым словам присваивать одинаковое число
 
Спасибо. Буду сравнивать.
Если не затруднит, можете для НЕ программиста объяснить, в чём разница этих вариантов?
upd.
На домашнем быстром компе разница по скорости работы с предыдущими вариантами есть, но существенно меньше, чем на медленном офисном.
Вариант SAS888 отработал мгновенно.  :excl:  
Изменено: DrUM64 - 08.07.2017 13:40:35
Переименование: всем одинаковым словам присваивать одинаковое число
 
Но вообще, работает не очень быстро. Для просчёта порядка 2000 ячеек уходит порядка 5 секунд.
Интересно, существуют ли более быстрые варианты?
Вопрос скорее риторический, я за временем не гонюсь. Работает - и ладно.
Но всё же?
И да, еще вопрос. А после завершения работы макроса не надо ли словарь чистить? Или он самоочищающийся?
Переименование: всем одинаковым словам присваивать одинаковое число
 
SAS888, огромное спасибо!
Переименование: всем одинаковым словам присваивать одинаковое число
 
Спасибо огромное за помощь!
Я подозревал, что нужно создавать условие If...Then, но познаний и навыков не хватило. :D
upd.
А можно ли сделать, чтобы работало без учета регистра?
Изменено: DrUM64 - 06.07.2017 12:47:00 (дополнено)
Переименование: всем одинаковым словам присваивать одинаковое число
 
Здравствуйте.
Нашел в архиве форума похожую тему.
Но мне нужно сделать иначе. Чтобы всем одинаковым словам (например, именам) присваивалась одна и та же цифра.
К примеру, все Иваны заменялись бы на 100, все Марии на 101 и т. д. до конца столбца. Имена идут вразнобой. Кроме того, совершенно неизвестно, что это будут за имена. Да и не обязательно имена. Артикулы товаров, названия товаров - не имеет значения. И последовательность может быть любая.
Для примера - коротенькая таблица. Очень привлекает идея использовать словарь.
Ну никак не разберусь, что нужно в том макросе из темы по ссылке поменять....
Вот он, чтобы по ссылкам не бегать:
Код
Sub tt()   
Dim LastRow As Long, i As Long   
LastRow = Cells(Rows.Count, 1).End(xlUp).Row   
With CreateObject("scripting.dictionary")   
   For i = 2 To LastRow   
   .Item(Cells(i, 1).Value) = .Item(Cells(i, 1).Value) + 1   
   Cells(i, 1) = Cells(i, 1) & "-" & .Item(Cells(i, 1).Value)   
   Next   
End With   
End Sub
Страницы: 1
Наверх