Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get VBA Macro to run continuously in the background?

Tags:

excel

vba

I want to monitor a value and get an email notifications when certain conditions are met. I have a macro like so:

Do While True

    Worksheet.Calculate

    If Value > 10 Then
        SendEmail
    End If

    Sleep 60*CLng(1000)

Loop

However, when I run this, it clogs up the entire program and will turn unresponsive if I try to do anything.

Is there anyway to accomplish this but have it run in the background or at least not crash the program?

What I was doing before was using VBScript to open a not-visible spreadsheet and the VBScript ran continuously in the background monitoring the condition and worked fine, but my client really wants a GUI and for it to be in the program itself.

Any thoughts?

like image 496
Charles Clayton Avatar asked Jul 03 '15 16:07

Charles Clayton


People also ask

How do I get a macro to run in the background?

There are a couple different ways to run macros in the background in Excel. One way is to use the Macro Recorder. To do this, open the workbook in which you want to record the macro. Then, go to Tools > Macro > Record New Macro.

How do I make a macro run every 10 seconds?

Macro that sets the interval my_macro is the name of the macro that you want to run each interval. TimeValue("00:00:10") is the part of the code that says how long to wait before running the macro; this is the interval. Currently, this is set to run the macro every 10 seconds.

How do I autorun a macro in Excel?

Steps to run macro automatically when the workbook opens:Step 1: Go to the developer's menu and then go to the visual basic. Step 2: Go to ThisWorkbook Tab. Step 3: Write down Private Sub Workbook_open() and hit enter.


1 Answers

Use the Application.OnTime method to schedule code that will run in one minute.

Your code will look something like this (Untested):

Sub CreateNewSchedule()
    Application.OnTime EarliestTime:=DateAdd("n", 1, Now), Procedure:="macro_name", Schedule:=True
End Sub

Sub macro_name()

    If Value > 10 Then
        SendEmail
    Else
        CreateNewSchedule
    End If

End Sub

You might want to store the time of the next schedule in a global variable so that the Workbook_BeforeClose event can cancel the next schedule. Otherwise Excel will re-open the workbook.

Public nextScheduledTime As Date

Sub CreateNewSchedule()
    nextScheduledTime  = DateAdd("n", 1, Now)
    Application.OnTime EarliestTime:=nextScheduledTime , Procedure:="macro_name", Schedule:=True
End Sub

Sub macro_name()

    If Value > 10 Then
        SendEmail
    Else
        CreateNewSchedule
    End If

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
    Application.OnTime EarliestTime:=nextScheduledTime, Procedure:="macro_name", Schedule:=False
End Sub

You can then continue to use Excel between the scheduled times.

like image 108
ChipsLetten Avatar answered Oct 06 '22 00:10

ChipsLetten