Creating a Function Inventory for a Workbook

Written by Allen Wyatt (last updated November 22, 2025)
This tip applies to Excel 2007, 2010, 2013, 2016, 2024, and Excel in Microsoft 365


10

Tim has a workbook that is rather large, and he wonders if there is a way to do an "inventory" of which functions are used in the various formulas in the workbook, along with the cells in which those functions are used.

This task is a bit harder that it may at first seem. You can make some rules as to what constitutes an Excel function, but those rules can get a bit hinky. For instance, you might think that a function is defined by an uppercase word followed by an opening parenthesis. This hasn't been true for a while, however, as function names can now contain periods.

The easiest way that I've found to get a function inventory is to develop a macro that will step through each formula in each worksheet in the workbook and check that formula against every possible worksheet function. The following macro will do that just fine:

Sub FormulaInventory()
    Dim EFunc(525) As String
    Dim iEFCnt As Integer
    Dim sFile As String
    Dim sTemp As String
    Dim SourceBook As Workbook
    Dim TargetBook As Workbook
    Dim TargetSheet As Worksheet
    Dim w As Worksheet
    Dim c As Range
    Dim iRow As Integer
    Dim J As Integer
    Dim K As Integer
    Dim L As Integer

    ' Read functions from text file
    sFile = ActiveWorkbook.Path & "\ExcelFunctions.txt"
    iEFCnt = 0
    Open sFile For Input As #1
    While Not EOF(1)
        Line Input #1, sTemp
        sTemp = Trim(sTemp)
        If sTemp > "" Then
            iEFCnt = iEFCnt + 1
            EFunc(iEFCnt) = sTemp & "("
        End If
    Wend
    Close #1

    ' Sort functions; longest to shortest
    For J = 1 To iEFCnt - 1
        L = J
        For K = J + 1 To iEFCnt
            If Len(EFunc(L)) < Len(EFunc(K)) Then L = K
        Next K
        If L <> J Then
            sTemp = EFunc(J)
            EFunc(J) = EFunc(L)
            EFunc(L) = sTemp
        End If
    Next J

    ' Create and setup new workbook
    Set SourceBook = ActiveWorkbook
    Set TargetBook = Workbooks.Add
    Set TargetSheet = TargetBook.Worksheets.Add
    TargetSheet.Name = "Inventory"
    TargetSheet.Cells(1, 1) = "Function Inventory for " & SourceBook.Name
    TargetSheet.Cells(3, 1) = "Function"
    TargetSheet.Cells(3, 2) = "Worksheet"
    TargetSheet.Cells(3, 3) = "Cell"
    TargetSheet.Range("A1").Font.Bold = True
    TargetSheet.Range("A3:C3").Font.Bold = True
    With TargetSheet.Range("A3:C3").Cells.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With

    ' Perform actual inventory
    iRow = 4
    For Each w In SourceBook.Worksheets
        If w.Cells.SpecialCells(xlCellTypeFormulas).Count > 0 Then
            For Each c In w.Cells.SpecialCells(xlCellTypeFormulas)
                sTemp = c.Formula
                For J = 1 To iEFCnt
                    If InStr(sTemp, EFunc(J)) Then
                        TargetSheet.Cells(iRow, 1) = Left(EFunc(J), Len(EFunc(J)) - 1)
                        TargetSheet.Cells(iRow, 2) = w.Name
                        TargetSheet.Cells(iRow, 3) = Replace(c.Address, "$", "")
                        iRow = iRow + 1
                        sTemp = Replace(sTemp, EFunc(J), "")
                    End If
                Next J
            Next c
        End If
    Next w
End Sub

Careful examination of the macro indicates that it reads in a text file (ExcelFunctions.txt) that includes a listing of all of Excel's worksheet functions. This file can be downloaded by using this link, and it should be stored in the same folder as the workbook that you are analyzing. (This means that the workbook you are analyzing must have already been saved in a folder.)

