Home → Techniques and Tips → VBA Programming with @RISK → Launching @RISK from a Visual Basic Macro in Excel
Applies to: @RISK 5.x–7.x, Professional and Industrial Editions
(@RISK Standard Edition cannot be automated with VBA macros.)
I'm writing an elaborate workbook that will use @RISK. Users will have @RISK installed, but I'd like to start @RISK through VBA in my workbook instead of having them click a desktop icon or use the Windows Start button. How can I do it?
To test whether @RISK is already loaded:
If workbook RISK.XLA is open, @RISK is loaded. If that workbook isn't open, @RISK is not loaded. (This is tested in the sample code below for opening @RISK.)
To load @RISK if it is not already loaded:
The Shell method is simplest and will load @RISK asynchronously. This means that you launch @RISK and immediately return control to Excel, as opposed to waiting in the code till @RISK has loaded.
It's a good idea not to hard-code the path to the Risk.exe executable, but instead read it from the System Registry. Here's some sample code:
Option Explicit ' Check whether @RISK is running, and load it if it's not. Sub loadAtRisk() ' This is the folder for the version of @RISK that should be loaded. ' If you want to load @RISK 6 or 5 instead, change the 7 to 6 or 5. Const AtRiskFolder = "Risk7" ' If the @RISK add-in is already open, there's no need to open it again. Dim wb As Workbook On Error Resume Next Set wb = Workbooks("Risk.xla") On Error GoTo 0 If Not (wb Is Nothing) Then Exit Sub ' Risk.xla isn't open, so open @RISK by using the Risk.exe launcher. ' It will be in a sub-folder under the Palisade main folder. Dim sPath As String If Palisade_MainDirectory() = "" Then MsgBox "No Palisade key found in System Registry - @RISK isn't intalled.", , _ "loadAtRisk( )" Exit Sub End If sPath = Palisade_MainDirectory() & AtRiskFolder & "\Risk.exe" If Dir(sPath) = "" Then MsgBox "@RISK not found at " & Chr(13) & sPath, , "loadAtRisk( )" Else Shell sPath ' Control must pass immediately to Excel. Exit Sub End If End Sub Function Palisade_MainDirectory() As String ' Adapted 2015-08-31 from ' http://www.jpsoftwaretech.com/vba/grab-registry-settings-through-vba-using-wmi/ Const HKEY_LOCAL_MACHINE = &H80000002 Dim temp As Object Dim sKey As String Dim sValue As String Dim sData As String Set temp = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ ".\root\default:StdRegProv") ' This retrieves the key if Windows is 32-bit. ' If the key's not there, sData is is set to a zero-length string. sKey = "Software\Palisade" sValue = "Main Directory" temp.getstringvalue HKEY_LOCAL_MACHINE, sKey, sValue, sData ' This retrieves the key if Windows is 64-bit. ' If the key's not there, sData is is set to a zero-length string. If sData = "" Then sKey = Replace(sKey, "Palisade", "WOW6432Node\Palisade") temp.getstringvalue HKEY_LOCAL_MACHINE, sKey, sValue, sData End If ' Palisade's Main Directory key exists, so it looks like some Palisade software is ' installed. Some versions have a trailing \ in this key and others do not, so ' make it uniform. If Len(sData) > 0 And Right(sData, 1) <> "\" Then sData = sData & "\" Palisade_MainDirectory = sData End Function
See also: Shutting Down @RISK from VBA Code.
Additional keywords: Run or open @RISK programmatically
Last edited: 2015-11-20