中易网

在Excel VBA里, 定义数组并赋值,编译错误.请高手指点.

答案:4  悬赏:20  
解决时间 2021-01-13 17:32
  • 提问者网友:孤山下
  • 2021-01-13 13:01
在Excel VBA里, 定义数组并赋值,编译错误.请高手指点.
最佳答案
  • 二级知识专家网友:洒脱疯子
  • 2021-01-13 13:45
数组赋值不能直接这样用 等于 某个单元格区域……要通过循环语句逐个赋值……考虑修改如下:
Dim aa() As Double
ReDim arr(1 To 1036)
For i = 1 To 1036
arr(i) = Cells(i, 8)
Next
Stop

由于你使用了 动态数组 所以在赋值前 必须给它一个重新设置范围的语句 ReDim……
全部回答
  • 1楼网友:神也偏爱
  • 2021-01-13 15:56
定义数组并赋
  • 2楼网友:拾荒鲤
  • 2021-01-13 15:32

自己以前学习的东西给你看一下:你给的语句如果要付值应该这样写:
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
  • 3楼网友:酒安江南
  • 2021-01-13 14:30
要一个一个地进行赋值,另外H0这个单元格是不存在的,至少从H1开始吧
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息