When the worksheet function names are loaded from the text file, the macro appends an opening parenthesis to each name. These names are stored in an array, and then this array is sorted according to the length of the function name, with the longest function names at the beginning of the array. This is done because of some ambiguity in function names. For instance, when the function-name array is read in you'll have one function named LEFT( and another named T(. When looking at a formula, if the LEFT( name is found then the T( name will also be found. By looking at the longest function names first and then removing those names from the formula string, then you eliminate the possibility of "false positives."

It should be noted that this function will only work with those worksheet functions listed in the ExcelFunctions.txt file. You can modify the file, as desired, to adapt what is located. It currently includes all standard worksheet functions for Excel 365, but you may want to modify it to include functions made available by your add-ins, or you may want to delete functions that you find too esoteric. (Hint: You could also simply add an apostrophe in front of a function name in the text file and it will then never be included in an inventory.) There are just below 525 function names in the file now; if you add too many more, you'll need to change the number elements declared in the macro for the EFunc array.

When the macro is completed, you'll find your inventory in the new workbook that the macro creates. You should note that the time it takes the macro to complete can vary from quite fast to amazingly slow. The larger your workbook—the more worksheets it contains and the more formulas on those worksheets—the longer it will take to finish its work. Remember it has to check every formula in the workbook against almost 500 worksheet function names.

ExcelTips is your source for cost-effective Microsoft Excel training. This tip (5136) applies to Microsoft Excel 2007, 2010, 2013, 2016, 2024, and Excel in Microsoft 365.

Author Bio

Allen Wyatt

With more than 50 non-fiction books and numerous magazine articles to his credit, Allen Wyatt is an internationally recognized author. He is president of Sharon Parq Associates, a computer and publishing services company. ...

MORE FROM ALLEN

Printing More than One Copy

If you need to print more than one copy of your document, you need to become familiar with the options in the Print ...

Discover More

Removing Borders

Need to get rid of the borders around a cell? The shortcut in this tip can make quick work of this formatting task.

Discover More

Converting Dates to Text

Need to use a date as part of a larger string of text? Here are some handy ways to go about the process.

Discover More

Program Successfully in Excel! This guide will provide you with all the information you need to automate any task in Excel and save time and effort. Learn how to extend Excel's functionality with VBA to create solutions not possible with the standard features. Includes latest information for Excel 2024 and Microsoft 365. Check out Mastering Excel VBA Programming today!

More ExcelTips (ribbon)

Creating Dependent Cells

Making the values in two cells mirror each other may seem like a desirable thing to do. It can be done, as discussed in ...

Discover More

Using SUM In a Macro

Want to use a worksheet function (such as SUM) from within a macro? Here's how easy it is to accomplish the task.

Discover More

Cropping Graphics in a Macro

Excel allows you to easily paste graphics into a worksheet. Once added, you may want to quickly process the graphics by ...

Discover More
Subscribe

FREE SERVICE: Get tips like this every week in ExcelTips, a free productivity newsletter. Enter your address and click "Subscribe."

View most recent newsletter.

Comments

If you would like to add an image to your comment (not an avatar, but an image to help in making the point of your comment), include the characters [{fig}] (all 7 characters, in the sequence shown) in your comment text. You’ll be prompted to upload your image when you submit the comment. Maximum image size is 6Mpixels. Images larger than 600px wide or 1000px tall will be reduced. Up to three images may be included in a comment. All images are subject to review. Commenting privileges may be curtailed if inappropriate images are posted.

What is nine more than 8?

2025-12-02 14:43:32

J. Woolley

PY (Excel 365) is another function missing from ExcelFunctions.txt.
COPILOT is a new function in Excel 365 Beta.
Allen already added TEXTSPLIT to ExcelFunctions.txt.
So the statement in Sub FormulaInventory2 can be changed to
    For Each v In VBA.Array("COPILOT", "DROP", "PY", "STOCKHISTORY")


2025-11-30 13:28:44

J. Woolley

Here are two more functions missing from ExcelFunctions.txt:
DROP (Excel 2024)
STOCKHISTORY (Excel 365)
Re. my Sub FormulaInventory2, replace the following statement
    For Each v In VBA.Array("TEXTSPLIT")
