Maison >développement back-end >C++ >Pouvez-vous modifier des cellules à partir d'une UDF sans renvoyer un tableau dans Excel ?

Pouvez-vous modifier des cellules à partir d'une UDF sans renvoyer un tableau dans Excel ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-16 18:05:05354parcourir

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

Création d'une FDU qui modifie d'autres cellules sans renvoyer de tableau

Vous disposez d'un complément Excel avec une fonction appelée New_Years qui renvoie actuellement un tableau de jours du Nouvel An entre deux années spécifiées. Cependant, cela nécessite que vous sélectionniez plusieurs cellules et que vous utilisiez Ctrl Shift Enter pour créer le tableau.

Est-il possible d'éviter la création d'un tableau ?

Oui, c'est possible pour modifier d'autres cellules directement à partir d'une UDF sans renvoyer de tableau. Bien qu'Excel interdise aux UDF d'apporter des modifications aux propriétés des cellules, il existe une solution complexe qui implique l'utilisation d'une combinaison de minuteries Windows et de minuteries Application.OnTime.

Présentation de la solution

  1. Créez un minuteur Windows dans l'UDF.
  2. Le minuteur Windows planifie un minuteur Application.OnTime.
  3. Le minuteur Application.OnTime exécute en toute sécurité le code en dehors de l'UDF.

Implémentation du code

Le code suivant doit être placé dans un module régulier :

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

Routines de minuterie

Deux routines de minuterie sont définies : AfterUDFRoutine1 et AfterUDFRoutine2. Ils gèrent la planification et l'exécution du code en dehors de l'UDF.

Exemple d'utilisation

Dans votre feuille de calcul Excel, saisissez la fonction AddTwoNumbers dans une cellule : =AddTwoNumbers(A1, B1)

Cela lancera le processus de minuterie.

Remarques importantes

  • Ne rendez pas l'UDF volatile et ne transmettez pas de fonctions/cellules volatiles pour éviter une boucle incontrôlée.
  • La solution est complexe et peut ne pas convenir à toutes les applications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn