Partager via


Procédure : appeler des fonctions XLL à partir de l’Assistant Fonction ou des boîtes de dialogue Remplacer (traduction automatique)

Dernière modification : vendredi 13 mars 2009

S’applique à : Excel 2010 | Office 2010 | VBA | Visual Studio

Important

Cet article a été traduit automatiquement, voir l’avertissement. Vous pouvez consulter la version en anglais de cet article ici.

Microsoft Excel appelle généralement des fonctions XLL durant le recalcul normal du classeur, ou d’une partie du classeur si le calcul est sous le contrôle d’une macro. Souvenez-vous que la fonction peut ne pas résider dans une formule de cellule mais faire partie de la définition d’une plage nommée ou d’une expression de mise en forme conditionnelle.

Il existe deux cas où une fonction peut être appelée à partir d'une boîte de dialogue d'Excel. L'une est la boîte de dialogue Coller des arguments de fonction , où les utilisateurs sont en mesure de construire un argument d'un appel de fonction à la fois. L'autre est lorsque les formules sont modifiés et réentrées par Excel via la boîte de dialogue Remplacer . Pour la boîte de dialogue Coller des arguments de fonction , vous pourriez pas votre fonction à exécuter normalement. Cela peut être dans la mesure où les exécuter beaucoup de temps et vous ne souhaitez pas ralentir l'utilisation de la boîte de dialogue.

La boîte de dialogue Coller une fonction et la boîte de dialogue Remplacer ont la classe nom bosa_sdm_XL de Windowsn, où n est un nombre. Windows fournit une fonction API, GetClassName, qui obtient ce nom à partir d'un handle Windows, un type de variable HWND. Il fournit également une autre fonction, EnumWindows, qui appelle une fonction de rappel fournie (au sein de votre DLL) une fois pour chaque fenêtre de niveau supérieur qui est actuellement ouvert.

La fonction de rappel doit effectuer les étapes suivantes uniquement :

  1. Vérifiez si le parent de cette fenêtre est l'instance actuelle de Microsoft Excel (au cas où il y a plusieurs instances en cours d'exécution).

  2. Obtenir le nom de classe à partir du handle passé par Windows.

  3. Vérifiez si le nom de classe est de la bosa_sdm_XL formulairen.

  4. Si vous devez faire la distinction entre les deux boîtes de dialogue, vérifiez si le titre de la boîte de dialogue contient du texte d'identification. Titre de la fenêtre est obtenu à l'aide de la GetWindowText appel API Windows.

Le code C++ suivant illustre une classe et un rappel à passer à Windows qui effectue ces étapes. Il s'agit par les fonctions de ce test d'appel spécifiquement pour une des boîtes de dialogue concernées.

Notes

Titres de fenêtres de futures versions d'Excel peuvent modifier et annuler ce code. Notez également que la définition de window_title_text à NULL a pour effet d'ignorer le titre de fenêtre dans la recherche de rappel.

#define CLASS_NAME_BUFFSIZE  50
#define WINDOW_TEXT_BUFFSIZE  50

// Data structure used as input to xldlg_enum_proc(), called by
// called_from_paste_fn_dlg(), called_from_replace_dlg(), and
// called_from_Excel_dlg(). These functions tell the caller whether
// the current worksheet function was called from one or either of
// these dialog boxes.

typedef struct
{
  bool is_dlg;
  short low_hwnd;
  char *window_title_text; // set to NULL if don't care
}
  xldlg_enum_struct;

// The callback function called by Windows for every top-level window.
BOOL CALLBACK xldlg_enum_proc(HWND hwnd, xldlg_enum_struct *p_enum)
{
// Check if the parent window is Excel.
  if(LOWORD((DWORD)GetParent(hwnd)) != p_enum->low_hwnd)
    return TRUE; // keep iterating

  char class_name[CLASS_NAME_BUFFSIZE + 1];
//  Ensure that class_name is always null terminated for safety.
  class_name[CLASS_NAME_BUFFSIZE] = 0;

  GetClassName(hwnd, class_name, CLASS_NAME_BUFFSIZE);

//  Do a case-insensitve comparison for the Excel dialog window
//  class name with the Excel version number truncated.
  size_t len; // The length of the window's title text
  if(_strnicmp(class_name, "bosa_sdm_xl", 11) == 0)
  {
// Check if a searching for a specific title string
    if(p_enum->window_title_text) 
    {
// Get the window's title and see if it matches the given text.
      char buffer[WINDOW_TEXT_BUFFSIZE + 1];
      buffer[WINDOW_TEXT_BUFFSIZE] = 0;
      len = GetWindowText(hwnd, buffer, WINDOW_TEXT_BUFFSIZE);
      if(len == 0) // No title
      {
        if(p_enum->window_title_text[0] != 0)
          return TRUE; // No match, so keep iterating
      }
// Window has a title so do a case-insensitive comparison of the
// title and the search text, if provided.
      else if(p_enum->window_title_text[0] != 0
      && _stricmp(buffer, p_enum->window_title_text) != 0)
        return TRUE; // Keep iterating
    }
    p_enum->is_dlg = true;
    return FALSE; // Tells Windows to stop iterating.
  }
  return TRUE; // Tells Windows to continue iterating.
}

La boîte de dialogue Coller une fonction n'a pas de titre, afin que la fonction suivante transmet une chaîne de recherche de titre de "", c'est-à-dire une chaîne vide, le rappel pour indiquer que la condition de correspondance est que la fenêtre ne doit pas comporter un titre.

bool called_from_paste_fn_dlg(void)
{
    XLOPER xHwnd;
// Calls Excel4, which only returns the low part of the Excel
// main window handle. This is OK for the search however.
    if(Excel4(xlGetHwnd, &xHwnd, 0))
        return false; // Couldn't get it, so assume not

// Search for bosa_sdm_xl* dialog box with no title string.
    xldlg_enum_struct es = {FALSE, xHwnd.val.w, ""};
    EnumWindows((WNDENUMPROC)xldlg_enum_proc, (LPARAM)&es);
    return es.is_dlg;
}

Notes

Avertissement traduction automatique : cet article a été traduit par un ordinateur, sans intervention humaine. Microsoft propose cette traduction automatique pour offrir aux personnes ne maîtrisant pas l’anglais l’accès au contenu relatif aux produits, services et technologies Microsoft. Comme cet article a été traduit automatiquement, il risque de contenir des erreurs de grammaire, de syntaxe ou de terminologie.

Voir aussi

Concepts

Accès au code XLL dans Excel (traduction automatique)

Appel dans Excel à partir de DLL ou XLL (traduction automatique)

Développement de XLL Excel 2010 (traduction automatique)