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

Страницы: 1
Удаление дубликатов строки.
 
Sanja, Благодарю! Буду тестить.
Удаление дубликатов строки.
 
Цитата
Sanja написал:
Обязательно макросом?Для Excel 2021+
Вовсе не обязательно. На 2007 не будет работать?
Удаление дубликатов строки.
 
Всем Доброго, уважаемые форумчане! Помогите, пожалуйста, решить задачу.
Суть:
Есть 2 столбца, в первом встречаются повторяющиеся значения. Нужно удалить дубли, при этом сложить значения в ячейках этих же строк во втором столбце.
Пробовал с помощью словаря решить - не хватило знаний, как результат: дубли просто исчезли из списка совсем.
Пример приложил.


Скрытый текст
Разность двух массивов с помощью коллекции
 
Цитата
Андрей VG написал:
Силами VBA, но через SQL
Я нифига не понял, что это было, но это работает!  :D Спасибо, годный вариант.)
Разность двух массивов с помощью коллекции
 
Андрей VG, Спасибо за варианты) Хотелось бы обойтись силами VBA.
Разность двух массивов с помощью коллекции
 
Sanja,
Макрос погонял: на лист с результатом копируется столбец "B" с листа "Лист2".  Возможно, я не совсем ясно изложил задачу в первом посте, извиняюсь. По идее должны сравниваться  ячейки столбцов "A" с листов "Лист1" и "Лист2"  - НЕсовпавшие строки должны отобразиться на листе "разность". Столбцы "B" не сравниваются, но на листе с результатом должны быть строки полностью - ячейки столбца "A" и столбца "B".

P.S. Если использовать result2, то выгружает почти правильный результат - почему-то идёт вперемежку столбец "A" со столбцом "B", но с этим, впринципе, жить можно. Еще раз, Спасибо!
Изменено: Hostyle - 05.08.2018 13:04:16
Разность двух массивов с помощью коллекции
 
Цитата
Hugo написал:
- а кроме того нет такого файла, всех трёх листов, как следствие непонятно что вообще с чем сравниваете... Ну а ошибку я назвал.
Ну естественно, что там ничего этого нет - код с другого форума, написан более 10 лет назад другим человеком, под другие задачи. Я привел его без изменений, ту часть которую я изменил привел блоком кода ниже в этом же сообщении.
Разность двух массивов с помощью коллекции
 
Цитата
Sanja написал:
Сообщение #5 видели?
Видел, спасибо. Потестирую в рабочем режиме, отпишусь в теме.
Разность двух массивов с помощью коллекции
 
Sanja, Спасибо! Потестирую Ваш вариант.
Разность двух массивов с помощью коллекции
 
Цитата
RAN написал:
Это нам дает подтверждение слов  Hugo ,
Ну здорово. Только при условии, что ключи текстовые - макрос ТАК ЖЕ дальше не работает.
Разность двух массивов с помощью коллекции
 
Цитата
RAN написал:
Тогда выполните этот макрос
type mismatch. Что это нам дает?
Разность двух массивов с помощью коллекции
 
Цитата
Hugo написал:
Ключ в коллекции должен быть текстовым, т.е string
Отнюдь, сэр! Тогда выходит Compile error: For Each Control variable must be Variant or Object.
Цитата
Hugo написал:
P.S. а пример не работает вообще, и править его лень... Да и зачем?
Вы про оригинальный пример? Ну там просто нет вывода результата на лист. Я его выводил - работает.
Разность двух массивов с помощью коллекции
 
Доброго времени суток!

Есть задача:
Сравнить данные на двух листах, по первому столбцу. Строки которые, не совпали нужно вывести на отдельный лист. Метод построчного перебора данных в цикле отпадает, т.к. строк несколько тысяч. Пробовал решить с помощью массивов, но в этом случае не выходит сравнить элементы массивов именно на неравенство, работает только со знаком "=". Наткнулся на просторах рунета на такой код:

Скрытый текст


Пример работает, но при попытке допилить макрос с массивами под свои условия, столкнулся с ошибкой несоответствия типов данных:

Скрытый текст


Подсвечивается строка функции:
Код
tempItems.Add item, item

с Run-time error 13 type mismatch

