各位朋友好,今日我们继续关注"二师兄"的成长,所谓成长,就是一个历程,是一个不断完善自我,不断充实自我的过程。在上一讲中,我们谈到类属性不允许修改的问题,其实这个问题是非常重要的,核心的参数我们要保留自己的修改权,是不能让他人左右的。
为了阻止类的外部使用者,如标准模块1中的代码,随意来修改Pigsy类的Gender属性,我们要学会使用另外一种定义类的属性(Property)的办法。
首先,我们将Public Gender As String 改为Private myGender As String,
这样性别属性就被保护起来,外部使用者无法直接访问了。在我的代码中很多朋友会看到变量的命名都是以my来开始的,这也是我的习惯吧,如myModule,这是向他人说明这个模块是我的,那么变量也是我自己使用的。就是这么简单,没有其他的含义。这样,当myGender这个变量出现在代码的其他地方时,我们一看前缀"my"就知道这是一个我自己定义的变量。或者在若干年后,自己的代码水平提高后,或许不会承认自己曾经写过之前天真低级的代码,但变量的命名规则确实是自己的规则。
现在类的外部使用者再也不能直接访问修改myGender变量了,可我们还是希望外部访问者能获取性别方面的信息,那该怎么弄呢?我们需要学习类模块中对于属性设置的另外的方法了:
Public Property Get
Public Property Let
Public Property Set
这三个语句在之前也给大家讲解过,我们再来回顾一下:Public是公有的意思,有了它,类的外部使用者才能访问。Property是属性的意思。Get是获取,Let是赋值(set是针对对象的赋值)。所以 Public Property Get是获取类的某个属性,Public Property Let是给某个属性赋值。
下面我们修改Pigsy类的代码如下:
Public Name As String
Private myGender As String
Public Situation As String
Public Sub Speak()
Select Case Situation
Case "师父"
MsgBox "八戒"
Case "师兄"
MsgBox "八戒"
Case "非正式"
MsgBox "呆子"
Case "师弟"
MsgBox "二师兄"
Case Else
MsgBox "天蓬元帅"
End Select
End Sub
Private Sub Class_Initialize()
Situation = "师兄"
End Sub
Public Property Get Gender() As String
Gender = myGender
End Property
Public Property Let Gender(inGender As String)
If myGender = "" Then
myGender =inGender
Else
MsgBox "对不起,二师兄不能做性别修改"
End If
End Property
代码解析:上述代码,为类定义了一个获取性别(Gender)的属性。我们直接将类的私有变量myGender的值直接返回给访问者。代码为类定义了一个设置性别(Gender)值的属性。当你给性别赋值的时候,首先会检查myGender的值是否为空字符串,如果是,就直接赋值。如果不是,说明之前已经被赋值过了,就弹出对话框提示不能修改。
说明:实际项目中,一般不会用对话框来提示类的使用者,而是通过触发一个事件的方式来与类的使用者做信息的传递。
这样,性别属性就不再让类的外部使用者随意修改了。你只能为性别赋值一次,你可以叫这种属性为"只写一次属性"。
我们来看看类的使用效果,在模块1中,我们修改代码如下:
Sub MYNZ_31()
Dim objpigsy As pigsy
Set objpigsy = New pigsy
objpigsy.Name = "猪悟能"
objpigsy.Gender = "男"
objpigsy.Speak
MsgBox "修改前性别:" & objpigsy.Gender
objpigsy.Gender = "女"
MsgBox "修改后性别:" & objpigsy.Gender
End Sub
代码解析:mynz过程中首先将给Gender赋值,然后提示用户修改前的Gender,之后进行修改,会提示给用户这个属性是不能修改的,并通过提示给予验证。
类模块截图:
标准模块截图:
下面我们看看代码执行过程中的提示框:
通过这种方式来定义类的属性,我们既能够保护类的私有变量不受到外部使用者的随意修改,也能够提供在我们允许的情况下访问和修改类属性的途径。
作为VBA开发人员,要深入的领会这种属性设置的意义,比如,如果在类中,将Public Property Get去掉,只保留Public Property Let会怎么样?或者反过来,将Public Property Let去掉,只保留Public Property Get又会怎么样?同时我们要注意严谨性,上述文章中提到的"只写一次属性",但是如果你第一次将性别赋值为空字符串"",那么你第二次还能再赋值。如果要设计一个真正的"只写一次属性",你该怎么做?这些问题都是值得我们思考的。
今日内容回向:
1 本讲的"二师兄"有哪些属性发生了改变?
2 "只写一次属性"本讲是如何实现的?
在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!学习VBA是个过程,如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。
"水善利万物而不争",绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,有一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。学习时微而无声,利用时则巨则汹涌。
VBA是利用Office实现自己小型办公自动化的有效手段,我根据自己20多年的VBA实际利用经验,现在推出了五部VBA教程。第一:VBA代码解决方案,是VBA中各个知识点的讲解,覆盖绝大多数的VBA知识点;第二:VBA数据库解决方案,是数据处理的专业利器,详细的介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作。第三:VBA数组与字典解决方案,讲解VBA中的数组和字典的利用。字典是VBA代码水平提高的手段,值得深入的学习。第四:VBA代码解决方案之视频,是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。第五:VBA中类的解读和利用,这是一部高级教程,对于自己理论的提高很有益处。上述教程可以根据1,3,2,5或者是4,3,2,5的顺序逐渐深入的学习和利用。
最后将一阙词送给致力于VBA学习的朋友:浮云掠过,暗语无声,唯有清风,惊了梦中啼莺。望星,疏移北斗,奈将往事雁同行。阡陌人,昏灯明暗,忍顾长亭,多少VBA人,暗夜中,悄声寻梦,盼却天明,怎无凭!
分享成果,随喜正能量
,