我想要实现的是在更改另一个单元格时更新某些单元格。
我希望能够看到第一次更改单元格的时间,以便我可以检查日常例程是否在正确的日期实际打入日志表。
Public Function UDF_Signature(ByVal data, ByVal first, ByVal updated, ByVal update_times) As Date
If Range(update_times).Value = 0 Then
Range(update_times).Value = "1"
Range(first).Value = Now()
Range(updated).Value = Now()
Else
Range(update_times).Value = Range(update_times).Value + 1
Range(updated).Value = Now()
End If
UDF_Signature = Now()
End Function
我试图调试它,当我将鼠标悬停在不同的代码行上时,我看到了正确的信息,但是当它出现在Then之后的第一行时,它会停止,没有错误,只是停止。 (或者此行后的断点不起作用......)
我还尝试添加工作表(“每日”)。在Range之前看看是否有帮助,因为我必须在本文档中使用工作表。
表格中的不同单元格:
答案 0 :(得分:0)
从工作表公式调用的UDF无法更新工作簿 - 这是对Excel中UDF的限制。
https://support.microsoft.com/KB/170787?wa=wsignin1.0
工作表单元格中的公式调用的用户定义函数不能 更改Microsoft Excel的环境。这意味着这样的 功能不能执行以下任何操作:
- Insert, delete, or format cells on the spreadsheet. - Change another cell's value. - Move, rename, delete, or add sheets to a workbook. - Change any of the environment options, such as calculation mode or screen views. - Add names to a workbook. - Set properties or execute most methods.
目的 用户定义的函数是允许用户创建自定义 功能未包含在附带的功能中 Microsoft Excel。 Microsoft Excel中包含的功能也不能 改变环境。函数可以执行计算 将值或文本返回到输入它们的单元格。 任何环境变化都应该通过使用Visual来实现 基本子程序。
在计算过程中,Excel会检查单元格的先例 包含用户定义的函数。如果不是所有的先例都是 计算过程中到目前为止计算,Excel最终 调用用户定义的函数并将Null或Empty单元格传递给 功能。 Excel然后确保发生足够的计算过程 对于所有先例都要计算。在最后的计算中 传递,用户定义的函数传递的当前值 细胞。这可能导致更多地调用用户定义的函数 经常超出预期,并有意想不到的论点。因此, 用户定义的函数可能会返回意外的值。
您最好的选择可能是使用WorkSheet_Change
或Worksheet_Calculate
事件
答案 1 :(得分:0)
请尝试以下方法,而不是您正在使用的方法。
1)在标准代码模块中,声明一个布尔公共变量和一个Integer公共变量,即
Public cellUsed As Boolean
Public changeCount As Integer
2)使用工作簿打开事件强制变量默认值
Private Sub Workbook_Open()
cellUsed = False
changeCount = 0
End Sub
3)使用工作表更改事件捕获输入并根据需要更改单元格。 e.g。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$177" Then 'The cell we are evaluating
Application.EnableEvents = False 'Prevent possibility of infinite loop
On Error GoTo Just_Incase: 'Make sure events are re-enabled in the case of an error
If Not cellUsed Then ' Signature hasn't been updated since the workbook opened
Range("B179").Value = Now ' Timestamp in B179
cellUsed = True ' Update public variable, cell has now changed.
End If
Range("B180").Value = Now ' Timestamp in B180
Range("B181").Value = changeCount
changeCount = changeCount + 1
Application.EnableEvents = True ' Re-enable events
On Error GoTo 0 'Reset error handling to default
End If
Exit Sub
Just_Incase:
Application.EnableEvents = True
End Sub