Excel精英培训网

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

[已解决]不明白空数组是什么概念

[复制链接]
发表于 2008-12-19 10:18 | 显示全部楼层 |阅读模式

在提空数组前,讲师告诉我们的是:

  1. 数组默认下标下界是0
  2. 下标上界比下标下界大

在看split函数时,帮助有这么段:

expression必需的。包含子字符串和分隔符的字符串表达式 如果expression是一个长度为零的字符串(""),Split则返回一个空数组,即没有元素和数据的数组。

我试了试:

Sub cc1()
Dim s1 As String
Dim s2
s1 = ""
s2 = Split(s1)
Stop
End Sub

不明白空数组是什么概念

不明白空数组是什么概念

问题,对这2个圈不明白:

  1. 绿圈,variant/string,这样合在一起,表示什么意思啊?
  2. 红圈,为什么会是0到-1呢?那样,不是与紫色文字矛盾吗?

谢谢!!

最佳答案
2008-12-19 12:57

我觉得:

1、Variant/String 是因为你没有设定s2的数据类型,所以系统会把他设置为Variant,但s2的值是"",所以是string类型,因为s2是个变量,你也可以把它赋值为不是string类型的值,所以会显示Variant/String.

2、(0 to -1),就是表示空数组的意思,里面没有任何的元素。

split:包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(""),Split则返回一个空数组,即没有元素和数据的数组。

如果把程序改为:

Sub cc1()
Dim s1 As String
Dim s2
s1 = ""
s2 = Split(s1, "")
MsgBox UBound(s2)
End Sub

这个时候ubound(s2)=0,这个时候该数不是空,所以判断一个数组是否为空,可以判断UBOUND是否等于-1。

3、至于“下标上界比下标下界大。”我怎么没听说过呢,等于UBOUND(S2)=0的时候也不比下界大啊!有可能老师讲的时候是指当时的那个例子,并不代表所有的情况!

不知我的理解是否正确!

[em04]
发表于 2008-12-19 11:29 | 显示全部楼层

相当于s2 = Split(s1, "") 和s2 = Split(s1, " ")的区别

s2 = Split(s1)就是s2 = Split(s1, " ")的简写

真空和假空的区别,真空为0,假空占了一位空格,就出错了

[此贴子已经被作者于2008-12-19 11:35:24编辑过]
回复

使用道具 举报

发表于 2008-12-19 12:03 | 显示全部楼层

问题1:Dim s2,故s2为variant,s2 = Split(s1)后,当前s2成了string,如果再来个s2 = True的话s2又成了boolean。体现出s2的variant。相应的Dim s1 As String,无论给s1赋什么值,它都是string

问题2:数组的下标下界默认为0,上界大于下界。这是没问题的。Split返回一个下标从零开始的一维数组,也是没问题的。对于0 to -1大约VBA中就是这样来表示空数组的吧(这点我不是很确定)

回复

使用道具 举报

 楼主| 发表于 2008-12-19 12:04 | 显示全部楼层

还是不明白,明明是s2 = Split(s1),即s2 = Split(s1, " ")

为什么要和s2 = Split(s1, "") 比较?这样比,和本题有什么关系呢?1楼代码也没错啊,只是对S2很迷惑,才发问,s2就是帮助里所称的空数组吗

expression(s1)是一个长度为零的字符串("")时,Split则返回一个空数组(s2)。通过本地窗口发现,既然s2是帮助所说的空数组,怎么还会是0 to -1呢?(红圈内)

[此贴子已经被作者于2008-12-19 12:05:04编辑过]
回复

使用道具 举报

发表于 2008-12-19 12:11 | 显示全部楼层

上面黄字的解释是对s2 = Split(s1, "") 的解释,

s2 = Split(s1)是s2 = Split(s1, " ")的简写

s2 = Split(s1)同s2 = Split(s1, "")是两回事

这样解释不知能否明白

回复

使用道具 举报

发表于 2008-12-19 12:57 | 显示全部楼层    本楼为最佳答案   

我觉得:

1、Variant/String 是因为你没有设定s2的数据类型,所以系统会把他设置为Variant,但s2的值是"",所以是string类型,因为s2是个变量,你也可以把它赋值为不是string类型的值,所以会显示Variant/String.

2、(0 to -1),就是表示空数组的意思,里面没有任何的元素。

split:包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(""),Split则返回一个空数组,即没有元素和数据的数组。

如果把程序改为:

Sub cc1()
Dim s1 As String
Dim s2
s1 = ""
s2 = Split(s1, "")
MsgBox UBound(s2)
End Sub

这个时候ubound(s2)=0,这个时候该数不是空,所以判断一个数组是否为空,可以判断UBOUND是否等于-1。

3、至于“下标上界比下标下界大。”我怎么没听说过呢,等于UBOUND(S2)=0的时候也不比下界大啊!有可能老师讲的时候是指当时的那个例子,并不代表所有的情况!

不知我的理解是否正确!

[em04]
回复

使用道具 举报

发表于 2008-12-19 13:27 | 显示全部楼层

因为Split函数返回一个下标从零开始的一维数组,如果返回的数组的上标为0,也即UBound(s2)=0的时候,说明它有一个元素存在;如果返回的数组的上标为3,也即UBound(s2)=3的时候,说明它有四个元素存在。

所以VBA就用了UBound(s2)=-1来表示空数组了。

回复

使用道具 举报

发表于 2008-12-19 13:30 | 显示全部楼层

学习了[em02]
回复

使用道具 举报

发表于 2008-12-19 13:40 | 显示全部楼层

QUOTE:
以下是引用皮皮1998在2008-12-19 12:57:00的发言:

我觉得:

1、Variant/String 是因为你没有设定s2的数据类型,所以系统会把他设置为Variant,但s2的值是"",所以是string类型,因为s2是个变量,你也可以把它赋值为不是string类型的值,所以会显示Variant/String.

2、(0 to -1),就是表示空数组的意思,里面没有任何的元素。

split:包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(""),Split则返回一个空数组,即没有元素和数据的数组。

如果把程序改为:

Sub cc1()
Dim s1 As String
Dim s2
s1 = ""
s2 = Split(s1, "")
MsgBox UBound(s2)
End Sub

这个时候ubound(s2)=0,这个时候该数不是空,所以判断一个数组是否为空,可以判断UBOUND是否等于-1。

3、至于“下标上界比下标下界大。”我怎么没听说过呢,等于UBOUND(S2)=0的时候也不比下界大啊!有可能老师讲的时候是指当时的那个例子,并不代表所有的情况!

不知我的理解是否正确!

[em04]

答的非常棒,如果用s2 = Split(s1, "") 来套,只能说就是解释数组为空的一个例外。一般情况下被劈的有参数,省略为一个空格符号。

[此贴子已经被作者于2008-12-19 13:40:54编辑过]
回复

使用道具 举报

发表于 2008-12-19 13:45 | 显示全部楼层

学习了,在控件中未被选中index都是以-1 表示。这个也类似。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 17:03 , Processed in 0.680487 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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