首页 >后端开发 >C++ >您可以在不返回 Excel 中的数组的情况下修改 UDF 中的单元格吗?

您可以在不返回 Excel 中的数组的情况下修改 UDF 中的单元格吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-16 18:05:05355浏览

Can You Modify Cells from a UDF Without Returning an Array in Excel?

创建修改其他单元格而不返回数组的 UDF

您有一个 Excel 加载项,其中包含一个名为 New_Years 的函数,该函数当前返回两个指定年份之间的元旦数组。但是,这需要您选择多个单元格并使用 Ctrl Shift Enter 创建数组。

是否可以避免数组创建?

是的,可以直接从 UDF 修改其他单元格而不返回数组。虽然 Excel 禁止 UDF 对单元格属性进行任何更改,但有一个复杂的解决方案,涉及使用 Windows 计时器和 Application.OnTime 计时器的组合。

解决方案概述

  1. 在 UDF 内创建 Windows 计时器。
  2. Windows 计时器调度 Application.OnTime 计时器。
  3. Application.OnTime 计时器安全地执行 UDF 外部的代码。

代码实现

以下代码必须放置在常规模块中:

Private Declare Function SetTimer Lib "user32" ( _
      ByVal HWnd As Long, _
      ByVal nIDEvent As Long, _
      ByVal uElapse As Long, _
      ByVal lpTimerFunc As Long _
   ) As Long

Private Declare Function KillTimer Lib "user32" ( _
      ByVal HWnd As Long, _
      ByVal nIDEvent As Long _
   ) As Long

Private mCalculatedCells As Collection
Private mWindowsTimerID As Long
Private mApplicationTimerTime As Date

Public Function AddTwoNumbers( _
      ByVal Value1 As Double, _
      ByVal Value2 As Double _
   ) As Double

   AddTwoNumbers = Value1 + Value2

   ' Cache the caller's reference for later use in a non-UDF routine
   If mCalculatedCells Is Nothing Then Set mCalculatedCells = New Collection
   On Error Resume Next
   mCalculatedCells.Add Application.Caller, Application.Caller.Address
   On Error GoTo 0

   ' Set the Windows timer
   If mWindowsTimerID <> 0 Then KillTimer 0&, mWindowsTimerID
   mWindowsTimerID = SetTimer(0&, 0&, 1, AddressOf AfterUDFRoutine1)

End Function

定时器例程

定义了两个定时器例程:AfterUDFRoutine1 和 AfterUDFRoutine2。它们处理 UDF 外部代码的调度和执行。

用法示例

在 Excel 工作表的单元格中输入 AddTwoNumbers 函数:=AddTwoNumbers(A1, B1)

这将启动计时器进程。

重要说明

  • 不要使 UDF 易失性或传递易失性函数/单元以避免不受控制的循环。
  • 该解决方案很复杂,可能并不适合所有应用程序。

以上是您可以在不返回 Excel 中的数组的情况下修改 UDF 中的单元格吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn