Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA中将范围分配给数组_Vba_Excel - Fatal编程技术网

在VBA中将范围分配给数组

在VBA中将范围分配给数组,vba,excel,Vba,Excel,真的很新,自学成才,所以非常感谢您的帮助 已分配从电子表格到数组的范围,但该范围从数组的第1行开始 Dim arr As Variant arr = Range("DATA") 有没有办法从第0行开始? 提前感谢范围操作很慢,最好使用临时阵列,然后在更改开始位置的同时复制到另一个阵列。 实际上,数组->数组=非常快 Dim arr, arr2 As Variant arr2 = Range("DATA").value2 redim arr(0 to ubound(arr2)-1, 0 to u

真的很新,自学成才,所以非常感谢您的帮助

已分配从电子表格到数组的范围,但该范围从数组的第1行开始

Dim arr As Variant
arr = Range("DATA")
有没有办法从第0行开始?
提前感谢

范围操作很慢,最好使用临时阵列,然后在更改开始位置的同时复制到另一个阵列。 实际上,数组->数组=非常快

Dim arr, arr2 As Variant
arr2 = Range("DATA").value2
redim arr(0 to ubound(arr2)-1, 0 to ubound(arr2,2)-1)
for i= 0 to ubound(arr2)-1
for j= 0 to  ubound(arr2,2)-1
arr(i,j)= arr2(i+1,j+1)
next
next

那么,如果要清理范围派生的VBA数组,为什么不在处理列范围或行范围时将其设置为一维而不是虚假的二维呢?以下内容将此作为默认设置,并将基于0的设置作为默认设置,但提供了覆盖这两个默认设置的方法:

Function RangeToArray(R As Range, Optional b As Long = 0, Optional collapse As Boolean = True) As Variant
    'returns a b-based array of the values in R
    'if the Range is 1-dimensional and collapse is true, the array returned is 1-dimensional
    Dim i As Long, j As Long, m As Long, n As Long, k As Long
    Dim vals As Variant, arr As Variant

    m = R.Rows.Count
    n = R.Columns.Count
    If m = 1 And n = 1 Then 'to catch an edge-case
        ReDim vals(1 To 1, 1 To 1)
        vals(1, 1) = R.Value
    Else
        vals = R.Value
    End If
    If collapse And (m = 1 Or n = 1) Then
        k = Application.WorksheetFunction.Max(m, n)
        ReDim arr(b To b + k - 1)
        For i = 1 To k
            If m = 1 Then
                arr(b + i - 1) = vals(1, i)
            Else
                arr(b + i - 1) = vals(i, 1)
            End If
        Next i
    Else
        ReDim arr(b To b + m - 1, b To b + n - 1)
        For i = 1 To m
            For j = 1 To n
                arr(b + i - 1, b + j - 1) = vals(i, j)
            Next j
        Next i
    End If
    RangeToArray = arr
End Function

它的用法类似于
A=RangeToArray(Range(“A1:B3”)

您必须循环遍历每个单元格,并将值分配给数组的项。当您将范围直接分配给变量时,数组将从项目1开始。否,请不要。Range->array的速度非常慢,你在循环中完成它,而这是可能的(并且@Pierre的答案显示了这样做的有效方式)——为什么要费心呢?Excel VBA代码需要定期与范围交互,因此最好尝试将您的编码样式与VBA对象模型的工作方式相匹配。有经验的VBA程序员通常会编写函数/子函数,这些函数/子函数设计用于使用
LBound
Ubound
函数处理数组,以获得处理数组的循环边界,而不是坚持所有馈送到函数/子函数的数组都是基于0或基于1的。最好编写与base无关的代码。确实是@JohnColeman。最好还是接受VBA的工作原理。:-)谢谢-我正在使用另一个数组,该数组使用0base,因此尝试将两者对齐以使其相同。“不过,完全理解你的意思。”皮埃尔观察得很好。我添加了代码来防范它。谢谢,谢谢,我有很多东西要学。当然,有更好的方法来实现我所得到的结果,但这只是开始。感谢您的回复和宝贵时间