2009-11-19 3 views
1

J'ai écrit un complément COM Excel en C++ pour l'automatisation d'Excel avec VBA. Il contient un propre dialogue montrant quelques informations générales sur le complément. Maintenant, je crée un bouton dans Excel qui ouvre la boîte de dialogue. Si vous laissez la boîte de dialogue avec la touche d'échappement, le message Excel indique que le script est interrompu au lieu de simplement fermer la boîte de dialogue. Je pouvais supprimer le message d'interruption avec:La boîte de dialogue Excel COM Add-In interrompt le script

Application.EnableCancelKey = xlDisabled 

Mais cela ne semble pas être la solution que le script ne peut être interrompu plus.
Voici un exemple comment j'utilise VBA pour ouvrir la boîte de dialogue:

Private Sub ShowAboutDialog_Click() 
    Dim oComAddIn As COMAddIn 
    Set oComAddIn = Application.COMAddIns.Item("MyComAddIn.Example") 
    oComAddIn.Connect = True 
    Call oComAddIn.Object.ShowAboutDlg 
End Sub 

Je pense que le problème est quelque part dans le gestionnaire de messages de la boîte de dialogue:

INT_PTR CALLBACK CAboutDialog::AboutDlg(
    HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
    ... 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
     { 
      // Here, the ESCAPE key should also be trapped? 
      EndDialog(hwndDlg, LOWORD(wParam)); 
      return TRUE; 
     } 
    ... 
    } 

    return FALSE; 
} 

Le dialogue est créé avec :

DialogBox(g_hModule, MAKEINTRESOURCE(IDD_ABOUT), hWndParent, (DLGPROC)AboutDlg) 

Merci beaucoup!

Répondre

1

Les boîtes de dialogue doivent renvoyer leur état de sortie à la routine d'appel plutôt que de permettre l'arrêt de l'exécution du code. Je vous suggère de

  • convertir votre ShowAboutDlg d'un Sub() à un Function()
  • retour une constante de la VbMsgBoxResult ensemble Enum (éviter hardcoding!)
  • piège la touche ESC dans votre boîte de dialogue et retourner un VbCancel (ou VbAbort)

Bonne chance MikeD

Questions connexes