在Excel VBA里, 定义数组并赋值,编译错误.请高手指点.
4个回答
展开全部
自己以前学习的东西给你看一下:你给的语句如果要付值应该这样写:
Dim aa() as arr
aa()=Sheet1.Range("H0:H1036")'这里就把H0:H1036付给了aa()这个数组!已经有值,只是涉及到读取问题了,看下面的吧:
20.1 数组运行时间
Sub v4() '运行时间0.01秒
Dim t
t = Timer
For x = 1 To 100000
m = m + 1000 '真接调用内存中的值
Next x
MsgBox Timer - t
End Sub
Sub v5() '运行时间0.5秒
Dim t
t = Timer
For x = 1 To 100000
m = m + Cells(1, 1) '调用单元格中的值
Next x
MsgBox Timer - t
End Sub
20.1 什么是VBA数组
'1、什么是VBA数组呢?
'VBA数组就是储存一组数据的数据空间?数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组.
'2 VBA数组存在形态
' VBA数组是以变量形式存放的一个空间,它也有行有列,也可以是三维空间。
'1) 常量数组
'array(1,2)
'array(array(1,2,4),array("a","b","c"))
'2) 静态数组
'x(4) '有5个位置,编号从0~4
'arr(1 to 10) '有10个位置,编号1~10
'arr(1 to 10,1 to 2) '10行2列的空间,总共20个位置,这是二维数组
'arr(1 to 10,1 to 2,1 to 3) '三维数组,总10*2*3=60个位置。这是三维数组
'3)动态数组
'arr() '不知道有多少行多少列
20.2 写入数据
'1、按编号(标)写入和读取
Sub t1() '写入一维数组
Dim x As Integer
Dim arr(1 To 10)
For x = 1 To 7 '只写7个值
arr(x) = x * 10
Next x
Stop
End Sub
Sub t2() '向二维数组写入数据和读取
Dim x As Integer, y As Integer
Dim arr(1 To 5, 1 To 4)
For x = 1 To 5
For y = 1 To 4
arr(x, y) = Cells(x, y)
Next y
Next x
MsgBox arr(3, 1)
End Sub
'2、动态数组
Sub t3()
Dim arr() '动态的,不知道多少行,多少列
Dim row
row = Sheets("sheet2").Range("a65536").End(xlUp).row - 1
ReDim arr(1 To row) '这里知道多大了,用REDIM重新定议
For x = 1 To row
arr(x) = Cells(x, 1)
Next x
Stop
End Sub
'3、批量写入
Sub t4() '由常量数组导入
Dim arr
arr = Array(1, 2, 3, "a")
Stop
End Sub
Sub t5() '由单元格区域导入
Dim arr
arr = Range("a1:d5")
Stop
End Sub
21数组-读取
21.1 在内存中读取
'在内存中读取后用于继续运算,直接用下面的格式
'数组变量(5)
'数组变量(3,2)
'例:
Sub d1()
Dim arr, arr1()
Dim x As Integer, k As Integer, m As Integer
arr = Range("a1:a10") '把单元格区域导入内存数组中
m = Application.CountIf(Range("a1:a10"), ">10") '计算大于10的个数
ReDim arr1(1 To m) '为1 到5
For x = 1 To 10
If arr(x, 1) > 10 Then
k = k + 1 'K的开始值为0
arr1(k) = arr(x, 1)
End If
Next x
End Sub
21.2读取存入单元格中
'二维数组存入单元格
Sub d2() '二维数组存入单元格
Dim arr, arr1(1 To 5, 1 To 1)
Dim x As Integer
arr = Range("b2:c6")
For x = 1 To 5
arr1(x, 1) = arr(x, 1) * arr(x, 2)
Next x
Range("d2").Resize(10) = arr1
End Sub
'一维数组存入单元格
Sub d3() '一维数组存入单元格
Dim arr, arr1(1 To 5)
Dim x As Integer
arr = Range("b2:c6")
For x = 1 To 5
arr1(x) = arr(x, 1) * arr(x, 2)
Next x
'Range("a13").Resize(1, 5) = arr1'一维数组是与一个行有关系的值,就是全部值都在一行
Range("d2").Resize(5) = Application.Transpose(arr1)
End Sub
数组部分存入
Dim arr, arr1(1 To 10000, 1 To 1)
Dim x As Integer
arr = Range("b2:c6")
For x = 1 To 5
arr1(x, 1) = arr(x, 1) * arr(x, 2)
Next x
Range("d2").Resize(5) = arr1 '这个与单元格大小有关系,虽然数据很大,有10000行,但D2的RESIZE只有5行,就只填5行,但如果数组只有5行数据,想填充的单元格有10行,那么后5行,就会出错了
End Sub
22数组-大小
22.1数组的大小
'数组是用编号排序的,那么如何获得一个数组的大小呢
'Lbound(数组) 可以获取数组的最小下标(编号)
'Ubound(数组) 可以获取数组的最大上标(编号)
'Ubound(数组,1) 可以获得数组的行方面(第1维)最大上标
'Ubound(数组,2) 可以获得数组的列方向(第2维)的最大上标
Sub d6()
Dim arr
Dim k, m
arr = Range("a2:d5")
For x = 1 To UBound(arr, 1)
Next x
End Sub
22.2 动态数组的动态扩充
'如果一个数组无法或不方便计算出总的大小,而在一些特殊情况下又不允许有空位。这时我们就需要用动态的导入方法
'
'ReDim Preserve arr() 可以声明一个动态大小的数组,而且可以保留原来的数值,就相当于厂房小了,可以改扩建增大,但是它只能
'让最未维实现动态,如果是一维不存在最未维,只有一维
22.3 清空数组
'释放数组使用Erase语句
Sub d9()
Dim arr, arr1(1 To 1000, 1 To 1)
Dim x, m, k
arr = Range("a1:a16")
For x = 1 To UBound(arr)
If arr(x, 1) <> "" Then
k = k + 1
arr1(k, 1) = arr(x, 1)
Else
m = m + 1
Range("c1").Offset(0, m).Resize(k) = arr1
Erase arr1
k = 0
End If
Next x
End Sub
推荐于2017-11-25
展开全部
数组赋值不能直接这样用 等于 某个单元格区域……要通过循环语句逐个赋值……考虑修改如下:
Dim aa() As Double
ReDim arr(1 To 1036)
For i = 1 To 1036
arr(i) = Cells(i, 8)
Next
Stop
由于你使用了 动态数组 所以在赋值前 必须给它一个重新设置范围的语句 ReDim……
Dim aa() As Double
ReDim arr(1 To 1036)
For i = 1 To 1036
arr(i) = Cells(i, 8)
Next
Stop
由于你使用了 动态数组 所以在赋值前 必须给它一个重新设置范围的语句 ReDim……
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要一个一个地进行赋值,另外H0这个单元格是不存在的,至少从H1开始吧
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询