with this statement
    For Each v In VBA.Array("DROP", "STOCKHISTORY", "TEXTSPLIT")
Also, 'AFunc() As Variant,' can be removed from the first Dim statement.


2025-11-27 14:01:32

J. Woolley

Here's an alternate version of the Tip's macro that uses worksheet function WEBSERVICE to download LF delimited function names from the latest list at https://excelribbon.tips.net/ExcelFunctions.txt. More functions can be added in a VBA.Array(...) statement. All function names are treated as case sensitive.
This version creates a new unsaved workbook/worksheet with 3 columns: Sheet!Cell, Function, and Formula. The first column is hyperlinked to its source.

Sub FormulaInventory2()
    Dim EFunc() As String, AFunc() As Variant, v As Variant
    Dim SourceBook As Workbook, w As Worksheet
    Dim FormulaCells As Range, c As Range
    Dim sTemp As String, sAddr As String
    Dim iEFCnt As Integer, J As Integer, K As Integer, L As Integer
    Const sFile = "https://excelribbon.tips.net/ExcelFunctions.txt"
    'Get LF delimited list of functions; max is 32767 characters
    EFunc = Split(WorksheetFunction.WebService(sFile), vbLf)
    iEFCnt = UBound(EFunc)
    If Len(EFunc(iEFCnt)) = 0 Then iEFCnt = iEFCnt - 1
    'Add functions to EFunc; don't worry about possible duplicates
    For Each v In VBA.Array("TEXTSPLIT")
        iEFCnt = iEFCnt + 1
        ReDim Preserve EFunc(iEFCnt)
        EFunc(iEFCnt) = v
    Next v
    'Sort functions longest to shortest
    For J = 0 To iEFCnt - 1
        L = J
        For K = J + 1 To iEFCnt
            If Len(EFunc(L)) < Len(EFunc(K)) Then L = K
        Next K
        If L <> J Then
            sTemp = EFunc(J)
            EFunc(J) = EFunc(L)
            EFunc(L) = sTemp
        End If
    Next J
    Set SourceBook = ActiveWorkbook
    'Create and setup new active workbook/worksheet
    Workbooks.Add
    With ActiveSheet
        .Name = "FormulaInventory"
        .Range("A2") = "Sheet!Cell"
        .Range("B2") = "Function"
        .Range("C2") = "Formula"
        .Range("A1:C2").Font.Bold = True
        .Range("A3").Select
        ActiveWindow.FreezePanes = True
        'Perform inventory
        L = 3
        For Each w In SourceBook.Worksheets
            Set FormulaCells = Nothing
            On Error Resume Next
                Set FormulaCells = w.UsedRange.SpecialCells(xlCellTypeFormulas)
            On Error GoTo 0
            If Not (FormulaCells Is Nothing) Then
                For Each c In FormulaCells
                    sTemp = c.Formula
                    For J = 0 To iEFCnt
                        'Perform case sensitive comparison
                        If InStr(1, sTemp, EFunc(J) & "(", vbBinaryCompare) Then
                            sAddr = Replace(c.Address(External:=True), _
                                "[" & SourceBook.Name & "]", "", 1, 1)
                            .Cells(L, 1) = "'" & sAddr
                            .Cells(L, 1).Hyperlinks.Add .Cells(L, 1), _
                                SourceBook.FullName, sAddr
                            .Cells(L, 2) = "'" & EFunc(J)
                            .Cells(L, 3) = "'" & c.Formula
                            L = L + 1
                            sTemp = Replace(sTemp, EFunc(J) & "(", "", 1, -1, _
                                vbBinaryCompare)
                        End If
                    Next J
                Next c
            End If
        Next w
        .Columns("A:C").AutoFit
        .Range("A1") = SourceBook.FullName
    End With
End Sub


2025-11-26 16:11:03

Allen Wyatt

@James: The primary place from which I garnered the information is here:

https://support.microsoft.com/en-us/office/excel-functions-alphabetical-b3944572-255d-4efb-bb96-c6d90033e188

