首頁 >後端開發 >C++ >您可以在不傳回 Excel 中的陣列的情況下修改 UDF 中的儲存格嗎?

您可以在不傳回 Excel 中的陣列的情況下修改 UDF 中的儲存格嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-16 18:05:05352瀏覽

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