ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8848|回复: 10

[求助] 请问怎样给数组赋值?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-5-20 22:31 | 显示全部楼层 |阅读模式
请问:
怎样给数组赋上一个 1 到 100 的值, 谢谢

TA的精华主题

TA的得分主题

发表于 2010-5-20 22:48 | 显示全部楼层
dim arr(a to 100)
for i=1 to 100
arr(i)=i
next i

arr = [row(1:100)] '这个也可以

[ 本帖最后由 cflood 于 2010-5-20 22:50 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-5-20 22:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-5-20 23:02 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-21 10:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-5-21 10:51 | 显示全部楼层
我是用的一个达人的函数来完成这一功能。我一直都用这个函数。。与各位分享。。

转自: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的方法:)

TA的精华主题

TA的得分主题

发表于 2010-5-21 11:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个函数不错,学习了。

TA的精华主题

TA的得分主题

发表于 2010-5-21 16:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-5-21 16:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 leongenius 于 2010-5-21 10:51 发表
我是用的一个达人的函数来完成这一功能。我一直都用这个函数。。与各位分享。。

转自:http://www.moon-soft.com/program/bbs/readelite252123.htm
如何给数组一次性赋值

假设我要做这样一个功能,就是告诉用 ...

Array函数不是有这功能?

TA的精华主题

TA的得分主题

发表于 2012-10-27 11:04 | 显示全部楼层
我一般把要赋的值写在表里面,然后依次去读这些cells
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-16 11:00 , Processed in 0.024589 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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