将范围转换为数组

时间:2018-10-12 05:51:51

标签: excel vba excel-vba

我的代码有问题。我想获取所有单元格并将它们放在数组中,但是没有用。运行时错误13。 范围->数组

For z = 0 To 3
Worksheets(Tabellen(z)).Select
AnzahlZellen = Application.WorksheetFunction.CountA(Range("A:A"))
    For n = 1 To AnzahlZellen

        'Worksheets(Tabellen(z)).Select'
        Range("A" & n).Select
        InhaltsArray(n) = Range("A" & n).Value

3 个答案:

答案 0 :(得分:0)

在这种情况下,您可以构建一个一维数组

Dim vDat as variant
Dim rg as range
Set rg = Range("A1:A" & AnzahlZellen)
vDat = WorksheetFunction.Transpose((rg))

通过这种方式,您可以轻松地从一系列单元格读取数组。您也可以从数组写入单元格区域。通常您会得到一个2D数组,但是由于只有一列,因此可以通过转置将其转换为1D数组。

由于您没有显示InhaltsArray的声明,所以我猜run time error 13是由该范围的某些内容引起的,该内容不适合InhaltsArray的数据类型

作为代码的附加注释:大多数情况下,您不需要select

答案 1 :(得分:0)

您似乎正在尝试将4个工作表的A列值存储到一个一维数组中,

dim i as long, n as long, z as long, tmp as variant

for z=lbound(Tabellen) to ubound(Tabellen)

    with Worksheets(Tabellen(z))
        if z=lbound(Tabellen) then
            InhaltsArray = application.transpose(.range(.cells(1, "A"), .cells(.rows.count, "A").end(xlup)).value2
        else
            tmp = .range(.cells(1, "A"), .cells(.rows.count, "A").end(xlup)).value2
            i = ubound(InhaltsArray)
            redim preserve InhaltsArray(lbound(InhaltsArray) to (i + ubound(tmp, 1)))
            for n = lbound(tmp, 1) to ubound(tmp, 1)
                InhaltsArray(i + n) = tmp(n, 1)
            next n
        end if

    end with

next z

答案 2 :(得分:0)

@Storax 提交的答案是以下代码的基础,它定义了函数 rangeToArray,它将接受一个 Range 对象并返回一个等效的 array

Function rangeToArray(rg As Range)
  If rg.Count = 1 Then
    rangeToArray = Array(rg(1))
  Else
    rangeToArray = WorksheetFunction.Transpose(rg)
  End If
End Function

可以这样使用:

Sub test()
  Dim lastRowInA As Long, i As Integer

  Dim a()

  lastRowInA = WorksheetFunction.CountA(Range("A:A"))
  
  a = rangeToArray(Range("A1:A" & lastRowInA))

  For i = 1 To lastRowInA
    Debug.Print a(i)
  Next

End Sub

仅当 if 可以包含单个单元格时,才需要 rangeToArray 中的 rg

此外,如果 A 没有填充行,则在使用 lastRowInA(即 0)定义传递给rangeToArray 的范围时会导致错误。

来自 Storax 的单行代码(如下所示并在函数 Else 中的 rangeToArray 中进行了改编)是解决问题的绝妙而简单的关键。

vDat = WorksheetFunction.Transpose((rg))