2014-12-07 72 views
0

我试图实现的是当另一个单元格更改时有一些单元格更新。Excel 2013 VBScript范围()。值不更新

我希望这能够看到什么时候一个单元格被改变,所以我可以检查一个日常例程是否在正确的日子被实际打入日志表中。

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 

我试图调试它,当我将鼠标悬停在不同的代码行,我看到了正确的信息,但随后后,当涉及到第一行,否则它停止,没有错误,只是停止。 (或者我的断点在此行之后不起作用...)

我也尝试添加工作表(“每日”)。在Range前面查看是否有帮助,因为我必须在本文档中使用Worksheets。

的不同小区中的片材:

  • 细胞B177;是执行例程 四处走动的人员的签名字段。
  • Cell B178; = UDF_Signature(B177;“B179”;“B180”;“B181”)
  • Cell B179;应该用签名单元格上的第一次更改的日期进行更新
  • 单元格B180;应该根据签名单元最后一次更新的日期进行更新。
  • Cell B181;对签名字段的更改数量。 (还要检查是否需要更新第一个更改的单元格)
+0

从工作表公式调用的UDF无法更新工作簿 - 这是UDF对Excel中的限制。 – 2014-12-07 20:47:07

回答

0

相反,你正在使用的方法,请尝试以下。

1)在标准代码模块,声明一个布尔公共变量和一个整数公共变量,即

Public cellUsed As Boolean 
Public changeCount As Integer 

2)使用工作簿打开事件迫使变量的缺省值

Private Sub Workbook_Open() 
cellUsed = False 
changeCount = 0 
End Sub 

3)使用工作表更改事件来捕获输入并根据需要更改单元格。例如

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 
+0

感谢您指出正确的方向@ s-o!它的工作原理就像我希望它现在能够工作:) – 2015-01-11 16:40:26

0

从工作表公式中调用的UDF无法更新工作簿 - 这是UDF对Excel中的限制。

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 Basic Basic子例程进行。

在计算过程中,Excel会检查 包含用户定义函数的单元格的先例。如果在计算过程中迄今为止计算出的所有先例都不是 ,则Excel最终将调用用户定义的函数并将空或空单元传递给函数 函数。然后,Excel会确保为所有要计算的先例发生足够的计算过程 。在最终计算 通过期间,用户定义的函数将传递 单元格的当前值。这可能会导致用户定义的函数被调用的次数比预期的要多,并且带有意外的参数。因此,用户定义的函数可能会返回意外的值 。

你最好的选择可能是请使用WorkSheet_ChangeWorksheet_Calculate事件