gpt4 book ai didi

c# - 使用 C# 处理启用宏的 Excel 文件的警报弹出对话框

转载 作者:行者123 更新时间:2023-11-30 14:49:29 28 4
gpt4 key购买 nike

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

我已完成编辑,需要使用已定义的宏 [VBA - 按钮] 验证所有数据。我可以使用下面提到的代码运行宏:

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

现在,问题是,无论何时调用宏都会验证我在 Excel 工作表中插入的数据并给出如下所示的输出:

enter image description here

现在我需要以编程方式单击"is"按钮。这将要求保存该文件,该文件将由该验证按钮自动创建。

我被卡住了,我怎么能以编程方式点击出现的警报对话框的是按钮。

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

最佳答案

正如@Tom 在评论中提到的,真正的 解决方案是更改 VBA 代码。但由于这不是您可以使用的选项,您将不得不使用某种 hackish 解决方法。我没有做太多测试,但我假设您的 COM Interop 调用也由于模式对话框而阻塞。

关于处理由 VBA 从托管代码生成的对话框,我想出的唯一方法是使用 win32 函数轮询目标窗口,然后在找到时发送模拟鼠标单击。这是我使用的类(class):

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.

关于c# - 使用 C# 处理启用宏的 Excel 文件的警报弹出对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588994/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com