关于Excel的隐藏名称空间
这个被隐藏的名称空间是一个属于当前Excel实例的内存区域,该区域加载项DLLs(“XLLS”)能存储临时的名称。使用这个区域,即使没有可利用的宏工作表可用,XLLs也能定义名称。
隐藏着的名称操作基于XLM函数SET.NAME、GET.NAME和EVALUATE,而且当在XLM宏工作表中使用时,SET.NAME定义一个标准的工作表级名称,同时,当它在XLL中被调用时,创建一个应用程序级名称并且存储在一个被隐藏的区域中。
定义在被隐藏区域的名称有一些特殊的功能,这使得它们与标准工作簿名称有很大的不同。这些功能将在后面描述。
与隐藏着的名称相关的可用C API命令如下:
Excel4(xlfSetName,&xResult,2,&xName,&xValue),定义包含xValue的名称xlName。
Excel4(xlfGetName,&xResult,1,&xName),获取xlName的定义(例如”=1”)并将它存储在xResult中。
Excel4(xlfEvaluate,&xResult,1,&xName),获取xlName的内容(例如:1)并将它存储在xResult中。
Excel4(xlfSetName,&xResult,1,&xName),删除xName(忽略第二个参数)。
在VBA中访问被隐藏的名称空间
(1) 创建一个隐藏的名称
下面的语句创建一个包含字符串“OK”的名为Test的隐藏名称:
Application.ExecuteExcel4Macro "SET.NAME(""Test"",""OK"")"
(2) 获取一个隐藏名称所代表的内容
为了获取名称Test所代表的内容,使用下面的代码:
TestVal = Application.ExecuteExcel4Macro("Test")
注意,只使用名称本身作为ExecuteExcel4Macro的参数。
(3) 删除一个隐藏的名称
为了删除名称Test,使用下面的语句:
Application.ExecuteExcel4Macro "SET.NAME(""Test"")"
注意,忽略了SET.NAME中的第二个参数。
被隐藏的名称空间的特征
在被隐藏的名称空间中所定义的名称的主要特征是:它们不属于任何工作簿,而属于应用程序本身,这意味着:
(1)在Excel中的任何地方可以直接访问这些名称。无论在哪个工作簿中创建了这种名称,在任何工作簿中的任何VBA模块、工作表或宏工作表(和任何DLL加载项)中直接都能直接读取和修改它们。
(2) 它们的“生存时间”与当前Excel会话一致
如果在工作簿Wbk1.xls中的某个VBA模块中创建了一个名称,然后关闭了这个工作簿,那么该名称仍然存储在被隐藏的命名空间中。如果接着打开另一个工作簿Wbk2.xls,那么这个工作簿的VBA过程仍能获取和修改刚才在Wbk1.xls中所创建的名称。在没有被任何VBA加载项所限制的情况下,在被隐藏的名称空间中所定义的名称能作为永久的“公共变量”访问。
对于这些属于应用程序的隐藏的名称,关闭所有工作簿和加载项不会销毁它们。通过对SET.NAME(没有第二个参数)明确的调用或者退出并重启Excel,才能销毁它们。在这种情况下,这些名称能作为一种Excel的环境变量来使用。
(3) 它们是“完全隐藏着的”
当一个受保护的加载项使用这个隐藏的名称空间时,新的名称不能被任何其它的VBA模块读取,也不能被用户读取,除非他们知道名称空间的身份证书。没有方法去“列出”被定义在隐藏命名空间中的名称。
这些名称无须与标准的隐藏名称(即将工作簿或工作表名称的.Visible属性设置为False)相混淆。标准的工作簿级的名称决不会真正的被隐藏,因为它们能通过使用Application.Names集合的任何VBA过程来获取和修改,如下面的代码所示:
Dim CName As Name
  For Each CName In Workbooks("Wbks1.xls").Names
    If CName.Hidden Then
        MsgBox CName.Name & " deleted"
        CName.Delete
    End If
  Next CName
上面的代码在工作簿Wbks1.xls所有隐藏的名称中循环并删除它们,但是这些代码不能发现存储在被隐藏的命名空间中的名称,因为这些名称不属于Application.Names集合,因此,它们被保护以反对任何恶意的访问或修改。
示例
下面的代码演示了在受保护的VBA加载项中隐藏着的命名空间的可能的用途。
它限制用户在相同的Excel会话中执行加载项主过程超过3次。允许剩余执行次数的计数器没有存储在模块级的变量中,也没有存储在依赖加载项的名称中,而是存储在隐藏的命名空间里。通过排除了传统方法的下列缺点,隐藏的命名空间阻止了用户能够中止保护。
(1) 像所有变量一样,存储在VBA中的计数器变量能在VBE中手动清除。
(2) 同样的方式,任何外部过程通过在加载项的Names集合中循环,都可以读取、修改和可能删除加载项中所有隐藏的或未隐藏的工作簿名称。
但是,隐藏的命名空间避免了这些危险。它也比使用基于环境字符串的实例、临时文件或注册进入等方法更简单,而且隐藏的命名空间是永久的,用户能关闭和重新打开该工作簿而无须重新设置这个计数器。
在这个代码中,函数SetHName、GetHName和DelHName可以创建、获取和删除隐藏的名称,而不需要直接使用冗长的Application.ExecuteExcel4Macro方法。
代码清单如下:
Sub Main()
  Application.EnableCancelKey = xlDisabled
  Dim Count
  Count = GetHName("TswbkCount")
  If IsError(Count) Then
    SetHName "TswbkCount", 3
  ElseIf Count = 1 Then
    MsgBox "Macro disabled. You must restart Excel.", vbInformation
  Else
    SetHName "TswbkCount", Count - 1
  End If
