根据单元格值 vba 显示当前日期

根据单元格值 vba 显示当前日期

请忽略我的前两个问题:D 我已经找到解决方案了

但这个对我来说有点难,因为我不擅长宏,特别是它的条件函数。

我的宏有这个条件代码,我不知道如果单元格值等于完毕

If Range("I5:I1222") = "Done" Then
    With Range("K5:K1222, M5:M1222")
        .Value = Date
        .NumberFormat = "m/d/yyyy"
    End With
End If

我有一个包含以下内容的下拉列表

Done
Cancelled
Ongoing

如果用户选择完成,当前日期将显示在两个单元格上(col I 和 col M)

答案1

您无法执行此操作Range("I5:I1222") = "Done",因为当您尝试运行它时程序会告诉您。

似乎您想检查列表的单元格,因此您应该使用Range().value
假设您的下拉列表处于打开状态I5,那么您可以使用If Range("I5").value = "Done" Then

但是这将打印日期 2500 次,这似乎不是您想要的。

我最好的猜测是,每行都有一个下拉菜单,您想检查它们,并在当前行上打印日期。

要做到这一点,您必须循环遍历范围I5:I1222并检查每个值,例如:

Dim listR As Range, cell As Range
Set listR = Range("I5:I1222")
For Each cell In listR
  If cell.Value2 = "Done" Then
    With Application.Union(Range(cell.Address).Offset(0, 2), Range(cell.Address).Offset(0, 4))
        .Value2 = Date
        .NumberFormat = "m/d/yyyy"
    End With
  End If
Next cell

但这会替换之前设置的每个旧日期。这似乎不是您想要做的事情。
您可以添加一个条件,以检查日期是否已经存在,例如更改为ifIf cell.Value2 = "Done" And Range(cell.Address).Offset(0, 2) = "" Then类似。

您还可以将该子事件作为 worksheet_change 事件调用,这样它就可以在您从下拉菜单中选择“完成”时添加日期,并且只写入特定行。

可以通过将代码直接放在工作表上而不是放在模块中来实现:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range(Target.Address), Range("I5:I1222")) Is Nothing Then
    If Target.Value2 = "Done" Then
        With Application.Union(Range(Target.Address).Offset(0, 2), Range(Target.Address).Offset(0, 4))
            .Value2 = Date
            .NumberFormat = "m/d/yyyy"
        End With
    End If
End If
End Sub

相关内容