1、默认属性

VB6.0有默认属性的特性。当没有给对象指定具体的属性时,"默认属性"是VB6.0将使用的属性。在某些情形下,省略常用属性名,使代码更为精简。

因为CommandButton的默认属性是Value,所以下面两句代码是等价的:

 Sub Test()
Debug.Print UserForm1.CommandButton1 '输出Falue
Dim a
a = UserForm1.CommandButton1
Debug.Print a '输出False
End Sub

而从F2对象浏览器中,可以看到Value确实是CommandButton的缺省成员(默认属性)——属性图标也和其它不同,左上角多了一个小圆圈。

另一些情况,假如我们需要的是对象本身,而不是它的某个属性,比如我们想要把CommandButton1这个对象本身赋值给一个变量,就要使用Set “显式” 声明:

 Sub Test()
Dim cmd As MSForms.CommandButton
Set cmd = UserForm1.CommandButton1
End Sub

当一个对象不存在默认属性,获得对象本身是否需要使用set?答案是肯定的,将一个对象赋值给变量,必须使用Set关键字:Set a = Sheet1

2、动态数组Variant

     定义动态数组:(没有初始化长度)

Dim arr() As Integer '元素为整型的动态数组

Dim brr() As Variant '元素为variant类型的动态数组

Dim crr() '元素为variant类型的动态数组

动态数组的特性之一:可被同一类型的静态数组初始化(赋值)

 Sub Test()
Dim arr() As Integer
Dim brr( To ) As Integer '静态数组
brr() =
brr() =
brr() =
arr = brr
Dim crr() As Variant
Dim drr( To ) As Variant
drr() =
drr() = True
drr() = "张三"
crr = drr
End Sub

如果静态数组和动态数组的元素类型不一致,则产生错误。下面的代码报编译错误“不能给数组赋值”。

1 Sub Test()
2 Dim arr()
3 Dim brr(1 To 3) As Integer
4 arr = brr '不能给数组赋值
5 End Sub

3、利用Range的Value属性和Variant()接收单元格区域的值

Range是一个区域时,它的Value返回一个静态Variant(),而动态Variant()是可是接收这个返回值的。

 Sub Test()
Dim arr()
arr = Range("A1:A5").Value
arr = ThisWorkbook.Worksheets().Range("A1:A5").Value
End Sub

实际写VBA代码时,更多是像下面这样,使用variant变量达到相同效果:

 Sub Test()
Dim arr
arr = Range("A1:A5")
arr = ThisWorkbook.Worksheets().Range("A1:A5")
End Sub

这样的写法没有属性的显式调用,可能许多人会认为利用了Range对象的默认属性,这个默认属性会让人觉得是Value或Value2。

4、Range对象的默认属性是什么?

入门VBA的时候,绝多数人都说Value是Range对象的默认属性,所以下面这样写,大多数人认为是省略Value的写法:

1 Sub Test()
2 Dim arr()
3 arr = Range("A1:A5")
4 End Sub

       而这个说法有可能是错的。实际上,可能_Default 才是Range的默认属性

1、_Default属性两个参数都是可选的。意味着两个参数都可以没有。而这个属性的返回值没有定义,意味着它可以是Variant()或Variant。

2、Range("A1")和Range("A1").Value,从截图中可猜测上例的情况并不是省略了Value的写法。

3、_Default是Range对象的默认属性,而且是没有名字的。(仅仅是推测,可以有不取名字的属性么?)

推测证据1:

[题外话:worksheets也有一个_Default默认属性,事实上,发现集合类对象几乎都有_Default默认属性(用作索引)。可自行求证]

下面这些写法是成立的:

Debug.Print Range("A1:A5")(2, 1)

Debug.Print Range("A1:A5")(1)

推测证据2:

我们常用Cells(index,index)的方式表示一个单元格。那这个表示法是从何而来呢?Cells属性本身并没有参数,见图:

但Cells属性返回的是Range对象,Range对象的默认属性即_Default:

5、Object类型和一个保留问题
     
使用默认属性常常会见到这样的问题:

正常运行的代码A

 Sub Test1()
Dim arr()
arr = Range("A1:A5")
End Sub

正常运行的代码B :

 Sub Test2()
Dim arr
arr = ThisWorkbook.Worksheets().Range("A1:A5")
End Sub

 运行会报错的代码C

 Sub Test3()
Dim arr()
arr = ThisWorkbook.Worksheets().Range("A1:A5")
End Sub

上面的写法均省略了默认属性。(是Value?   还是_Dafault?)

B和C等式右边的表达式是完全相同的。但在运行时,arr可以正常赋值,arr()就会报错。

需要留意的是,Worksheets(1)的类型是Object,不是一个强类型。arr()遇到Object.Range(),正是这种情况会出现问题,而不能正常解析的问题原因没找出。

上面报错的代码,如果换一种方式,先声明一个显式类型Worksheet,问题就解决了。

 Sub Test4()
Dim arr()
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets()
arr = sht.Range("A1:A5")
End Sub

6、自定义类的默认属性 

如何在自己类中定义默认属性呢?

VB6实现:(一个对象只能有一个默认属性)

步骤1:在写好属性过程后,然后点击工具—过程属性

步骤2:在过程属性中,选择要设置为默认属性的名称,点选高级,最近设置过程标识符为“缺省”

VBA实现:

   方法: 将类模块代码导出,使用文本编缉器(比如notepad)修改代码,然后重新导入VBA类模块。