Файл с примером в аттачменте. Первые два листа с данными, третий лист с результатом. Помогите, пожалуйста, разобраться с решением задачи.
Изменено: Hostyle - 04.08.2018 21:29:52
Сравнение данных на листе с помощью масссивов
 
Цитата
Hugo написал:
Вообще и в первом случае так могло теоретически быть, я там забыл exit for поставить при первом совпадении.Т.е. чтоб тожно не было ошибки - нужно не макс и не мин ставить, а произведение.
Может я не уловил сути, но при таком варианте:
Код
Sub ПроверкаНаНесовпадение()

Dim arr, arrSecond, i&, j&, k&
 
    With Workbooks("Накладная.xlsm").Worksheets("Лист5")
        arr = .Range("D1", .Cells(.Rows.Count, "A").End(xlUp)).Value
        arrSecond = .Range("H1", .Cells(.Rows.Count, "E").End(xlUp)).Value
    End With
 
    ReDim arr2(1 To Application.Product(UBound(arr), UBound(arrSecond)), 1 To 8)
 
    For i = 1 To UBound(arr)
        For j = 1 To UBound(arrSecond)
            If arr(i, 1) = arrSecond(j, 1) Then Exit For
                If arr(i, 4) <> arrSecond(j, 2) Then
                    k = k + 1
                    arr2(k, 1) = arr(i, 1)
                    arr2(k, 2) = arr(i, 2)
                    arr2(k, 3) = arrSecond(j, 1)
                    arr2(k, 4) = arrSecond(j, 2)
               ' End If
            End If
        Next j
    Next i
    
    
    With Workbooks("Накладная.xlsm").Worksheets("test").Cells(1, 12).Resize(k, 4)
        .Columns(2).NumberFormat = "@"
        .Value = arr2
    End With
    
 
End Sub

получается винигрет из 29376 строк.
Изменено: Hostyle - 09.02.2018 12:03:29
Сравнение данных на листе с помощью масссивов
 
Цитата
Sanja написал:
Можно 'прилепить' ЛИСТ "как надо" в этом же файле
Перезалил файл.
Сравнение данных на листе с помощью масссивов
 
Цитата
Sanja написал:
Ну раз можно так заполните и приложите файл-пример. Думаете кому то кроме Вас это интересно?
Выделенных цветом артикулов в списке нет, нужно чтобы они отсеивались на лист "test".
Файл "как надо" прилепить к посту? В принципе, это тот же самый файл.
Сравнение данных на листе с помощью масссивов
 
Цитата
Sanja написал:
Файл-пример. Как есть - Как надо
Файл "как есть" - в первом посте. "Как надо" - в этом же файле на лист "test" выгрузить не совпавшие артикулы из столбца "F" листа 5. Можно столбец "F" заполнить произвольными значениями, например, 7-значными числами - их точно нет в списке.
Сравнение данных на листе с помощью масссивов
 
Цитата
Sanja написал:
Так оно и так осеивается
Имелось ввиду на отдельный лист. Так-то оно просто не попадет в накладную и всё, а выковыривать это всё вручную потом из списка)
Сравнение данных на листе с помощью масссивов
 
Цитата
Hugo написал:
Массив не изменился, в том то и дело. Измените назад на Max - вот только логике в этом всём нет..
Неа. Не хочет робить. Логика тут простая, случается необходимость время от времени создавать накладную под новый товар. Бывает так, что часть этого товара есть в базе, а части нет. Вот я и попытался отсеять таким вот образом, то что пришло впервые. Возможно логики нет в моей реализации этой затеи.  
Сравнение данных на листе с помощью масссивов
 
Кстати, при замене знака "=" на знак "<>" вот в этой строке        
Код
 If arr(i, 4) = arrSecond(j, 2) Then

Макрос превращается в тыкву на строчке:

Код
 arr2(k, 1) = arr(i, 1)

и  arr2(k, 1)  "Subscripts out of range"

Массив же не изменился. Или я чего-то не понимаю?

Сравнение данных на листе с помощью масссивов
 
Цитата
Sanja написал:
мне кажется мой столбец 'вернее'    
Да, это я тоже уже исправил)
Сравнение данных на листе с помощью масссивов
 
Исправил)
Сравнение данных на листе с помощью масссивов
 
Цитата
Sanja написал:
Честное слово не списывал    
Спасибо!
Тоже рабочий вариант, есть что изучать.)
Сравнение данных на листе с помощью масссивов
 
