Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 6622|回复: 5

[讨论]浅谈代码名(Sheet1)在VBA中的使用

[复制链接]
发表于 2007-12-26 21:24 | 显示全部楼层 |阅读模式
本帖最后由 su45 于 2013-4-5 00:20 编辑

       有时回复他人的帖子时,在对方的附件中编入VBA代码后,能正常运行。可当对方将代码复制到他自己的真实文件中运行就会出错。最后才搞清是Sheet1在作怪,对方由于对Sheet1不是很了解,生搬硬套造成了错误。
Sheet1是什么?要回答这个问题,首先要搞清楚工作表。
       我们都知道,一个工作簿有多个工作表,可每张工作表都有两个名字,就不一定大家都知道了。一个是大家常用的工作表名称,也就是标签上显示的名称(如下图中右边的“567”、“abc”、“aabb”等),它是显性的。另一个则是代码名,而这上名字在工作表窗口是看不到的(如见下图左边的Sheet1、Sheet2……、表一 ),代码名却是隐性的。那么这两个名字有什么区别呢?
       其实它们最大的区别就是可写性。
       工作表名可以随意修改,平常大家都是通过来标签名修改,或用VBA语句来修改,如Sheets(1).Name="abc" ,而且也能用VBA读取该表的工作表名,如 MySheet=Sheets(1).Name  。在VBA中的对象引用时一般是:Sheets("aabb")
       而代码名就不同了,虽然用VBA可以获得一个工作表的代码名,但却不能用VBA代码修改代码名。获取代码名的语句是:MySheet=Sheets(1).CodeName  ,但用Sheets(1).CodeName="abc" 修改代码名是不可以得,因为CodeName是只读的。那么代码名能不能修改呢?可以!但必须在VBA编辑器中通过属性来修改。图中的“表一”就是这样修改的。代码名在VBA中可直接引用,如:Sheet1、表一……。



      由此可见,代码名在一个工作簿中是相对稳定的,不会轻意被改变。
       需要说明的是,两种名字中修改任一个名字都不会影响另一个。即:修改工作表名,代码名不会变;修改代码名,工作表名不会变。
      了解了工作表的这两个名字的不同,我们在VBA编写时也就能正确使用工作表对象了。先看段代码:(见附件)
Sub aa()
    x=Sheets(1).[A1]       '用Sheets的index值确定工作表对象
    y=Sheet1.[A1]          '用工作表代码名来确定工作表对象
    z=Sheets("567").[A1]   '用工作表名来确定工作表对象
    r = 表一.[A1]          '用工作表代码名来确定工作表对象
    End Sub
表中[A1]的值是:12345
运行后,在一般情况下,x、y、z的值都是12345 ,但当你第一个表拖到最后时,运行的结果就不一样了,此时,x的值就不是12345了,而y和z的值仍是12345,原因是Sheets(1)是所有工作表中的所显示的第一张表;当你将名为“567”的表名改为“789”时,第三句代码就会出错,因为已经没有“567”这个表了。而y值仍是12345。
       通过实例,我们可得出以下结论表:

以上是本人体会,不妥之处望指正。



OyCrF80h.rar (5.19 KB, 下载次数: 47)
发表于 2007-12-26 22:18 | 显示全部楼层
回复

使用道具 举报

发表于 2007-12-26 23:17 | 显示全部楼层
回复

使用道具 举报

发表于 2007-12-26 23:23 | 显示全部楼层

谢谢共享
回复

使用道具 举报

发表于 2010-11-12 22:51 | 显示全部楼层

有个小错误,代码名也是可以在程序中修改的

Sub ChageWksObjectName()
   Dim ws As Worksheet
   Dim sPrevCodeName As String
   Dim sNewCodeName As String
   '设置新对象的名称
   sNewCodeName = "ws_main"
   '增加新工作表
   Set ws = Worksheets.Add
   '获取新增工作表的对象名称
   sPrevCodeName = ws.CodeName
   '变化新增工作表的对象名称
   ThisWorkbook.VBProject.VBComponents(sPrevCodeName). _
   Properties("_CodeName") = sNewCodeName
End Sub
‘- - - - - - - - - - - - - - - - - - - - - -
Sub Test()
   ws_main.Range("A1").Value = "This is it!"
End Sub

[此贴子已经被作者于2010-11-12 22:51:24编辑过]
回复

使用道具 举报

发表于 2014-4-9 11:20 | 显示全部楼层
ThisWorkbook.VBProject.VBComponents(sPrevCodeName). _
   Properties("_CodeName") = sNewCodeName

在执行中需要激活"ThisWorkbook.VBProject.VBComponents"才能自动执行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-9 02:58 , Processed in 0.253715 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表