案例:写一个Person类,有一个属性叫P_name,现在想要设置它为Person类的默认属性。

 Private name As String

 Public Property Get P_name() As String
P_name = name
End Property Public Property Let P_name(ByVal vNewValue As String)
name = vNewValue
End Property Private Sub Class_Initialize()
name = "张三"
End Sub

1、导出类文件到本地,默认文件名为:Person.cls
    2、使用文本编缉器打开。(文字涂灰的部分是自动生成的)
    3、修改属性过程代码,在P_name属性过程中添加一句:Attribute P_name.VB_UserMemId = 0
    4、将修改后的cls重新导入类模块。

 VERSION 1.0 CLASS
BEGIN
MultiUse = - 'True
END Attribute VB_Name = "Person"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False Private name As String Public Property Get P_name() As String
Attribute P_name.VB_UserMemId = 0
P_name = name
End Property Public Property Let P_name(ByVal vNewValue As String)
Attribute P_name.VB_UserMemId = 0
name = vNewValue
End Property Private Sub Class_Initialize()
name = "张三"
End Sub

使用:

 Sub Test()
Dim p As New Person Debug.Print p
'Debug.Print p.P_name p = "李四" '直接给对象赋值(实际赋值给了默认属性)
Debug.Print p
'Debug.Print p.P_name End Sub

VB默认属性、动态数组、Range对象的默认属性的一点不成熟的想法的更多相关文章

  1. props default 数组/对象的默认值应当由一个工厂函数返回

    export default {props: { slides:{ type:Array, default:[] } },这是我的代码 报错是Invalid default value for pro ...

  2. Invalid default value for prop "value": Props with type Object/Array must use a factory function to return the default value.(props default 数组/对象的默认值应当由一个工厂函数返回)

    Invalid default value for prop "value": Props with type Object/Array must use a factory fu ...

  3. 关于props default 数组/对象的默认值应当由一个工厂函数返回

    export default {props: { xAxisData: {   type: Array,   default: [] }, },这是我的代码 报错是Invalid default va ...

  4. VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

    在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10")  VB的语法,使用参数的不一定是方法,也有可能是属性 ...

  5. Vue 父组件传递给子组件,设置默认值为数组或者对象时

    在vue 父子组件传参过程中,传递对象或者数组时,设置默认值为{}或者[] 错误写法: props: { pos: { type: [Object, Array], default: []//这是错误 ...

  6. Initialize a Property After Creating an Object创建对象后初始化属性 即如何设置对象的默认值(EF)

    In this lesson, you will learn how to set the default value for a particular property of a business ...

  7. js 对象数组根据对象中的属性排序

    function createComparisonFunction(propertyName){ return function(object1,object2){ var value1 = obje ...

  8. js深入研究之克隆,属性,数组,对象,函数

    代码 <script type="text/javascript"> /* 克隆原型得到对象 */ function clone(object) { function ...

  9. vue prop不同数据类型(数组,对象..)设置默认值

    vue prop 会接收不同的数据类型,这里列出了 常用的数据类型的设置默认值的写法,其中包含: Number, String, Boolean, Array,  Function, Object   ...

随机推荐

  1. ios监听键盘弹出 频幕位置改变

  2. VSCode+Ionic+Apache Ripple开发环境搭建

    vscode作为一个轻量级编辑器,有其独特的魅力. 安装Ionic:npm install -g ionic 安装Apache Ripple模拟器: npm install -g ripple-emu ...

  3. XEP-0078:非SASL认证

    XEP-0078:非SASL认证 抽象: 这个文件规定了使用Jabber的Jabber的服务器和服务认证的协议:智商:AUTH命名空间.注意哦:本文规定的协议,取而代之的SASL认证的被取代,如RFC ...

  4. MWeb 2.0 测试版可以下载啦,这次是公开测试,感兴趣的朋友可以试试

    2.0 版是 MWeb 发布以来,最重要的一个版本.MWeb 自去年一月份发布以来,获得了很多朋友的建议,在此非常感谢!没有你们,2.0 版可能就不能出来!然后再次感谢 Producter: http ...

  5. win8.1 Framework3.5安装不上的问题

    问题症状:安装的WIN8系统无法安装Framework,SQL等都有问题 解决误区:直接安装或者更新后在线安装(结果一样各种错误) 解决方法: 1.先gpedit.msc进入本地组策略管理,目录:计算 ...

  6. Linux系统安装

    http://soft.chinabyte.com/os/447/12439447.shtml     磁盘分区 http://www.huaweigold.com/doc/ServerDOC-201 ...

  7. C++数组实现的循环队列

    #include<iostream> #include <string> /* 功能:数组实现的循环队列,C++实现,学习参考 */ using namespace std; ...

  8. 用mac系统制作mac系统启动盘

    1.找一个大于8G的U盘,最好3.0接口 2.将U盘插入电脑,打开电脑的磁盘工具,将其抹去为“Mac OS扩展”格式,名称随意 3.下载一个mac系统dmg镜像 4.在系统中打开镜像 5.打开终端,输 ...

  9. 获取浏览器信息 c#

    Request.Browser.MajorVersion.ToString();//获取客户端浏览器的版本号 Request.Browser.Version.ToString();//获取客户端浏览器 ...

  10. 二十一、Java基础--------IO流之综合案例分析

    前三篇文章详细介绍了IO流体系所涉及的重点内容,为了帮助理解与学习,本片博客主要是分析一个与IO操作相关的题目. 例1:在我们观看视频时经常要关注的就是视频的时间长度,在学习了IO操作之后,就可以自己 ...