|
我是用的一个达人的函数来完成这一功能。我一直都用这个函数。。与各位分享。。
转自:http://www.moon-soft.com/program/bbs/readelite252123.htm
如何给数组一次性赋值
假设我要做这样一个功能,就是告诉用户今天是星期几,一般思路会是这样的。
Public Sub GetWeekDay()
Dim aWeekInfo(1 To 7) As String
Dim n As Long
aWeekInfo(1) = "星期日"
aWeekInfo(2) = "星期一"
aWeekInfo(3) = "星期二"
aWeekInfo(4) = "星期三"
aWeekInfo(5) = "星期四"
aWeekInfo(6) = "星期五"
aWeekInfo(7) = "星期六"
n = WeekDay(Now)
MsgBox "今天是" & aWeekInfo(n)
End Sub
看到没有,VB里无法象C那样在定义时就给数组赋值,于是只好一个一个的给。这里给了例子才7个,如果我还要告诉用户今年的生肖呢?那么还要定义一个生肖的数组,然后给数组赋值,那是12个。
那么,我们有没有办法给数组一次性赋多个值呢?比如这样赋值:
Call SetArrayData(WeekInfo(), "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")
答案当然是可以的。我们要自己写个赋值函数。
考虑到下面两个情况:
1、数组类型可以是任意的,比如可以是字符串或数字
2、数组长度也是未知的。
于是,我们得用到可变参数。
Public Sub SetArrayData(ParamArray All()) '这里用方法是因为可以不要返回值
从功能需求上,知道第一个参数应该是数组。
Dim aL As Long, aU As Long, aNo As Long
'定义成Long的原因:
'PC上无需在乎这么一点点的内存开销
'在32位的VB中Long的运算要比Integer快
dL = LBound(All) '取得数组的下界,由Option Base 语句控制
dU = UBound(All) '取得数组的上界
aNo = dL '保存数组下界
好了,现在我们可以给All(aNo)赋值了:
Dim dL As Long, dU As Long
Dim i as Long '这里的i强烈建议定义成Long,原因同上
dL = dL + 1 'dL要加1,这也是上面为什么要保存到aNo的原因
aL = LBound(All(aNo)) '取得要赋值数组的下界
aU = UBound(All(aNo)) '取得要赋值数组的上界
For i = dL To dU
All(aNo)(aL + i - dL) = All(i)
Next i
最后得到赋值方法:
Public Sub SetArrayData(ParamArray All())
Dim aL As Long, aU As Long, aNo As Long
Dim dL As Long, dU As Long
Dim i As Long
dL = LBound(All)
dU = UBound(All)
aNo = dL
aL = LBound(All(aNo))
aU = UBound(All(aNo))
dL = dL + 1
For i = dL To dU
All(aNo)(aL + i - dL) = All(i)
Next i
End Sub
具体应用举例:
Public gSX(0 To 11) As String
Public gWeekInfo(1 To 7) As String
Public gMonthDay(1 To 12) As Long
Public Sub SetData()
Call SetArrayData(gMonthDay(), 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
Call SetArrayData(gSX(), "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪")
Call SetArrayData(gWeekInfo(), "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")
End Sub
题后思考:
1、该赋值方法中没有错误检查,比如越界、类型不一致,该如何检查?
2、如果要赋值的数组不是从第一个开始赋,该方法该如何改?
3、为什么不用 Public Sub SetArrayData(ByRef ArrayName(), ParamArray ArrayData()) 或其他的格式呢?
这三个问题就交给你去考虑了。
我的结论:
VB看起来很简单,但它能实现的功能可以不简单。不要因为VB不能赋初值就说C好,VB有VB的方法:) |
|