excelperfect
本文介绍的自定义函数来源于wellsr.com,以Excel的CELL函数和INFO函数为样板,可直接返回工作表或工作簿的名称或工作簿路径,以及与Excel及其操作环境有关的各种信息。本文对其内容进行了整理并分享于此,希望能够有助于VBA代码的学习,同时留存这个自定义函数以备所需。
INFO函数回顾
INFO函数的语法如下:
INFO(type_text)
其中,参数type_text可以是下列值之一:directory、numfile、origin、osversion、recalc、release、system。
例如,如果指定参数值为directory,即输入公式:
=INFO("DIRECTORY")
则返回当前目录或文件夹的路径,对于我的示例工作簿来说将返回:
D: 1. Excel研究 6.2 VBA代码库 9
详细内容参见:Excel函数学习27:INFO函数
CELL函数回顾
CELL函数的语法如下:
CELL(info_type,[reference])
其中,参数info_type可以是下列值之一:address、col、color、contents、filename、format、parentheses、prefix、protect、row、type、width。
参数reference,可选,默认值是最后一个发生变化的单元格。
例如,下面的公式:
=CELL("filename",A1)
在我的示例工作簿中返回:
D: 1. Excel研究 6.2 VBA代码库 9[VBACodeLibrary09.xlsm]Sheet1
下面的公式来拆分出工作簿路径、工作簿名称和工作表名称。
公式:
=LEFT(CELL("filename",A1),FIND("[",CELL("filename",A1))-2)
结果返回工作簿路径:
D: 1. Excel研究 6.2 VBA代码库 9
公式:
=MID(CELL("filename",A1),FIND("[",CELL("filename",A1)) 1,FIND("]",CELL("filename",A1))-FIND("[",CELL("filename",A1))-1)
结果返回工作簿名称:
VBACodeLibrary09.xlsm
公式:
=MID(CELL("filename",A1),FIND("]",CELL("filename",A1)) 1,999)
结果返回工作表名称:
Sheet1
详细内容参见:Excel函数学习24:CELL函数
NameOf函数
NameOf函数用来增强CELL函数和INFO函数的功能,不需要像上面那样使用长而复杂的公式来获取相关信息。NameOf函数的代码如下:
' 返回工作表名,工作簿名或工作簿路径
' 或者, 返回应用程序名、版本、标题、状态栏、用户名、组织名或当前打印机
' 或者, 返回环境变量"COMPUTERNAME" 或This命名的任何环境变量名
' 语法: NameOf([This],[Target])
' 参数This默认值0 (或者 "sheet" 或者 "worksheet")
' This = 0 或 "sheet" 或 "worksheet" 返回工作表名(默认)
' This = 1 或 "book" 或 "workbook" 返回工作簿名
' This = 2 或 "path" 或 "filepath" 返回工作簿路径
' This = 3 或 "app" 或 "application" 返回应用程序名和版本
' This = 4 或 "caption" 或 "titlebar" 返回应用程序标题
' This = 5 或 "statusbar" 返回应用程序状态栏
' This = 6 或 "user" 返回应用程序用户名
' This = 7 或 "organization" 返回应用程序组织名
' This = 8 或 "printer" 返回当前打印机
' This = 9 或 "computer" 返回Environ("COMPUTERNAME")
' This ="?" 或 "help" 返回This的文本列表
' This = 上面没有列出的任意字符串返回Environ(This)
' 如果Target为空(默认), 则Target被设置为引用此函数的单元格(如果在VBA语句中引用则错误)
' 或者, Target应该是单元格地址(如A1或Sheet1!A1)或VBA单元格区域如Range("A1")
' 仿照Excel内置信息函数CELL和INFO
' 开发:wellsr.com
Public FunctionNameOf(Optional ByVal This As Variant = 0, _
Optional ByVal Target As Range = Nothing) AsVariant
Dim vResult As Variant
Application.Volatile
If Not IsNumeric(This) Then This =Trim(LCase(This))
Select Case This
Case 0, "sheet","worksheet":
If Target Is Nothing Then Set Target =Application.ThisCell
vResult = Target.Parent.Name
Case 1, "book","workbook":
If Target Is Nothing Then Set Target =Application.ThisCell
vResult = Target.Parent.Parent.Name
Case 2, "path","filepath":
If Target Is Nothing Then Set Target =Application.ThisCell
vResult = Target.Parent.Parent.Path
Case 3, "app","application":
vResult = Application.Name & "" & Application.Version
Case 4, "caption","titlebar":
vResult = Application.Caption
Case 5, "statusbar":
vResult = Application.StatusBar
If Not vResult Then vResult ="Default"
Case 6, "user":
vResult = Application.UserName
Case 7, "organization":
vResult = Application.OrganizationName
Case 8, "printer":
vResult = Application.ActivePrinter
Case 9, "computer":
vResult =Environ("COMPUTERNAME")
Case "?", "help":
vResult = "Worksheet, Workbook,Filepath, Application, Titlebar, Statusbar, User, Organization, Printer,Computer (EnvVar)"
Case Else:
vResult = Environ(CStr(This))
If vResult = "" Then vResult= CVErr(xlErrValue)
End Select
NameOf = vResult
End Function
NameOf函数有两个参数:This和Target,都是可选的。此外,两个参数都声明为ByVal,确保在函数中的更改不会影响到传递给它的参数。函数返回Variant型的结果,表示指定的Target的This的名称。
代码开头的注释部分说明了参数This可以指定的值,可以使用数字或文本来指定。如果This指定为文本,则忽略大小写以及前导和结尾的空格。
例如,公式:
=nameof(" book ")
在我的示例中返回结果为:
VBACodeLibrary09.xlsm
下面的公式:
=nameof("Help")
输出可以在函数中使用的所有长格式文本值:
Worksheet, Workbook,Filepath, Application, Titlebar, Statusbar, User, Organization, Printer, Computer(EnvVar)
如果NameOf函数中没有指定参数This,则默认为0(或”sheet”或”worksheet”)。
NameOf函数的参数Target是Range对象,默认为公式所引用的单元格即Application.ThisCell。如果指定Target,则必须是单元格地址如A1或Sheet1!A1或’[示例工作簿.xlsm]Sheet1’!A1。
如果在VBA中使用NameOf函数,那么参数Target必须是Range对象如Range(“A1”)或Cells(1)或ActiveCell。如果参数This的值不是”sheet”、”book”或”path”,那么参数Target被忽略,除非其为无效的Range。如果参数Target引用了未打开的工作簿,则Target可能会被视为NameOf函数引用(其默认值)的单元格或无效的Range。如果Target是无效的Range,那么NameOf函数返回#VALUE!。
注意,使用Application.Volatile以确保在打开工作簿或重新计算单元格时,所有引用NameOf函数的单元格都会得到更新。