Страницы: 1
RSS
Поиск строки по значениям двух столбцов и сумма данные третьего,
 
Добрый вечер, уважаемые форумчане. Нужна ваша помощь. Я не силен в VBA  и поэтому который день ломаю голову и пытаюсь из разных предложенных вариантов на данном форуме и не только слепить макрос, который мог бы находить по значениям из двух столбцов строку и суммировать значение , к примеру третьего и четвертого столбцов с новыми данными. В примере думаю более понятно. Пытался и через автофильтр и по поиску по двум значениям, но чего-то не догоняю. Буду очень признателен за любую помощь.
 
Код
Sub Кнопка1_Щелчок()
    Dim factor As Byte
    Dim arr(), nmb, art As Variant
    Dim i as long
    arr = Range("B3:D" & Cells(Rows.Count, "B").End(xlUp).Row).Value
    nmb = Range("L3")
    art = Range("M3")
    factor = 1
    For i = 1 To UBound(arr)
        If arr(i, 1) = nmb Then
            If arr(i, 3) = art Then
            Cells(i + 2, "E") = Cells(i + 2, "E") + Range("N3")
            Cells(i + 2, "F") = Cells(i + 2, "F") + Range("O3")
            factor = 0
            Exit For
            End If
        End If
    Next
    If factor Then MsgBox "Не нашел позицию!" Else MsgBox "Добавил!"
End Sub


Изменено: skais675 - 12.04.2019 20:06:01
 
skais675, огромное спасибо.
В моем общем макросе используются переменные. Из Вашего варианта назначил переменные:
Код
Dim Arr As Long
    Dim nmb As Range
    Dim factor As Range
    Dim art As Range
    Dim i As Range
но в этом месте
Код
For i = 1 To UBound(Arr)
 застопорился, выдает ошибку "Expected array", выделяя UBound. Что не так я сделал?
 
Alexey74
или уберите
Код
Option Explicit

или добавьте

Код
Dim arr() As Variant
Изменено: skais675 - 12.04.2019 19:41:14
 
Alexey74, а почему у Вас все переменные as range? Range - это диапазон.
 
Юрий М, Я говорю не силен в VBA, не до конца понимаю возможности. Что скажите? Как правильно сделать? skais675 Поменял. Спасибо. Но продолжаю дальше монтировать. Не все так быстро у меня получается.
 
Alexey74 в #2 описал переменные.
 
skais675, Увидел. А "i"? Не нужно?
 
Alexey74 Нужно. Поправил. Я обычно этим не замарачиваюсь не трачу лишнее время - но есть случаи где это крайне необходимо.
Изменено: skais675 - 12.04.2019 20:07:42
 
skais675,Большое спасибо. Макрос заработал, только пока не может найти позиции. В примере я урезал таблицу. Видимо столбцы не соответствуют.  
 
Alexey74 Как в анекдоте - мы пульки выпустили - выпустили - проблемы на Вашей стороне!
 
Цитата
skais675 написал:
Я обычно этим не замарачиваюсь не трачу лишнее время
А я ВСЕГДА объявляю все переменные и присваиваю им тип )
И считаю, что это правильно!
 
skais675,Таблица большая, хотя между столбцом № заказа и Артикул еще один столбец. Но, блин, опять я в стопоре. За неделю с этим кодом всю сооброжалку растерял. :)  
 
Цитата
Alexey74 написал:
между столбцом № заказа и Артикул еще один столбец
И кто же Вам мешал показать реальную структуру таблицы?
Из наших правил:
Цитата
2.3. Приложите файл(ы) с примером (общим весом не более 300Кб) в реальной структуре и форматах данных
 
Юрий М,Не думал, что так уже сильно затуплю и не справлюсь  со столбцами. Прикрепил файл с реальным количеством столбцов. Форматы не меняются.  
 
Поправил.
 
skais675,Спасибо огромное за помощь, но уже стыдно писать. Процесс тормозится. Внес изменения, но не пойму в чем дело. Может влиять то, что прописаны в общем коде
Set ShLogist = ThisWorkbook.Worksheets("Логистика")
Set LogistListObj = ShLogist.ListObjects("Логистика_tb")
?
 
Alexey74 пришлите файл на почту (в профиле), посмотрим.
Изменено: skais675 - 13.04.2019 17:04:28
 
Всем доброго дня. Разобрался в чем причина. Повторюсь, я не специалист в VBA, но видимо дело в том, что из формы данные выводятся в нечитаемом  для кода формате и код этого не понимает. Добавил в код перед названием формы CDbl и все пошло так как надо.
Код
Dim factor As Byte
Dim arr(), nmb, art, i As Long
arr = Range("B3:E" & Cells(Rows.Count, "B").End(xlUp).Row).Value
    nmb = CDbl(usf_____.txt_____)
    art = CDbl(usf_____.txt______)
    factor = 1
    For i = 1 To UBound(arr)
        If arr(i, 1) = nmb Then
            If arr(i, 4) = art Then
            Cells(i + 2, "J") = Cells(i + 2, "J") + usf_____.txt______.Value
            Cells(i + 2, "K") = Cells(i + 2, "K") + usf______.txt____.Value
            factor = 0
            Exit For
            End If
        End If
    Next
    If factor Then MsgBox "Не нашел позицию!" Else MsgBox "Добавил!"

Еще раз огромное всем спасибо за помощь.  
 
Alexey74 Хотите сказать, что это влияло на скорость?
Цитата
Процесс тормозится.
 
skais675,Нет. Я имел ввиду, что не получается, предложенный Вами код вставить в мой общий код так, что бы он работал как надо. В посте #11 я писал: "Макрос заработал, только пока не может найти позиции." (т.е. ошибки не выдает, но не находит позиции). Сейчас все ищет так как надо, но только если вызываешь форму на активном листе. Если нетрудно, не подскажите, что дописать, что бы код работал при вызове формы с любого листа.
 
Код
Dim factor As Byte
Dim arr(), nmb, art, i As Long
with sheets("Имя вашего листа")
arr = .Range("B3:E" & .Cells(.Rows.Count, "B").End(xlUp).Row).Value
    nmb = CDbl(usf_____.txt_____)
    art = CDbl(usf_____.txt______)
    factor = 1
    For i = 1 To UBound(arr)
        If arr(i, 1) = nmb Then
            If arr(i, 4) = art Then
            .Cells(i + 2, "J") = .Cells(i + 2, "J") + usf_____.txt______.Value
            .Cells(i + 2, "K") = .Cells(i + 2, "K") + usf______.txt____.Value
            factor = 0
            Exit For
            End If
        End If
    Next
    If factor Then MsgBox "Не нашел позицию!" Else MsgBox "Добавил!"
end with
Изменено: skais675 - 15.04.2019 16:22:18
 
skais675,Спасибо
Страницы: 1
Наверх