请忽略我的前两个问题: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
但这会替换之前设置的每个旧日期。这似乎不是您想要做的事情。
您可以添加一个条件,以检查日期是否已经存在,例如更改为if
或If 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