End Sub
Sub SetHName(Name As String, Value)
  Application.ExecuteExcel4Macro _
    "SET.NAME(""" & Name & """," & Value & ")"
End Sub
Function GetHName(Name As String)
  GetHName = Application.ExecuteExcel4Macro(Name)
End Function
Sub DelHName(Name As String)
  Application.ExecuteExcel4Macro "SET.NAME(""" & Name & """)"
End Sub

名称的秘密:Excel中隐藏着的名称空间相关推荐

  1. 【小米校招笔试】在Excel中,列的名称是这样一个递增序列:seq={A、B、C、... Z、AA、AB、AC、... AZ、BA、BB、BC、... BZ、CA、... ZZ、AAA、AAB...

    2016年小米校招笔试第一题(成都站) 1 在Excel中,列的名称是这样一个递增序列:seq={A.B.C....  Z.AA.AB.AC.... AZ.BA.BB.BC.... BZ.CA.... ...

  2. excel公式单元格注释_如何在Excel中隐藏注释,公式,溢出文本和网格线

    excel公式单元格注释 We've shown you how to hide cells, rows, and columns and how to hide worksheets/tabs an ...

  3. 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王 猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值

    有一个数列:白眉鹰王.金毛狮王.紫衫龙王.青翼蝠王 猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值 如果有多个查找结果,都找出来 ...

  4. 列注释_【EXCEL检查问题】:如何快速检查并删除EXCEL中隐藏的工作表、行、列等信息...

    前注:本案例是以EXCEL2016为示范软件,各版本的部分功能和路径可能不同 在EXCEL使用过程中,你是否遇到过某一列的公式怎么修改都报错的情况?你是否遇到过一个只有区区几行数据的表格,却占用了好几 ...

  5. 如何按指定名称快速导出Excel中的图片?

    照例举个例子.如下图所示,工作表中存在多张图片,现在需要将其导出,并按图片向左偏移一个单元格,也就是A列单元格的值进行命名. 导出后结果如下图所示: 如果不追求规范图片命名,只是导出Excel中的图片 ...

  6. [excel]删除excel中隐藏的双引号(用的WPS)

    一.CLEAN函数 语法结构: CLEAN(text) 参数text为需要从中删除非打印字符的工作表信息. CLEAN函数可以删除文本中含有的当前操作系统无法打印的字符,包括换行符. 二.需求,去掉A ...

  7. 怎样才能将Excel中隐藏的列显示出来

    Excel是一款强大的办公软件,其中隐藏行列就是比较方便的一个小功能,但是如果不会灵活运用,则会出现"隐藏容易显示难"的窘境,下面就列举几个方法说明说如何简单的隐藏行和如何取消隐藏 ...

  8. 如何将Excel中隐藏的列显示出来

    作者:iamlaosong        第一种方法:直接法 比如,您的BC两列被隐藏了,只能看到ADEF--列了. 那么,请您选择A列,然后按照SHIFT键,一直选择到D或E列,之后,在选中状态下点 ...

  9. excel中隐藏列,隐藏行,增加列,取消隐藏,调节列宽

    隐藏列:ctrl+shift+右键 然后点击右键取消隐藏 隐藏行:ctrl+shift+下键盘,然后点击右键取消隐藏 调节列宽的时候要注意表格全部选中以后要在首行点击右键. 行就好操作了 加列的快捷键 ...

最新文章

  1. 用python写通用restful api service(一)
  2. 素数问题是物质的几何学问题
  3. 工业用微型计算机(17)-指令系统(12)
  4. Java 7:使用NIO.2进行文件过滤–第3部分
  5. C语言课后习题(35)
  6. 二分查找(Java实现)
  7. SQL Server 2005 安装后,没有Management Studio管理工具的解决办法
  8. IPV6 Socket编程
  9. matlab 直方图 肥尾,概率分布细谈:厚尾、长尾、幂律、指数
  10. 我国常用的微型计算机是,2013云南省全国计算机等级考试二级笔试试卷VB理论考试试题及答案...
  11. Windows下PyMC安装
  12. java获取指定属性名_获取指定属性名的属性值简易方法
  13. 「网络流 24 题」负载平衡
  14. Esp8266+ssd1306液晶屏+microPython
  15. comsol 5.3 matlab,COMSOL5.3在Linux下的安装
  16. 【技术贴】Windows图片和传真查看器打开图片慢,正在生成预览的解决办法!
  17. [论文阅读] 对话式推荐系统的进展与挑战:综述(Advances and Challenges in Conversational Recommender Systems: ASurvey)-01
  18. Python简洁出入库系统(批量出入库)
  19. 手表无线充电控制芯片方案的原理分析主控SOP8外置挂个AO3400或SI2302
  20. android撕衣服案例解析

热门文章

  1. 基于鲁棒-距离平衡和基于学习的人工蜂群的强大优化算法(Matlab代码实现)
  2. 从一个微服务应用的成功落地,谈企业需要什么样的微服务治理
  3. Android系统状态栏的信号图标显示流程简介
  4. vst开启语音服务器,VST语音遥控器体验记
  5. 我读《高效能人士的七个习惯》
  6. SpringBoot集成SwaggerUI及其使用
  7. python中使用大写字母来分割字符串
  8. 女人长的漂亮不如活的漂亮(Top60)
  9. 火狐浏览器修改默认搜索引擎和添加搜索引擎
  10. CDN真的有用吗?效果好不好