我已经将下面的筛选器应用于一个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中的日期是否大于logic.If 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个日期介于开始日期和结束日期之间。当我使用IF(O2>X2,"YES","NO")逻辑在过滤的O和X之间选择大于逻辑时,大于行数为53。我想使用vba代码实现相同的功能。但是我的行数超过了76行。我不知道这里出了什么问题。热心的帮助
发布于 2020-05-28 01:50:53
您可以获得没有标题的可见单元格:
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发布于 2020-05-28 19:46:09
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年的随机日期,按照列O中的每个月。同样,列X也包含日期。代码必须将它们过滤为2020年2月日期,然后在O和X日期之间进行比较。开始日期:01-02-2020结束日期:20-02-2020
所有的A-X列都添加了过滤器下拉菜单。当应用自动筛选时,它将仅筛选2020年2月的日期。A-X行位于第一行,具有标题
@EylM你介意回答这个问题吗
https://stackoverflow.com/questions/62040677
复制相似问题