VBA代码库09:增强的CELL函数和INFO函数

2021-01-20 16:02:52 浏览数 (1)

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函数的单元格都会得到更新。

vba

0 人点赞