1

レジストリ値を監視するスクリプトを VBA で作成しています。レジストリ値が変更された場合、スクリプトはそれを上書きします。これまで、レジストリの値をチェックし、それを特定の値に更新するスクリプトを作成しました。しかし、私の問題は、2分ごとに、または値が変更されたときにレジストリを更新する方法ですか? 助けてください !!!

On Error Resume Next
HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Control Panel\Desktop"
ValueName = "ScreenSaveActive"
    objReg.GetStringValue HKEY_CURRENT_USER, strKeyPath, ValueName, strValue
    objReg.CreateKey HKEY_CURRENT_USER, strKeyPath
If IsNull(strValue) Then
    Wscript.Echo "The value is either Null or could not be found in the registry."
Else
    Wscript.Echo "Value: ", strValue
    strValue = "1"
    objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, ValueName, strValue
    Wscript.Echo "Value after change ", strValue
End If

よろしく、エルニ

4

2 に答える 2

2

コードをループ内に配置し、ループを通過するたびに 2 分間スリープするように指示するだけで、おそらく次のようになります。

Do While 1

    ...
    [your code here]
    ...

    WScript.Sleep(120 * 1000) ' 120 seconds in 2 minutes and it expects milliseconds
Loop

ただし、値が null の場合は、続行する意味がない可能性が高いため、null であるというExit Do行の後に行を追加しEchoて、ループを停止する価値がある場合があります。

ただし、VBA ではなく VBscript を使用していることに注意してください (これらは似ていますが、言語は異なります)。

于 2012-07-18T15:41:43.697 に答える
1

次の例は、ExcelVBAで実行されます。次のコードを入れてくださいThisWorkbook

Option Explicit
Public TimerActive As Boolean
Public TimerInterval As String ' e.g. "00:02:00"
Public TimerProcedure As String
Private NextSchedule As Variant

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    TimerActive = False
    Application.OnTime EarliestTime:=NextSchedule, _
                       Procedure:=TimerProcedure, Schedule:=False
End Sub

Private Sub Workbook_Open()
    TimerProcedure = "Module1.myTimerProc"
    TimerInterval = "00:00:10"
    TimerActive = True
    ScheduleTimer TimerInterval, TimerProcedure
End Sub


Public Sub ScheduleTimer(nextInterval As String, procName As String)
    NextSchedule = Now + TimeValue(nextInterval)
    Application.OnTime NextSchedule, procName
End Sub

次に、次の手順のようにModule1を作成します。

Option Explicit
Public Sub myTimerProc()
    With ThisWorkbook
        If .TimerActive Then
            Debug.Print Now & " Hi!"
            .ScheduleTimer .TimerInterval, .TimerProcedure
        End If
    End With
End Sub

これにより、デバッグ(即時)ウィンドウに「Hi!」というメッセージが10秒ごとに出力されます。例を簡単に変更してレジストリに書き込むことができます。このモジュールで別のプロシージャを作成し、Debug.Print記述したプロシージャの呼び出しでステートメントを置き換えるだけです。タイマーは、Excelファイルを開いた直後にアクティブになり、閉じる前に非アクティブになります。

注意してください

  • Excelを適切に閉じるには、イベントのTimerActiveフラグとのステートメントが必要です。この余分なコードがない場合は、タイマーが無期限に再起動されます。Workbook_CloseifmyTimerProc
  • ファイルは「マクロ対応ワークブック」として保存する必要があり、おそらく署名するか、信頼できる場所に配置する必要があります。そうしないと、その中のマクロは実行されません(Excelによって無効にされます)。
于 2012-07-18T15:52:19.693 に答える