用“ cell.value <Date(now())”填充列表框

时间:2018-10-14 11:06:44

标签: excel vba

制作起来应该很简单,但是不起作用。我的日期数据列表中的第6列的格式为“ mmm.yyyy”。

我总是列表中的所有行,但我只希望那些日期早于今天的行。

只有语句的一部分And ws.Cells(i, 6).Value <> vbNullString

Sub PopulateList2()
  Dim rngName As Range
  Dim ws As Worksheet
  Dim i As Integer
  Dim LastRow As Long

  Set ws = E1G



AbgeListField.Clear
AbgeListField.ColumnCount = 2

LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row

For i = 1 To LastRow

  'If statement to get Cells(i, 6).value and check it with Date(now).

  If Format(Cells(i, 6), "mmm.yyyy").Value < Format(Now(), "mmm.yyyy") _
  And ws.Cells(i, 6).Value <> vbNullString Then
    AbgeListField.AddItem ws.Cells(i, 1).Value
    AbgeListField.List(i - 1, 1) = ws.Cells(i, 2).Value
    AbgeListField.List(i - 1, 2) = ws.Cells(i, 3).Value
  End If
 Next i
End Sub

1 个答案:

答案 0 :(得分:1)

格式与值

也许我误解了,但是这段代码应该可以正常工作:

If ws.Cells(i, 6).Value < Now() _
    And ws.cells(i, 6).value <> vbNullString Then

它不能与format一起使用,因为format将值转换为字符串。然后,您将不得不使用CDate转换功能将其恢复为日期,但是当您已有日期时,它的用途是什么。

有三种返回或设置单元格值的方法,例如

让我们在2018年10月3日在“ A1”单元格中使用

Cells(“ A1”)。Value返回'3.10.2018'(可能因系统设置而异)
Cells(“ A1”)。Value2返回'43376'
Cells(“ A1”)。文本在您的示例“ 2018年10月”中返回

如果您使用“值”,则无论使用哪种格式,都将始终使用“值”,而不是“文本”。

如果您迷路了,可以随时将Now()和ws.Cells(i,6).Value转换为双精度类型,以确保对数字进行比较:

If CDbl(ws.Cells(i, 6).Value) < CDbl(Now()) _
    And ws.cells(i, 6).Value <> vbNullString Then