如何在下面的给定代码中重新维度数组

时间:2013-03-10 22:12:40

标签: excel-vba vba excel

我需要按照以下方式扩展数组。 搜索了答案,但似乎没有任何帮助,如下面的代码。

Sub MakeOneColumn()

Dim vaCells As Variant
Dim vOutput() As Variant
Dim i As Long, j As Long
Dim lRow As Long

If TypeName(Selection) = "Range" Then
    If Selection.Count > 1 Then
        If Selection.Count <= Selection.Parent.Rows.Count Then
            vaCells = Selection.Value

            ReDim vOutput(1 To UBound(vaCells, 1) * UBound(vaCells, 2), 1 To 1)

            For j = LBound(vaCells, 2) To UBound(vaCells, 2)
                For i = LBound(vaCells, 1) To UBound(vaCells, 1)
                    If Len(vaCells(i, j)) > 0 Then
                        lRow = lRow + 1
                        vOutput(lRow, 1) = vaCells(i, j)
                    End If
                Next i
                lRow = lRow + 1
            Next j

            Selection.ClearContents
            Selection.Cells(1).Resize(lRow).Value = vOutput
        End If
    End If
End If

End Sub

上面的代码没有添加行“lRow = lRow + 1”。但是,我需要为数组中的每一列添加一个空行。使用添加的行,我得到运行时错误9,下标超出范围。

2 个答案:

答案 0 :(得分:1)

请将您的redim声明更改为

  ReDim vOutput(1 To (UBound(vaCells, 1) * UBound(vaCells, 2)) + UBound(vaCells, 2), 1 To 1)

答案 1 :(得分:0)

您收到错误是因为您正在迭代lrow两次,一次在i循环中,一次在j循环中。如果检查,您应该发现只有在选择中的所有单元格中都有值时才会出现错误。

修复在j和i循环之外设置lrow的初始值,然后在之后迭代,将当前单元格的值赋值给vOutput。它看起来像这样:

  lRow = 1
  For j = LBound(vaCells, 2) To UBound(vaCells, 2)
      For i = LBound(vaCells, 1) To UBound(vaCells, 1)
          If Len(vaCells(i, j)) > 0 Then
              vOutput(lRow, 1) = vaCells(i, j)
              lRow = lRow + 1
          End If
      Next i
  Next j

顺便说一句,我会注意到你不需要TypeName测试,因为选择总是类型为Range。