How to get the process ID of the current Excel instance, through VBA, without using the caption?

27,253

Solution 1

You can use this method to get the current process id.

Declare Function GetCurrentProcessId Lib "kernel32" () As Long

This page has a good overview of exactly how you can do it in various versions of excel.

Solution 2

My solution in Excel 2013: in a new module, I added the following code:

Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

Public Sub Test()
    Debug.Print GetCurrentProcessId
End Sub

Solution 3

As a vba n00b, some other things I did not know

  1. The Declare statement goes at the top. VBA will complain if the declare statement is inserted after a sub declaration

    For example, this will work

    Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    
    Sub Update
      ...
      ...
    End Sub
    

    But this will not work

    Sub Update
      ...
      ...
    End Sub
    
    Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    
  2. Here is how we display the PID in a messagebox in vbscript

    Set app = CreateObject("Excel.Application")
    MsgBox("Excel PID is " + CStr(app.Run("GetCurrentProcessId")))
    

Hope this helps someone

Share:
27,253
Jason
Author by

Jason

Updated on March 25, 2020

Comments

  • Jason
    Jason about 4 years

    How can I get the process ID of the current Excel instance that my VBA code is running in? I don't want to asking for it by the name in the caption, which causes problems when I have two or more Excel instances with the same caption.

  • mklement0
    mklement0 over 7 years
    Works great; note that in VBA object modules (e.g., in a module associated with an Excel workbook), you must prefix the declaration with Private .
  • Andreas Covidiot
    Andreas Covidiot over 4 years
    @mklement0 this is wrong for at least for Excel 2010, nevertheless if one wants to call it differently one has to wrap it in another function and thus private could make sense
  • mklement0
    mklement0 over 4 years
    @AndreasDietrich From at least 2013 on, from what I can tell, you must use Private in object modules (those associated with the workbook as a whole or a given worksheet, under "Microsoft Excel Objects" in the VBA project view, but not in code-only modules (under "Modules"). Additionally, in VBA 7 (not sure what version that corresponds to, but it is the case in Excel 2019), you must use the PtrSafe attribute (Private Declare PtrSafe Function ...). So, how does it work in Excel 2010 and below?
  • Andreas Covidiot
    Andreas Covidiot over 4 years
    @mklement0 ah - thx for the clarification. I was talking then about code-only modules.