Following on from Neil's reply, RData(), RHistory() and TR() functions have a MACRO argument where macros can be run when the function has updated its data. The macros can be in the code on the Workbook or Sheet object, in a VBA module contained in the workbook or code in another, separate workbook.
The Word document attached gives a description and various examples of how to use the MACRO argument, including file names with gaps and named ranges.
The examples and document show RData() and RHistory() and TR() examples. The syntax for the TR function itself is slightly different as the argument (MACRO) and parameter (myMacroName) are separated by a colon (:) in Rdata()/RHistory() and by an equality sign (=) in TR().
Thus, requesting BID and ASK for VOD.L, to run the macro called myMacro1 when the data updates, the two functions will look like this;=RData("VOD.L","BID;ASK;PRCTCK_1",,"MACRO:myMacro1","CH:Fd",A2)
=TR("VOD.L","BID;"&"ASK;"&"PRCTCK_1","MACRO=myMacro1 CH=Fd",A2)
It isn't possible to include or send variables with the macro name when it is defined in the RData(), RHistory() or TR() function, such as=RData("VOD.L","BID;ASK;PRCTCK_1",,"MACRO:myMacro1(myVariable)","CH:Fd",A2)
=TR("VOD.L","BID;"&"ASK;"&"PRCTCK_1","MACRO=myMacro1(myVariable) CH=Fd",A2)
What will be required is to run an initial macro, e.g. myMacro1 that gathers or creates the required variable, which then runs a subroutine, e.g. myMacro2, or a function, e.g. myCustomFunction, to return the desired result. The code sample below shows this.
Option Explicit'Called by RDataSub myMacro1() Dim myVar As Variant 'Using a custom function myVar = myCustomFunction(5) MsgBox "Result of myCustomFunction" & Chr(13) & myVar 'Using a subroutine Call myMacro2(5)End SubFunction myCustomFunction(ByVal var1 As Integer) myCustomFunction = var1 * 25End FunctionPrivate Sub myMacro2(ByVal val1 As Integer) MsgBox "Result of myMacro2" & Chr(13) & val1 * 125End Sub
The zip file attached to this reply contains the Word document and Excel sample file.
rdata-tr-macro-examples.zip
You can get your TR function to trigger a macro through the "custom TimeFrame" option.
In the example below the "Showmessage" macro is called every time updates are displayed within the set timeframe.
= TR(F7:F46,"BID","START=09:00 END=20:30 MACRO=SHOWMESSAGE")
You would set your custom timeframe as below, from UPDATE FREQ menu