Страницы: 1
RSS
Удаление строк с отрицательным значением
 
Добрый день, есть список позиций и их количества на листе А, позиции повторяются с разным количеством (консолидировать его нельзя), также есть консолидированный список во вкладке В, нужно его "прогнать" по списку А, и если разница между количество на листе А и В будет отрицательная или равно 0, удалить полностью строки с данным партномером. В результате должны остаться только партномера с положительной разницей и те, которых нет в списке В.
В приложении файл, где формулами высчитана разница, в макрос, может это не самое оптимальное решение, но я думала занести формулы для правильного подтягивания количества с листа В, но вот как решить задачу с удалением строк с партномера, где нулева и отрицательная разница, я пока не знаю. Помогите пожалуйста, написать макрос, который бы справлялся с этой задачей.


Большое спасибо!
Изменено: nomad_a - 23.04.2024 09:31:30
 
nomad_a,
Код
Sub aaaaaaaabbb()
    Dim arr()
    Dim i As Long
    Dim q As Variant
    Dim matchFound As Boolean
    Dim numColumns As Long

    lLastRowA = Sheets("A").Cells(Rows.Count, 1).End(xlUp).Row
    lLastRowB = Sheets("B").Cells(Rows.Count, 1).End(xlUp).Row
    Set rngA = Sheets("A").Range("A2:C" & lLastRowA)
    Set rngB = Sheets("B").Range("A2:C" & lLastRowB)
    numColumns = rngA.Columns.Count
    
    ReDim arr(1 To lLastRowA, 1 To numColumns)
    
    For rA = 1 To rngA.Rows.Count
        matchFound = False
        For rB = 1 To rngB.Rows.Count
            If rngA(rA, 1) = q Then
                Exit For
            End If
            If rngA(rA, 1) = rngB(rB, 1) Then
                If rngA(rA, 3) - rngB(rB, 2) > 0 Then
                q = rngA(rA, 1)
                    Exit For
                End If
                matchFound = True
                Exit For
            End If
        Next rB
        
        If Not matchFound Then
            i = i + 1
            For j = 1 To numColumns
                arr(i, j) = rngA(rA, j)
            Next j
        End If
    Next rA
    
        Sheets("A").Range("A2:C" & lLastRowA).ClearContents
        Sheets("A").Range("A2").Resize(i, 3).Value = arr
End Sub
 
evgeniygeo, Спасибо большое за код! Но есть нюанс, при вычислении разницы между общим количеством каждого партномера на листе А и В, например было 8, надо отнять 5, остается 3, то в результате на листе А должно остаться только 3 строки с данным партномер, если там по 1 шт на строку.  
 
nomad_a,
а "Total qty per pn" тоже должен пересчитаться?
как быть с теми "qty", где >1?
какое у этого "чуда" применение?
Изменено: evgeniygeo - 27.04.2024 09:19:27
 
evgeniygeo,
какое у этого "чуда" применение? -  изначально нужен был для корректной работы впр при подтягивании партномеров и количества с листа В, чтобы не от каждого вхождения партномера с листа А отнималось количество с листа В, а только один раз от общего количества данного партномера общее количество требуемое во вкладке В.
как быть с теми "qty", где >1? - значит надо "Total qty per pn" пересчитывать и оставлять соответвующее количество строк
Страницы: 1
Наверх