Применить больше, чем logi c, к уже отфильтрованным строкам - PullRequest
0 голосов
/ 27 мая 2020

Я применил фильтр ниже к листу Excel, который автоматически фильтрует столбец O на основе даты начала и даты окончания.

sht1.Range("$A$1:$X$3432").AutoFilter Field:=15, Criteria1:= _
        ">=" & CDbl(StartDate), Operator:=xlAnd, Criteria2:="<=" & CDbl(EndDate)

здесь я вычислил видимые отфильтрованные строки на основе даты начала и даты окончания .

With sht1
    Total_DCR = WorksheetFunction.Subtotal(102, ActiveSheet.Range("O1:O5000").Columns(1))
    Debug.Print Total_DCR
End With

Dim i, delay_count As Integer

Теперь я хочу сравнить даты, представленные в отфильтрованных столбцах O и X, для значений, превышающих logi c. Если O2> X2, увеличьте счетчик на 1.

For i = 2 To Total_DCR
    If sht1.Range("O" & i).Value > sht1.Range("X" & i).Value Then
    delay_count = delay_count + 1
    Debug.Print delay_count
End If
Next

После выполнения вышеуказанного кода сравнения счетчик дат из столбца O показывает неверные данные. Я чувствую, что он также учитывает скрытые строки. В столбце O указано 79 дат, которые находятся между датой начала и датой окончания. когда я выбираю большее, чем logi c между отфильтрованными O и X для большего, чем logi c, используя IF (O2> X2, «YES», «NO») logi c, количество строк больше чем равно 53. I хотите реализовать то же самое, используя код vba. Но я увеличиваю количество строк до 76. Я не знаю, что здесь не так. любезно помогите

Ответы [ 2 ]

0 голосов
/ 28 мая 2020
Private Sub CommandButton1_Click()

Dim F11, F22, Month, Year As Variant
  Dim f_name1, f_name2
  Dim wb1, wb2, wb3, wb4 As Workbook
  Dim sht1, sht2, sht3, sht4 As Worksheet
  Dim Total_DCR As Long
  Dim StartDate, EndDate As Date

'Select Product Backlog File
 F11 = Application.GetOpenFilename("check (*.xlsm*), *.xlsm*")
  If (F11 <> vbNullString) Then
    If (F11 <> "False") Then
      f_name1 = F11
    End If
  End If
  If (f_name1 = "") Then
    MsgBox "The check file must be specified."
    Exit Sub
  End If

Set wb1 = Excel.Workbooks.Open(f_name1)
Set sht1 = wb1.Sheets("Product Backlog")


Set wb3 = ThisWorkbook
Set sht3 = wb3.Sheets("check")
With sht3

        StartDate = sht3.Range("J3").Value
        'Debug.Print StartDate

        If IsDate(StartDate) = True Then
        MsgBox ("The following string is a valid date expression")
        Else
        'if its not a date expression show a message box
        MsgBox ("The following string is not a valid date expression")
        End If

        EndDate = sht3.Range("J4").Value
        'Debug.Print EndDate

End With

wb1.Activate
sht1.Activate
    sht1.Columns("O:O").Select
    wb1.Worksheets("Product Backlog").Sort.SortFields.Clear
    wb1.Worksheets("Product Backlog").Sort.SortFields.Add2 Key:=Range( _
        "O1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal

With wb1.Worksheets("Product Backlog").Sort
        .SetRange Range("O1:O3437")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply

End With


sht1.Range("$A$1:$X$3432").AutoFilter Field:=15, Criteria1:= _
        ">=" & CDbl(StartDate), Operator:=xlAnd, Criteria2:="<=" & CDbl(EndDate)

With sht1
    Total_DCR = WorksheetFunction.Subtotal(102, ActiveSheet.Range("O1:O5000").Columns(1))
    Debug.Print Total_DCR
End With
 Dim rng As Range, rngVisible As Range, rngRow As Range, delay_count As Double
    Set rng = Range("$A$1:$X$5000")
    '// Get visible cells excluding header
    With rng
        Set rngVisible = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    End With
    '// Must use "Cells" when dealing with "Rows" property
    For Each rngRow In rngVisible.Rows
        delay_count = delay_count + IIf(rngRow.Cells(1, "O") > rngRow.Cells(1, "X"), 1, 0)
    Next
MsgBox ("total delay DCR is" & delay_count)

End Sub

@ JohnyL это весь мой код. Чековая книжка содержит случайную дату с 2017 по 2020 год по каждому месяцу в столбце О. Точно так же в столбце X указана дата. Код должен отфильтровать их по датам февраля 2020 года, а затем сравнить даты O и X. Дата начала: 01-02-2020 Дата окончания: 20-02-2020

Для всех столбцов AX добавлен раскрывающийся список фильтров. при применении автофильтра он будет фильтровать только даты февраля 2020 года. Строка AX находится в первой строке с заголовками

@ EylM Не могли бы вы ответить на это

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

Вы можете получить видимые ячейки без заголовка:

Sub ZZZ()
    Dim rng As Range, rngVisible As Range, rngRow As Range, delay_count As Double
    Set rng = Range("$A$1:$X$3432")
    '// Get visible cells excluding header
    With rng
        Set rngVisible = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    End With
    '// Must use "Cells" when dealing with "Rows" property
    For Each rngRow In rngVisible.Rows
        delay_count = delay_count + IIf(rngRow.Cells(1, "O") > rngRow.Cells(1, "X"), 1, 0)
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...