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

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:\01. Excel研究\06.2 VBA代码库\09\

详细内容参见: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:\01. Excel研究\06.2 VBA代码库\09\[VBACodeLibrary09.xlsm]Sheet1

下面的公式来拆分出工作簿路径、工作簿名称和工作表名称。

公式:

=LEFT(CELL('filename',A1),FIND('[',CELL('filename',A1))-2)

结果返回工作簿路径:

D:\01. Excel研究\06.2 VBA代码库\09

公式:

=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应该是单元格地址(如$A$1或Sheet1!A1)或VBA单元格区域如Range('$A$1')

' 仿照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,则必须是单元格地址如$A$1或Sheet1!A1或’[示例工作簿.xlsm]Sheet1’!A1。

如果在VBA中使用NameOf函数,那么参数Target必须是Range对象如Range(“$A$1”)或Cells(1)或ActiveCell。如果参数This的值不是”sheet”、”book”或”path”,那么参数Target被忽略,除非其为无效的Range。如果参数Target引用了未打开的工作簿,则Target可能会被视为NameOf函数引用(其默认值)的单元格或无效的Range。如果Target是无效的Range,那么NameOf函数返回#VALUE!。

注意,使用Application.Volatile以确保在打开工作簿或重新计算单元格时,所有引用NameOf函数的单元格都会得到更新。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

(0)

相关推荐

  • Excel常用函数之CELL函数

    大家好,今天我们来学习一个获取信息函数-CELL函数,它用于返回某一引用区域在左上角单元格的格式.位置或内容等信息.其语法格式为:CELL(info-type,reference).参数解析如下图: ...

  • VBA代码库11:强制用户启用宏(续)

    excelperfect 在<VBA代码库10:强制用户启用宏>中,讲解了一段用户在打开工作簿时必须启用宏才能使用工作簿功能的代码.本文给出另一段同样可以实现强制用户启用宏的代码. 如果用 ...

  • VBA代码库10:强制用户启用宏

    有时,必须确保用户在打开工作簿时启用宏,否则就不能实现工作簿的效果.由于无法使用宏去打开宏,因此需要一种确保用户启用宏的技术.下面讲解的方法隐藏除"欢迎"工作表(告诉用户启用宏)之 ...

  • VBA代码库12:处理日期和时间

    excelperfect 本文中的代码来自于www.cpearson.com,特辑录于此,方便在需要时参考. 下面的过程和函数代码用于处理日期和时间. 指定年的第一个星期一 下面的函数返回指定年的第一 ...

  • VBA终极神器 代码库收藏管理 输入提示

    代码助手下载地址 https://share.weiyun.com/An8Cylu7 5.1 工具栏菜单插入代码 顶部工具栏点击对应标题可直接插入代码 如果你得代码库非常大 菜单栏加载会影响VBA启动 ...

  • 提取工作表名,函数和vba代码哪个更方便?

    你好,我是刘卓.欢迎来到我的公号,excel函数解析.在工作中,我们有时需要提取出工作簿中所有分表的名字,以方便我们在总表中进行数据的汇总.而提取工作表名既可以用函数,也可以用vba代码.今天就来分享 ...

  • 多工作表数据汇总,无需复杂函数和vba代码,用Alt键三步轻松搞定

    相信大家在用Excel进行数据处理的时候,都会碰到过多工作表数据合并到一张表格的操作.为了方便数据的统计,我们会按日.月等方式单独统计对应时间段的数据,然后再对分表的数据进行汇总操作. 我们需要将1月 ...

  • 【VBA代码宝】- 代码库

    ExcelHome代码库 单击主工具菜单中的[ExcelHome代码库],在弹出的下拉菜单中(如果你熟悉ExcelHome出版的相关VBA书籍的话)就可以一层层选择相应的菜单下的功能,直到找到相关的功 ...

  • VBA代码、自定义函数(人民币金额大写)

    实现功能:把数字金额转换成大写 Excel里面自带函数是可以把数字转换成大写,但是账务需要的是有元.角.分,这样是做不出来的,这个时候就需要我们自己做了. 这只是一个实例,根据这个方法我们可以去完成很 ...

  • excelvba拆分表格视频:编辑vba代码按数据列智能拆分表格

    excelvba拆分表格视频|excel智能拆分表格视频|excel按数据列拆分视频|excel编辑vba代码视频 本视频教程由部落窝教育分享.