蒂姆有一个很大的工作簿,他想知道是否有一种方法可以对工作簿中各种公式中使用的函数以及使用这些函数的单元格进行“清点”。

乍看之下,这项任务有点困难。您可以针对Excel函数的组成制定一些规则,但是这些规则可能会有点麻烦。例如,您可能认为函数由大写单词定义,后跟左括号。一段时间以来,情况并非如此,因为函数名称现在可以包含句点。

我发现获得功能清单的最简单方法是开发一个宏,该宏将逐步遍历工作簿中每个工作表中的每个公式,并针对每个可能的工作表功能检查该公式。下面的宏可以做到这一点:

Sub FormulaInventory()

Dim EFunc(500) 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         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     Next w End Sub

使用此链接下载”,并且应该与要分析的工作簿存储在同一文件夹中。 (这意味着您正在分析的工作簿必须已经保存在文件夹中。)

当从文本文件中加载工作表函数名称时,宏将在每个名称后添加一个括号。这些名称存储在数组中,然后根据函数名称的长度对该数组进行排序,最长的函数名称位于数组的开头。这样做是由于函数名称中的某些歧义。例如,当读取函数名称数组时,将有一个名为LEFT()的函数,而另一个名为T(。)。在查看公式时,如果找到LEFT(的名字,那么T(的名字也会被找到。通过首先查看最长的函数名称,然后从公式字符串中删除这些名称,则消除了“误报”的可能性。

||此功能仅适用于ExcelFunctions.txt文件中列出的那些工作表函数。您可以根据需要修改文件以适应所处的位置。当前它包括Excel 2016的所有标准工作表函数,但您可能需要对其进行修改以包括以下功能:您的加载项,或者您可能想删除过于深奥的功能。(提示:

您也可以在文本文件中的功能名称之前简单地添加撇号,这样就永远不会将其包括在内在清单中。)在此函数名称中,只有不到500个立即提交文件;如果添加太多,则需要更改在EFunc数组的宏中声明的元素个数。

宏完成后,您将在宏创建的新工作簿中找到清单。您应注意,宏完成所需的时间可能从非常快到非常慢而变化。工作簿越大,它包含的工作表越多,并且这些工作表上的公式越多,则完成工作所花费的时间就越长。

请记住,它必须对照几乎500个工作表函数名称来检查工作簿中的每个公式。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(5136)适用于Microsoft Excel 2007、2010、2013和2016。