我正在为自己和同事制作一份工作登记表。在我创建的这个工作簿中,我们有一定数量的空闲天数可以使用,但我们需要在某个日期之前使用这些空闲天数。如果我们不使用这些空闲天数,它们就会消失。所以我需要创建一个代码,如果在截止日期之前没有用完这些空闲天数,它将自动删除这些空闲天数。但这也需要在打开文件和多张工作表时发生,例如:
我有一个单元格 A1,其中显示 240:00 小时,我想使用第二个单元格 A2,其中显示一年零 180 天后的日期,并且如果单元格 A1 中仍有值,它将更改为 0:00。
我需要它在不同的单元格和不同的时间上工作,因为有些空闲日会在一年零 180 天后过去,有些空闲日会在五年后过去。
我知道如何在 VBA 中输入代码并创建宏,但我不知道如何为 VBA 编写代码,只能稍微调整一下
答案1
我希望你意识到单元格(以及它们包含的公式和函数)不能调整其他细胞。细胞可以展示误导性价值观;例如,你可以有存储在工作表中的非零值,但显示为“0”或空白。VBA能修改单元格。
根据您对情况的描述,我假设您实际上想要删除“空闲天数”的值,因此您需要 VBA。
您说您希望它同时在多个单元格上工作,但您没有说明如何指定它们。我认为在 VBA 源代码中硬编码单元格列表是可以的。如果您需要其他方法,请编辑您的问题以指定它。
创建以下 VBA 例程。使用如何在 MS Office 中添加 VBA?以供参考。更改cell_list
值以列出包含“空闲天数”值的单元格。
Sub auto_delete()
Dim cell_list, this_cell As String
Dim i As Integer
Dim today_date As Date
today_date = Date
cell_list = "A1,B1"
For i = 0 To UBound(Split(cell_list, ","))
this_cell = Split(cell_list, ",")(i)
On Error Resume Next
If Range(this_cell) Is Nothing Then
MsgBox this_cell + " is not a valid cell designation."
Exit For
End If
On Error GoTo 0
If Range(this_cell).Count <> 1 Then
MsgBox this_cell + " appears to be a range. Please specify individual cells only."
Exit For
End If
If Range(this_cell).Cells(2, 1).Value < today_date Then
' in the past
Range(this_cell).Cells(1, 1).Value = ""
End If
Next
End Sub
笔记:
- 设置
cell_list
为逗号分隔的字符串是指定值列表的一种有点笨拙的方法。但显然我的 VBA 版本已经过时了;我尝试了更简洁(更现代?)的技术,但没有奏效。 Split(cell_list, ",")
它的作用正如它看起来的那样 — — 将其拆分cell_list
成组成词,使用逗号作为分隔符,并创建一个值数组。UBound(Split(cell_list, ","))
给出数组中的最高(上界)索引。(这比值的数量少一,因为索引从 0 开始。)For i = 0 To (the_above)
循环遍历数组中的值。Split(cell_list, ",")(i)
索引到数组并返回i
第值。- 我需要使用
On Error Resume Next
并On Error GoTo 0
测试无效的单元格引用;我不确定为什么。 Range(this_cell).Cells(2, 1).Value
指的是当前单元格下方的单元格。例如,如果this_cell
是A1
,则这指的是A2
,其中到期日期是。
我相信其余部分是不言而喻的。
前:
后:
手动或自动调用上述例程;以更适合您的需要为准。