Excel COM加载项对话框中断脚本

时间:2009-11-19 08:21:17

标签: excel add-in com excel-vba c++ vba

我在C ++中编写了一个Excel COM加载项,用于使用VBA实现Excel自动化。它包含一个自己的对话框,显示有关加载项的一些常规信息。 现在我在Excel中创建一个按钮,打开对话框。使用转义键保留对话框会导致Excel消息,即脚本正在被中断,而不是仅关闭对话框。我可以用以下方法来抑制中断消息:

Application.EnableCancelKey = xlDisabled 

但这似乎不是解决方案,因为脚本不能再被打断了 以下是我使用VBA打开对话框的示例:

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

我的猜测是问题出现在对话框的消息处理程序中:

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;
}

使用以下命令创建对话框:

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

非常感谢!

1 个答案:

答案 0 :(得分:1)

对话框应将其退出状态返回到调用例程,而不是允许终止代码执行。所以我建议你

  • 将您的ShowAboutDlgSub()转换为Function()
  • VbMsgBoxResult枚举集中返回一个常量(避免硬编码!)
  • 在对话框中捕获ESC键并返回VbCancel(或VbAbort
祝你好运 拾音