使用C#处理启用macros的Excel文件的Alert PopUp对话框

我正在尝试使用c#编辑启用macros的Excel文件。

我已经完成了编辑,并需要使用已经定义的macros[VBA – Button]来validation所有的数据。 我能够使用下面提到的代码运行macros:

workbook.Application.Run("Sheet1.validate_Click"); 

现在,问题是,每当调用macros,将validation我已经插入Excel表格中的数据,并给出如下所示的输出:

在这里输入图像说明

现在我需要点击是button编程。 这将要求保存该文件,将由该validationbutton自动创build。

在这里,我卡住了,那我怎么可能以编程方式点击是出现警报对话框的button。

请帮助我,我在这里没有线索,我search了很多,但是找不到任何符合我的目的的东西。

正如@Tom在评论中提到的那样, 真正的解决scheme是更改VBA代码。 但是由于这不是您可以使用的选项,您将不得不使用某种骇人的解决方法。 我没有做太多的testing,但是我认为你的COM Interop调用也会因为模态对话而被阻塞。

关于唯一的方法来处理从托pipe代码的VBA生成的对话框是使用win32函数轮询目标窗口,然后发送一个模拟鼠标点击时,发现。 这是我使用的类:

 public class DialogClicker { private delegate bool EnumWindowsProc(int hWnd, int lParam); private const int BM_SETSTATE = 0x00F3; private const int WM_LBUTTONDOWN = 0x0201; private const int WM_LBUTTONUP = 0x0202; [DllImport("user32.dll")] private static extern int EnumWindows(EnumWindowsProc callbackFunc, int lParam); [DllImport("user32.dll")] private static extern int EnumChildWindows(int hWnd, EnumWindowsProc callbackFunc, int lParam); [DllImport("user32.dll")] private static extern int GetWindowText(int hWnd, StringBuilder buff, int maxCount); [DllImport("user32.dll")] private static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam); private const int MsgBufferSize = 256; private bool _textFound; private int _btnhWnd; private readonly Timer _timer; public string TargetHeader { get; private set; } public string ButtonText { get; private set; } public string SearchText { get; private set; } public int TimerInterval { get; private set; } public DialogClicker(string header, string button, string search, int interval) { TargetHeader = header; ButtonText = button; SearchText = search; TimerInterval = interval; _timer = new Timer(interval); _timer.Elapsed += ElapsedHandler; } public void Toggle(bool active) { _timer.Enabled = active; } private void ElapsedHandler(object sender, ElapsedEventArgs e) { _btnhWnd = 0; _textFound = string.IsNullOrEmpty(SearchText); EnumWindows(EnumProc, 0); } private bool EnumProc(int hWnd, int lParam) { var heading = new StringBuilder(MsgBufferSize); GetWindowText(hWnd, heading, MsgBufferSize); var title = heading.ToString(); if (string.IsNullOrEmpty(title) || !title.Equals(TargetHeader)) return true; EnumChildWindows(hWnd, EnumChildProc, 0); return false; } private bool EnumChildProc(int hWnd, int lParam) { var title = new StringBuilder(MsgBufferSize); GetWindowText(hWnd, title, MsgBufferSize); var text = title.ToString(); if (string.IsNullOrEmpty(text)) return true; if (!_textFound) _textFound = text.Contains(SearchText); if (text.Equals(ButtonText)) _btnhWnd = hWnd; if (_btnhWnd <= 0 || !_textFound) return true; SendMessage(_btnhWnd, BM_SETSTATE, 1, 0); SendMessage(_btnhWnd, WM_LBUTTONDOWN, 0, 0); SendMessage(_btnhWnd, WM_LBUTTONUP, 0, 0); SendMessage(_btnhWnd, BM_SETSTATE, 1, 0); return false; } } 

调用代码:

 var clicker = new DialogClicker("Microsoft Excel", "&Yes", "No error found in sheet.", 100); clicker.Toggle(true); //Start polling. //Do whatever triggers the dialog. clicker.Toggle(false); //Stop polling.