Excel 2013 VBScript Range()。值不会更新

时间:2014-12-07 16:59:06

标签: excel vba excel-vba

我想要实现的是在更改另一个单元格时更新某些单元格。

我希望能够看到第一次更改单元格的时间,以便我可以检查日常例程是否在正确的日期实际打入日志表。

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之前看看是否有帮助,因为我必须在本文档中使用工作表。

表格中的不同单元格:

  • Cell B177;是执行例程的人的签名字段 四处走走。
  • Cell B178; = UDF_Signature(B177; “B179”, “B180”, “B181”)
  • Cell B179;应使用签名单元格第一次更改的日期进行更新
  • Cell B180;应该使用上次更新签名单元格的日期进行更新。
  • Cell B181;签名字段的更改次数。 (还要检查是否需要更新第一个更改的单元格)

2 个答案:

答案 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_ChangeWorksheet_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