1

为了阻止“评论”回复的风暴,这是我的情况:

我有一个过程通常运行 1 次迭代 1 次迭代。用户手动点击一个调用宏的按钮,该宏在完成后会弹出一个消息框,报告宏运行的总时间长度。这对于诊断问题非常方便。此代码已锁定,我无法修改它。

我正在尝试大规模地做到这一点。因为主电子表格和工作簿中的代码被锁定,所以我在同一个 excel 实例中打开了一个单独的工作簿,其中包含一个操作锁定工作簿的宏。而不是一个一个一个,我有一组 300 个我正在尝试运行。现在我必须照看这个东西并点击空间以通过 MsgBox。有谁知道任何技巧来防止我不得不监控这件事?禁用弹出窗口或以某种方式使它们成为非模态。也许是让鼠标点击的技巧?

4

2 回答 2

1

您知道解决问题的最佳方法是更正代码是正确的。在这种情况下,您可能会使弹出窗口可以切换。

然而,我为你写了这个,它可以作为一个潜在的解决方法。它利用 VBScript 来“排序”模拟多线程,以便您可以将密钥发送到 modal Msgbox。假设您可以通过代码执行您想要执行SendDelayedKeys的操作,只需在将导致Msgbox. 您可能需要Delay根据自己的情况进行修改,因为 100 毫秒可能还不够。要更改Delay,只需像这样调用:SendDelayedKeys 500500 毫秒。

Sub SendDelayedKeys(Optional Delay As Long = 100, Optional keys As String = """ """)
    Dim oFSO As Object
    Dim oFile As Object
    Dim sFile As String
    sFile = "C:\SendKeys.vbs" 'Make this a valid path to which you can write.
    'Check for the .vbs file.
    If Not Len(Dir$(sFile)) Then
        'Create the vbs file.
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        Set oFile = oFSO.CreateTextFile(sFile)
        oFile.WriteLine "Set WshShell = WScript.CreateObject(""WScript.Shell"")"
        oFile.WriteLine "WScript.Sleep CLng(WScript.Arguments(0))"
        oFile.WriteLine "WshShell.SendKeys WScript.Arguments(1)"
        oFile.Close
    End If
    Shell "wscript C:\SendKeys.vbs " & Delay & " " & keys
End Sub
Sub ProofOfConcept()
    'Using default parameters which sends a space after 100 milliseconds
    SendDelayedKeys
    MsgBox "I disappear on my own!"
End Sub

一句警告:任何使用SendKeys的解决方案都是脆弱的解决方案,应尽可能避免使用。但是,当您的选择有限并且您需要避免手动过程时,有时这是您唯一的选择。

由于 SiddhartRout 正确地指出这可以使用 API 调用来解决:这里有一个C# 代码链接,它会每秒关闭你的 msgbox。

于 2012-12-31T01:15:21.240 回答
1

这里的问题实际上并不是更多代码可以(或确实应该)解决的问题。

有很多事情需要考虑,任何解决方案都会比它最初试图解决的问题更复杂、更不可靠。但是让我们看看你的选择......

  1. SendKeys对于那种用途来说是不可靠的,如果对话说“你想让我保存这本工作簿吗? ”只是在做了一个临时的改变或者“你想玩全球热核战争吗? ”加上使用这样的批处理过程,您希望在等待时继续处理其他事情,即使它只是来这里投反对票。如果没有别的,你可能无法控制这段代码,那么当维护人员意识到 msgbox 是糟糕的 UX 并杀死它时会造成什么样的混乱?

  2. FindWindowAPI 调用可以让您检查窗口中的内容,以确保它说出了您所期望的内容,但随后您可能会要求一些快速而肮脏的 vbscript 进入竞争条件,直到出现正确的窗口。你能保证线程不会锁定吗?平台问题呢——如果有人想在他们闪亮的新表面上运行你的代码会发生什么?当您进行的 32 位 api 调用无法看到您的 64 位模态 Excel 对话窗口时会发生什么?不以相同方式呈现模态对话的新版 Office 会怎样?这些问题都不是不可克服的,但每个都增加了复杂性(也就是失败的机会。)

最好的解决方案是解决您从一开始就发现的实际问题,即原始代码引发了不必要的模态对话。有人需要解决这个问题 - 不一定是你,但如果你估计模态对话浪费了多少时间在生产力损失上,这应该会给你一个可靠的商业案例来解决它。

于 2013-01-07T00:35:23.010 回答