1

「コメントアウト」の嵐を避けるために、私の状況は次のとおりです。

私は通常、1回の反復ごとにプロセスを実行しています。ユーザーがマクロを呼び出すボタンを手動で押すと、マクロが完了すると、マクロが実行された合計時間を報告するメッセージ ボックスがポップアップ表示されます。問題を診断するのに非常に便利です。このコードはロックされており、変更できません。

私はこれを大規模にやろうとしています。メインのスプレッドシートとワークブックのコードがロックされているため、ロックされたワークブックを操作するマクロを使用して、Excel の同じインスタンスで別のワークブックを開いています。1つずつではなく、300のセットを実行しようとしています。今、私はそのことを子守し、スペースを押して MsgBox を通過する必要があります。私が物事を監視するのを防ぐためのトリックを知っている人はいますか? ポップアップを無効にするか、何らかの方法で非モーダルにします。たぶん、マウスをクリックさせるためのトリックですか?

4

2 に答える 2

1

ここでの問題は、厳密には、より多くのコードで解決できる (または解決すべき) 問題ではありません。

考慮すべきことが非常に多く、どのソリューションも最初に解決しようとしていた問題よりも複雑で信頼性が低くなります。しかし、あなたのオプションを見てみましょう...

  1. SendKeys一時的な変更を行った直後に「このワークブックを保存しますか? 」または「地球規模の熱核戦争をプレイしますか? 」というダイアログが表示された場合はどうなりますか?荒らしに反対票を投じるためだけにここに来たとしても、待っている間に何か他のことをしたいようなバッチプロセスを使用します。メンテナーが msgbox が悪い UX であることに気づき、それを殺した場合、どのような混乱が生じるでしょうか?

  2. FindWindowAPI 呼び出しを使用すると、ウィンドウ内のコンテンツをチェックして、期待どおりの内容が表示されていることを確認できますが、適切なウィンドウが表示されるまで、迅速で汚い vbscript に競合状態になるように要求する可能性があります。スレッドがロックアップしないことを保証できますか? プラットフォームの問題についてはどうでしょうか?誰かがあなたのコードをピカピカの新しいサーフェスで実行したい場合はどうなりますか? 作成していた 32 ビット API 呼び出しで 64 ビット モーダル Excel ダイアログ ウィンドウが表示されない場合はどうなりますか? 同じようにモーダル ダイアログを表示しない新しいバージョンの Office はどうですか? これらの問題はどれも克服できないものではありませんが、それぞれが複雑さを増します (つまり、失敗の可能性があります)。

最善の解決策は、元のコードが不要なモーダル ダイアログをスローするという、最初から特定した実際の問題を修正することです。誰かがそれを修正する必要があります-それはあなたである必要はありませんが、モーダルダイアログが生産性の損失にどれだけの時間を浪費するかを見積もれば、それを整理するための確かなビジネスケースが得られるはずです.

于 2013-01-07T00:35:23.010 に答える
1

問題を解決する最善の方法は、コードを修正することであることを知っているのは正しいことです。その場合、おそらくポップアップをトグル可能にします。

ただし、潜在的な回避策として使用できる可能性のあるこれを書きました。VBScript を使用してマルチスレッドをシミュレートし、 modal にキーを送信できるようにしますMsgbox。コードを介してやりたいことを実行できると仮定するとSendDelayedKeysMsgbox. Delay100ミリ秒では不十分な場合があるため、状況に基づいて調整する必要がある場合があります。を変更するには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# コードのリンクを次に示します。

于 2012-12-31T01:15:21.240 に答える