ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

   
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 149|回复: 8

[求助] 请问vba中怎么表示数组的一部分

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-5-19 11:36 | 显示全部楼层 |阅读模式
需要把一个数组中的内容赋值到表格中,我现在使用的是逐个循环的方式:
Dim arr(200) As Integer
......    '(代码略,对arr整个数组中的所有元素都进行了赋值)
For i = 2 To 100
    theSheet.Cells(i, 1) = arr(i + 1)
Next i

不知道是否有什么方式可以表示数组中的一部分元素,例如上述的:arr(3)~arr(101)?这样我就可以一次性给一串单元格(即range)赋值了。

BTW,我尝试用theSheet.Range("A2:A100") = arr(3),发现99个单元格的内容都被赋值为arr(3),与预期不符。(尝试用(3:101)、[3:101]或{3:101}等,都提示错误)
网上搜了一下,也没找到怎么表示数组的一部分元素的方法。

谢谢!

TA的精华主题

TA的得分主题

发表于 2019-5-19 11:47 | 显示全部楼层
你循环里不就是取的一部分?如果数组是满的,那么应该有200个,你才取了99个而已

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-5-19 12:16 | 显示全部楼层
因为需要赋值的单元格很多,每次都只对一个单元格赋值(给cells赋值),程序运行时间比较长。所以想看看能否一次性对一串连续的单元格赋值(给range赋值)。

BTW,实际需求中,这个数组的不同元素有不同的含义,不是整个数组都需要赋值到单元格中。(我是从文本文件中读取的内容,再通过split得到数组,取其中一部分内容赋值excel的单元格中。数据量大时,需要读取几万次内容,每次取几十个数据赋值到单元格中。程序运行时间有点长。)

TA的精华主题

TA的得分主题

发表于 2019-5-19 12:17 | 显示全部楼层
本帖最后由 西瓜9527 于 2019-5-19 12:21 编辑

Range("A2:A100") = arr(3)-------arr(3)代表的是元素,所以A2:A100肯定是同一个数字

Sub aa()
'定义数组
Dim arr(1 To 200)
'把A1:A200写入数组
For i = 1 To 200
    arr(i) = Cells(i, 1)
Next
'把数组中的3-101写入到B2:B100
j = 2
For i = 3 To 101
    Cells(j, 2) = arr(i)
    j = j + 1
Next
End Sub

TA的精华主题

TA的得分主题

发表于 2019-5-19 12:19 | 显示全部楼层
borisexcel 发表于 2019-5-19 12:16
因为需要赋值的单元格很多,每次都只对一个单元格赋值(给cells赋值),程序运行时间比较长。所以想看看能 ...

几万个数组元素中你想每次读取其中的几十个数,说明你在没读取之前应该知道这些将被读取的元素的特征(数组的位置),你完全可以用循环来了读取这部份元素。

TA的精华主题

TA的得分主题

发表于 2019-5-19 12:27 | 显示全部楼层
borisexcel 发表于 2019-5-19 12:16
因为需要赋值的单元格很多,每次都只对一个单元格赋值(给cells赋值),程序运行时间比较长。所以想看看能 ...

看了你的新需求,我修改了一下
Sub aa()
'定义数组
Dim arr(1 To 200)
'把A1:A200写入数组
For i = 1 To 200
    arr(i) = Cells(i, 1)
Next
'把arr数组中的3-101写入到brr
Dim brr(1 To 99)
j = 1
For i = 3 To 101
    brr(j) = arr(i)
    j = j + 1
Next
'写入单元格
[B2].Resize(UBound(brr), 1) = Application.Transpose(brr)
End Sub

TA的精华主题

TA的得分主题

发表于 2019-5-19 12:32 | 显示全部楼层
定义一个新数组,循环把需要的数据赋值给新数组,然后再一次写入单元格

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-5-19 15:21 | 显示全部楼层
西瓜9527 发表于 2019-5-19 12:27
看了你的新需求,我修改了一下
Sub aa()
'定义数组

搞定了,谢谢!

尝试过程发现,一方面需要使用Transpose转置(如果是给一行单元格赋值就不需要转置);另一方面是需要新定义一个数组放需要赋值的数(为什么vba不能直接从数组中间某个元素开始取随后的一段内容呢?)

TA的精华主题

TA的得分主题

发表于 2019-5-19 18:10 | 显示全部楼层
SUB  AAA()
DIM X AS OBJECT
Set x = CreateObject("msscriptcontrol.scriptcontrol")
x.Language = "javascript"
arr = Array("aa", "BB", "CC", "DD", "EE")
kk = Join(arr, ",")
s1 = 0 '开始位置
s2 = 2 '结束位置'
x.addcode "function aa(bb){x=bb.split(',').slice(" & s1 & "," & s2 + 1 & ");return x;}"
cc = x.eval("aa('" & kk & "')")
Cells(1, 1).Resize(UBound(Split(cc, ",")) + 1, 1) = Application.Transpose(Split(cc, ","))
END SUB

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

本版积分规则

关闭

最新热点上一条 /1 下一条

关注官方微信,高效办公专列,每天发车

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

GMT+8, 2019-6-20 07:20 , Processed in 0.094288 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Wooffice Inc.

   

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

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

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