各位朋友好,我们今天继续关注二师兄的成长之路。在上一讲中,我们讲了用Property Get和Property Let(set)定义类的属性,这样可以获得更多的灵活性,在我们的类pigsy中有Gender(性别)属性使用了这种定义方式,本讲,我们将继续完善其他类的属性,同时给大家揭示更多关于类的属性方面更深层次的问题。虽然有一定的难度,我尽可能把这些内容以非常容易的方式讲解给大家。
一Name(姓名)属性我们将它的声明按照Gender属性的方式从Public(公有)改为Private(私有),同时使用变量命名规则将Name改名为myName。如下的代码:
Private myName as String
有了这样的一个私有模块级变量后,我们就有了一个存储属性数据的宿主(或者称之为容器)接下来,我们要定义Name(姓名)的读取属性(Property Get)
Public Property Get Name() As String
Name = myName
End Property
其实这里代码的意义就是将宿主myName中的数据传递给Name的过程。
接下来我们为Name(姓名)定义赋值属性(Property Let)。设计之前,我们要考虑下,是否要对Name赋值的时候,做任何约束。比如,是否要检查一下赋值的有效性?一般中国人的姓名都在4个字以下,对超过4个字的情况,是否要弹出错误提示框?另外,姓名被赋值一次后,是否允许再被第二次赋值?这些都是在设计之前要考虑的问题。这里我们就只检查一下超过4个字的情况。
Public Property LetName(lnName As String)
If Len(lnName)
myName = lnName
Else
MsgBox "姓名不能超过4个字符"
End If
End Property
代码截图:
代码的解析:上述代码为name属性赋值,赋值是将一个变量传递进来,所以我用了lnName这样的变量作为传入的数据,传入数据后我要对数据进行校验。如果校验通过,那么将传进来的数据放到宿主中,以便在读取的时候取出。如果不通过则提示给用户信息。
二添加一个DOB(出生日期Day Of Birth)属性
为了让我们的pigsy类更加接近现实,我们给它添加另外一个日期类的属性:DOB是指出生日期(Day Of Birth的缩写)。同样我们定义一个变量(大家要记住这个变量是宿主,或者叫容器,目的就是为了在类模块中装一下数据)如下
Private myDOB As Date
我们顺便可以考虑一下上节我们提到的“只赋值一次”的问题,考虑给出生日期定义赋值属性,这里,我们要实施真正的“只赋值一次”。我们不能依赖myDOB的值去判断是否已经赋过值了,因为我们可以赋一个零值。在实际项目中,我们要使用布尔(Boolean)变量作为是否赋过值的标志(Flag)。
出生日期的赋值属性定义如下:
Public Property Let DOB(lnDOB As Date)
Static myFlag As Boolean
If myFlag = False Then
myFlag = True
myDOB = lnDOB
End If
End Property
代码解析:我们使用静态(Static)布尔变量myFlag作为一个开关,所有布尔变量的初始值都为否(False),所以第一次给出生日期赋值的时候,myFlag为False,判断条件myFlag=False获得通过,紧接着将这个开关的值设置为True,然后将新的出生日期赋值给模块级的私有变量宿主myDOB。第二次给出生日期赋值的时候,静态变量myFlag的值是True,判断条件myFlag=False就不再能通过了。这样就彻底的保证了出生日期属性只能写一次。
特别注意点:这里必须使用静态变量,因为一般的变量在赋值子程序执行完毕后,值就被丢弃了。静态变量能将值一直保留在内存中,直到整个类对象被释放为止。
出生日期的赋值属性搞定以后,我们来考虑一下它的读取属性。我们读取一个日期,很多情况下,都是需要把它显示出来,日期的显示有很多的格式,例如2019年7月22日,2020年07月22日,2019-7-2,2020/7/2,2019/07/02等等。我们可以在读取属性的同时将它的显示格式也确定下来。我们用字符串类型来返回读取属性。
代码如下:
Public Property Get DOBA() As String
DOBA = Format(myDOB,"YYYY年mm月dd日")
End Property
代码解读:看到我上面的代码,细心的朋友会发现,老师,怎么又多了一个DOBA的属性啊?对的,我们特意增加的,那么为什么不直接用DOB这个属性呢?这个问题在本讲的最后会给大家以解答,这里可以先思考一下。
这里DOB和DOBA就是两个不同名字的属性,它们都是围绕着类的私有变量myDOB来读写。DOB只定义成赋值属性,只能出现在赋值号(=)左边,否则的话,编译报错:属性的无效使用。DOBA定义成了读取属性,只能出现在赋值号(=)右边,否则的话,编译报错:不能给只读属性赋值。我们也可以将DOB理解为只写属性,DOBA理解为只读属性。这样对于上一讲的内容关于使用Property Get和Property Let(set)的灵活性方面,这讲也进行了讲解。好了,我们下一讲继续。
1如何设置真正的“只赋值一次”的属性?
2为什么要引入DOBA的属性呢?
在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!学习VBA是个过程,如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。
“水善利万物而不争”,绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,有一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。学习时微而无声,利用时则巨则汹涌。
VBA是利用Office实现自己小型办公自动化的有效手段,我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了五部VBA专门教程。
第一套:VBA代码解决方案是VBA中各个知识点的讲解,覆盖绝大多数的VBA知识点,初学必备;
第二套:VBA数据库解决方案数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作。
第三套:VBA数组与字典解决方案数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习。
第四套:VBA代码解决方案之视频是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。
第五套:VBA中类的解读和利用这是一部高级教程,讲解类的虚无与肉身的度化,可以对促进自己理论的提高。
学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。我的上述教程是我多的经验的传递,大家可以根据1,3,2,5或者是4,3,2,5的顺序逐渐深入的逐渐学习。
最后将一阙词送给致力于VBA学习的朋友:
浮云掠过,暗语无声,唯有清风,惊了梦中啼莺。
望星,疏移北斗,奈将往事雁同行。
阡陌人,昏灯明暗,忍顾长亭。
多少VBA人,暗夜中,悄声寻梦,盼却天明。
怎无凭!
分享成果,随喜正能量
领取专属 10元无门槛券
私享最新 技术干货