That doesn't tell the whole story, though, as there are some functions that are not listed there. These are deprecated, but still work in Excel for compatibility with past versions.

As to TEXTSPLIT, I'm not sure how I missed that one. I've now updated the file to include it. If you find any others, let me know and I'll get them added.

-Allen


2025-11-26 15:50:13

J. Woolley

@Allen
I'm curious how you derived the ExcelFunctions.txt list of functions. While testing the macro I noticed the Excel 2024 TEXTSPLIT function is missing. For example, the following formula
=TEXTSPLIT("Hello World"," ")
adds function T to the inventory instead of TEXTSPLIT. It's difficult to determine if any other functions are missing.


2025-11-23 11:15:45

J. Woolley

@Allen
Perhaps my question was not clearly stated. Do you intend to update https://excelribbon.tips.net/ExcelFunctions.txt whenever new worksheet functions are added to Excel?
As you suggested, here is another way to save ExcelFunctions.txt after downloading in a web browser:
1. Press Ctrl+A to copy all of the values from ExcelFunctions.txt
2. Press Ctrl+V to paste them into a blank Notepad window or tab
3. Press Ctrl+S (or Ctrl+Shift+S) to Save as type: Text documents (*.txt)
4. Specify that file in Sub FormulaInventory


2025-11-22 18:09:15

Allen

@James

I updated the list just this past week, so it is as up to date as I know how to make it right now.

As to saving the functions from a web browser page, you should just be able to copy it and save it into a text file in Notepad.

-Allen


2025-11-22 15:45:58

J. Woolley

SpecialCells(xlCellTypeFormulas) will produce an error if there are no formulas; therefore, replace the following statements in Sub FormulaInventory
    ' Perform actual inventory
    iRow = 4
    For Each w In SourceBook.Worksheets
        If w.Cells.SpecialCells(xlCellTypeFormulas).Count > 0 Then
            For Each c In w.Cells.SpecialCells(xlCellTypeFormulas)
with these statements
    ' Perform actual inventory
    Dim FormulaCells As Range
    iRow = 4
    For Each w In SourceBook.Worksheets
        Set FormulaCells = Nothing
        On Error Resume Next
            Set FormulaCells = w.Cells.SpecialCells(xlCellTypeFormulas)
        On Error GoTo 0
        If Not (FormulaCells Is Nothing) Then
            For Each c In FormulaCells
Saving text like TRUE or FALSE in a cell results in a logical value instead of text; therefore, after this statement
            TargetSheet.Cells(iRow, 1) = Left(EFunc(J), Len(EFunc(J)) - 1)
add the following statements
            If EFunc(J) = "TRUE(" Then
                TargetSheet.Cells(iRow, 1) = "'TRUE"
            ElseIf EFunc(J) = "FALSE(" Then
                TargetSheet.Cells(iRow, 1) = "'FALSE"
            End If


2025-11-22 15:44:37

J. Woolley

When I use Chrome to save https://excelribbon.tips.net/ExcelFunctions.txt as a text file, each line is terminated by LF instead of CR or CR-LF; therefore, VBA's Line Input statement does not separate lines as expected. To remedy this:
1. Press Ctrl+A to copy all of the values from ExcelFunctions.txt
2. Press Ctrl+V to paste them into cell A1 of a blank worksheet
3. Press F12 and pick Save as type: Text (MS-DOS) (*.txt)
4. Specify that file in Sub FormulaInventory


2025-11-22 11:43:25

J. Woolley

@Allen
Do you intend to regularly update the list of Excel's worksheet functions?https://excelribbon.tips.net/ExcelFunctions.txt


This Site

Got a version of Excel that uses the ribbon interface (Excel 2007 or later)? This site is for you! If you use an earlier version of Excel, visit our ExcelTips site focusing on the menu interface.

Newest Tips
Subscribe

FREE SERVICE: Get tips like this every week in ExcelTips, a free productivity newsletter. Enter your address and click "Subscribe."

(Your e-mail address is not shared with anyone, ever.)

View the most recent newsletter.