Hugo, большое Спасибо, заработало!
Буду разбираться.)
Сравнение данных на листе с помощью масссивов
 
Доброго времени суток!
Суть проблемы такова, нужен был макрос для создания накладной. А именно: на "Лист5" сравнить данные в столбце A  с данными в столбце Е и данные в столбце D с данными в столбце F. Если в обоих случаях данные совпадают, то копировать на лист "test" строки столбцов  B, C, G, H.
Решил воспользоваться массивами. Сразу скажу, в массивах разбираюсь очень слабо. Нарыл в рунете код и "наощупь" допилил для выполнения своих задач.
Всё нормально работало, до тех пор пока я не решил заняться улучшайзингом. Закомментировал рабочие строки, менял параметры. смотрел на результат. Результат оакзался неудовлетворительным и я решил вернуться к рабочему варианту. Раскомментировал обратно то, что должно работать. итог: Runtime error 9 - Subscripts out of range.
код макроса следующий:
Код
 Sub Сравнение()

Dim i As Long, n As Long, m As Long, k As Long, j As Long
    Dim rng As Range, rng2 As Range
     Dim arr() As Variant, arrSecond() As Variant
    
    Workbooks("Накладная.xlsm").Worksheets("Лист5").Activate      
    
    Set rng = Cells(Rows.Count, 1)
    Set rng2 = Cells(Rows.Count, 5)
       
    If Not IsEmpty(rng) Then Set rng = Range("A:D") Else Set rng = Range(Range("D1"), rng.End(xlUp))
    If Not IsEmpty(rng2) Then Set rng2 = Range("E:H") Else Set rng2 = Range(Range("H1"), rng2.End(xlUp))
    
    arr = rng
    arrSecond = rng2
    
    n = UBound(arr)
     m = n - Evaluate("COUNTBLANK(" & rng.Columns(2).Address(ReferenceStyle:=Application.ReferenceStyle) & ")")
     
    
    ReDim arr2(1 To m, 1 To 8) As Variant

        For i = 1 To n
         For j = 1 To n
         
        If arr(i, 1) = arrSecond(j, 1) And arr(i, 4) = arrSecond(j, 2) Then
            k = k + 1
             
            arr2(k, 1) = arr(i, 1)
            arr2(k, 2) = arr(i, 2)
            arr2(k, 3) = arrSecond(j, 3)
            arr2(k, 4) = arrSecond(j, 4)            
            
        End If
         Next j
        Next i    
    
    Workbooks("Накладная.xlsm").Worksheets("test").Activate
    Range("A:A").NumberFormat = "@"    
    Cells(1, 1).Resize(m, 4) = arr2

End Sub

ругается на эту строчку:

Код
If arr(i, 1) = arrSecond(j, 1) And arr(i, 4) = arrSecond(j, 2) Then

При дебаге значения arrSecond(j, 1) и arrSecond(j, 2) "Subscripts out of range"

Весь день ломаю голову, помогите, пожалуйста, разобраться.

Удаление строк по условию, ошибка макроса
 
И всё? Причина только в этом? Спасибо, приму к сведению.
Удаление строк по условию, ошибка макроса
 
Всем доброго времени суток. Есть похожий вопрос - решил запостить в этой теме. Существуют три столбца с данными, во втором столбце встречается значение "0". Задача - удалить строки, содержащие ячейки с "0".  Пробовал 2мя способами.
вот этот код работает:
Скрытый текст

А этот нет (удаляется лишь первая строка, в ячейке которой найден 0):


Скрытый текст

Хотелось бы понять - в чем причина.

Сумма столбца в VBA
 
Kuzmich, спасибо! Заработало)
Тоже пытался решить через конкатенацию, но коряво: через 'FormulaR1C1'.
Сумма столбца в VBA
 
Здравствуйте. Столкнулся с похожей задачей, но есть нюанс. Сумма в ячейке должна быть прописана формулой, т.к. значения в столбце могут изменяться.
на данный момент код выглядит так

Код
Sub abc() 
Dim r&    
    r = Cells(Rows.Count, 4).End(xlUp).Row + 1      
      Application.Sum(Range(Cells(2, 4), Cells(r, 4)))

Страницы: 1
Наверх