Heim >Backend-Entwicklung >C++ >Können Sie Zellen aus einer UDF ändern, ohne ein Array in Excel zurückzugeben?

Können Sie Zellen aus einer UDF ändern, ohne ein Array in Excel zurückzugeben?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-16 18:05:05355Durchsuche

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

Erstellen einer UDF, die andere Zellen ändert, ohne ein Array zurückzugeben

Sie haben ein Excel-Add-In mit einer Funktion namens New_Years, die derzeit zurückgibt eine Reihe von Neujahrstagen zwischen zwei angegebenen Jahren. Dazu müssen Sie jedoch mehrere Zellen auswählen und die Strg-Umschalt-Eingabetaste verwenden, um das Array zu erstellen.

Ist es möglich, die Array-Erstellung zu vermeiden?

Ja, das ist möglich um andere Zellen direkt aus einer UDF zu ändern, ohne ein Array zurückzugeben. Während Excel UDFs verbietet, Änderungen an Zelleigenschaften vorzunehmen, gibt es eine komplexe Lösung, die die Verwendung einer Kombination aus Windows-Timern und Application.OnTime-Timern beinhaltet.

Lösungsübersicht

  1. Erstellen Sie einen Windows-Timer innerhalb der UDF.
  2. Der Windows-Timer plant eine Application.OnTime Timer.
  3. Der Application.OnTime-Timer führt sicher Code außerhalb der UDF aus.

Code-Implementierung

Der folgende Code muss eingefügt werden ein reguläres Modul:

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

Timer Routinen

Es sind zwei Timer-Routinen definiert: AfterUDFRoutine1 und AfterUDFRoutine2. Sie kümmern sich um die Planung und Ausführung von Code außerhalb der UDF.

Beispielverwendung

Geben Sie in Ihrem Excel-Arbeitsblatt die AddTwoNumbers-Funktion in eine Zelle ein: =AddTwoNumbers(A1, B1)

Dadurch wird der Timer gestartet verarbeiten.

Wichtige Hinweise

  • Machen Sie die UDF nicht flüchtig und übergeben Sie ihr keine flüchtigen Funktionen/Zellen, um unkontrollierte Schleifen zu vermeiden.
  • Die Lösung ist komplex und möglicherweise nicht für alle Anwendungen geeignet.

Das obige ist der detaillierte Inhalt vonKönnen Sie Zellen aus einer UDF ändern, ohne ein Array in Excel zurückzugeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn