将2D数组转换为1D数组

时间:2015-10-06 20:10:19

标签: excel vba

使用Application.Index(array, row, column)将范围(=多维数组)转换为单维数组时,如何解决 255个字符/ 限制?

以下截断的示例重现错误:

  

错误13.输入不匹配

(完整的代码在superuser where I tried to help another user)。

如何重现

  • 打开一个新的Excel工作表并将公式=REPT("x",256)插入单元格A1 这会创建一个长度为256个字符的字符串,对于最后一步而言只有1个字符太长

  • 打开VBA编辑器( Alt + F11 )并将以下代码粘贴到某处

  • F8

    逐行执行代码
    Function StringLengthTest()       
        Dim arr2D As Variant
        Dim arr1D As Variant        
        arr2D = Rows(1)
        arr1D = Application.Index(arr2D, 1, 0)        
    End Function
    
  • 当Excel尝试将范围(2D)转换为1D数组,而其中一个单元格的字符数超过255个时,您会在最后一行看到相同的错误。

要证明这一点,请将=REPT("x",256)更改为=REPT("x",255)并再次运行代码。这次它会起作用。

问题:我应该以另一种方式声明我的变量吗?有没有更好的方法将范围(最初始终是2D对象)转换为单维数组?

我知道我可以使用循环迭代数组并将所有2D数组值逐个保存到1D数组。但那效率不高。想象一下真的很大的床单。

1 个答案:

答案 0 :(得分:0)

到目前为止,从单元格到内存(数组)中获取任何内容的最佳方法是使用数组变体。我认为你遇到的问题是索引而不是你的方法。

希望这段代码可以解释它。

Dim v_data As Variant
Dim rw As Long, cl As Long ' for row and column
Dim arr1d() As Variant
Dim count As Long

' I'm going to use UsedRange to get the whole sheet  .UsedSheet
' If you just want things from one row or column then just spec
' activesheet.range("A1:A100") or use cells()
With ActiveSheet.UsedRange
  ReDim v_data(1 To .Rows.count, 1 To .Columns.count)
  v_data = .Value
End With

'now we have all the things from that sheet.
'so to convert to 1d array where the cell value is say = 1
For rw = LBound(v_data) To UBound(v_data)
   For cl = LBound(v_data, 2) To UBound(v_data, 2) ' note the comma 2 for the second dimension bounds.
       If v_data(rw, cl) = 1 Then
           count = count + 1
           ReDim Preserve arr1d(1 To count)
           arr1d(count) = v_data(rw, cl)
       End If
   Next cl
Next rw

For count = LBound(arr1d) To UBound(arr1d)
    Debug.Print arr1d(count)
Next count

现在的诀窍就是将其移植到一个带有几个args的函数(一个2d范围,你在该范围内寻找的东西)并返回你的列表。

将数据恢复到工作簿

ActiveSheet.Cells(1, 1).Resize(UBound(arr1d), 1).Value = arr1d

根据数组的边界设置一个完全相同的范围,然后确保在变量数组中使用.value