我是VBA的新手,我编写了一个代码,该代码从报表X获取开始和停止日期,并从报表Y检索数据,报表Y的日期介于开始和停止日期之间。 (例如,2018年6月18日>数据报表Y <2018年7月5日)。
问题来了: 我的VBA代码无法正常运行,因为它在if-else语句中告诉我2018年6月18日大于2018年7月5日,这不能成立。我曾尝试格式化日期,但仍然无法使用。
Sub calculateCompliance()
n = 0
' calculate for screening
For i = 1 To 500
If Worksheets("Sheet1").Cells(i, 6) > Worksheets("Sheet2").Range("E5") _
And Worksheets("Sheet1").Cells(i, 6) < Worksheets("Sheet2").Range("F5") _
Then
n = n + 1
End If
Next i
Worksheets("Sheet2").Range("E6").Value = n
End Sub
编辑:通过添加变量声明,即“将dim startdate作为Date”,错误已得到解决。这确实是因为单元格格式不同。非常感谢!
答案 0 :(得分:2)
不要依赖代码中的单元格类型。让我们拉入这些值,并强制VBA将其强制为Date值。然后进行比较。
这对您有用吗?
Sub calculateCompliance()
Dim thisDate As Date
Dim startDate As Date
Dim endDate As Date
startDate = Worksheets("Sheet2").Range("E5")
endDate = Worksheets("Sheet2").Range("F5")
Dim n As Integer
n = 0
' calculate for screening
Dim i As Integer
For i = 1 To 500
thisDate = Worksheets("Sheet1").Cells(i, 6)
If thisDate > startDate And thisDate < endDate Then
n = n + 1
End If
Next i
Worksheets("Sheet2").Range("E6").Value = n
End Sub
答案 1 :(得分:0)
我认为问题在于您的比较。如果Worksheets("Sheet1").Cells(i, 6)
包含2018年6月18日,则IF 18 Jun 2018 > 18 Jun 2018 AND 18 Jun 2018 < 05 Jul 2018 THEN
的计算结果为false,不是因为它大于2018年7月5日,而是因为6月18日不大于6月18日。如果您希望18 Jun满足您条件,那么您应该将其设为>=
。
所以
If Worksheets("Sheet1").Cells(i, 6) > Worksheets("Sheet2").Range("E5")
将更改为
If Worksheets("Sheet1").Cells(i, 6) >= Worksheets("Sheet2").Range("E5")
或者合并@hackslash答案(我同意,最好在VBA代码中控制您的数据,而不是将其拉入公式并希望它们匹配),您将更改
If thisDate > startDate
到
If thisDate >= startDate