Как использовать отфильтрованный диапазон в функции SUMIF - PullRequest
0 голосов
/ 27 мая 2019

Я хочу использовать отфильтрованный диапазон в функции SUMIF.У меня есть некоторый Именованный диапазон в моем ББ («список использования» в Sheet1 - это столбец элемента, а «аликвоты» в Sheet2 - это столбец количества, «даты» в Sheet2 - это столбец даты yyyy-mm-dd).

Эта формула в моем коде работает должным образом (т.е. суммирует количества в "аликвотах", которые имеют item=cell.Value в столбце "списка использования"):

Cells(cell.Row, "K") = Application.SumIf(Range("uselist"), cell.Value, Range("aliquotes")) 

Но теперь я хочу ограничитьсумма к тем строкам, которые имеют в столбце «даты» дату между датой, указанной в столбце «O» в Sheet1 и Now.Ячейка, в которой я работаю, находится в Sheet1.Я изменил код, но у меня есть некоторые проблемы:

Sub FilterSum()
On Error Resume Next

Dim MyRangeI As Range
Dim MyRangeO As Range
Dim cell As Range
Dim XNEWRANGE As Range
Dim wsI As Worksheet
Dim wsO As Worksheet

Set wsI = ThisWorkbook.Sheets("Sheet1")
Set wsO = ThisWorkbook.Sheets("Sheet2")

With wsI.UsedRange 'don't consider headers
    Set MyRangeI = Range(.Cells(2, 1), .Cells(1, 1).Offset(.Rows.Count - 1, .Columns.Count - 1))
    MyRangeI.Select
End With

With wsO.UsedRange 'don't consider headers
    Set MyRangeO = Range(.Cells(2, 1), .Cells(1, 1).Offset(.Rows.Count - 1, .Columns.Count - 1))
    MyRangeO.Select
End With

Application.ScreenUpdating = False

For Each cell In MyRangeI.Columns("A").Cells

MyRangeO.AutoFilter Field:=9, Criteria1:=">=" & MyRangeI.Cells(cell.Row, "O"), Operator:=xlAnd, Criteria2:="<=" & Now 'Field 9 is tha same of the Named Range "dates"

Set XNEWRANGE = MyRangeO.SpecialCells(xlCellTypeVisible)

MyRangeI.Cells(cell.Row, "K") = Application.SumIf(XNEWRANGE, MyRangeI.cell.Value, Range("aliquotes"))

Next cell

Application.ScreenUpdating = True
End Sub

По моему мнению, есть проблема с двумя различными листами, которые я хочу использовать для макроса.

1 Ответ

0 голосов
/ 27 мая 2019

Попробуйте это:

Но будьте осторожны с вашим MyRange, потому что он не объявлен в процедуре:

Option Explicit
Sub FilterSum()

    'ActiveSheet.UsedRange.Select 'avoid using select

    Dim cell As Range
    Dim XNEWRANGE As Range
    Dim ws As Worksheet 'reference your sheets to avoid using select

    Set ws = ThisWorkbook.Sheets("MySheet") 'change MySheet for your working sheet name

    Application.ScreenUpdating = False
    With ws
        For Each cell In MyRange.Columns("A") 'MyRange isn't declared or it's value given anywhere
            'Add your filters first
            .Range("dates").AutoFilter Field:=1, Criteria1:=">=" & Cells(cell.Row, "O"), Operator:=xlAnd, Criteria2:="<=" & Now
            'Set your range using the visible cells from A2 to last row visible on column A
            Set XNEWRANGE = .Range("A2", .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)).SpecialCells(xlCellTypeVisible)
            .Cells(cell.Row, "K") = Application.SumIf(XNEWRANGE, cell.Value, Range("aliquotes"))
        Next cell
    End With
    Application.ScreenUpdating = True

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...