Excel VBA:范围到string数组在1步

我知道你可以很容易地获取一系列的单元格,并将它们放入一个Variant数组中,但是我想使用一个string数组(因为它是单维的,并且占用的内存比Variant数组less)。

有没有办法自动将范围转换为string数组?

现在,我正在使用一个函数,它将采用范围并将值保存在variables数组中,然后将variables数组转换为string数组。 它工作得很好,但我正在寻找一种方式直接从范围到string数组。 任何帮助将不胜感激。

Function RangeToArray(ByVal my_range As Range) As String() Dim vArray As Variant Dim sArray() As String Dim i As Long vArray = my_range.Value ReDim sArray(1 To UBound(vArray)) For i = 1 To UBound(vArray) sArray(i) = vArray(i, 1) Next RangeToArray = sArray() End Function 

更新:这看起来像没有办法跳过将数据转换为一维string数组之前,将数据放入一个variables数组的步骤。 如果是真的,那真可惜(即使不需要太多的努力,我也喜欢超优化,所以我希望有一种方法可以跳过这一步)。 如果没有解决办法,我会在几天内解决这个问题。 感谢有用的评论,伙计!

更新2:回答西蒙谁付出了很大的努力(所有其他人也一样),并指出从一个镜头范围到string排列确实是不可能的。 感谢大家。

怎么样…

 Public Function RangeToStringArray(theRange As Excel.Range) As String() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a string array for them Dim stringValues() As String ReDim stringValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 stringValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the string array RangeToStringArray = stringValues End Function 

实际上,您可以直接使用函数Split,Join和分隔符(不在文本中)从一个范围直接到数组。

假设您已经将一个1D范围的值指定为SrcRange

 Dim Array() As String: Array = Split(Join(Application.Transpose(SrcRange), "#"), "#") 
 Function RangeToStringArray(myRange as range) as String() ReDim strArray(myRange.Cells.Count - 1) As String Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToStringArray = strArray End sub 

如果你不介意改变剪贴板的内容,那么:

  1. 使用复制方法将范围复制到剪贴板:

     MyTargetRange.Copy 
  2. 将剪贴板中的内容复制到一个stringvariables(search此站点或其他位置,以便将string传递到剪贴板)。

  3. 将string分割成一个变体数组:

     MyStringArray = Split(MyClipboardText, vbCrLf) 
  4. 可选:该数组将有一个额外的空白元素,因为在刚刚复制到剪贴板的文本末尾总是会有一个额外的Return(vbCrLf)。 删除只需调整数组的大小:

     Redim Preserve MyStringArray(Ubound(MyStringArray) - 1) 

非常简单快捷!

缺点是剪贴板可能会改变,当你最不期待(重新计算过程中),它只会产生string(不是双打或其他数值types)的数组。

如果您正在处理大量使用相同数据(数千个数据点)的重复函数(数千个),这将非常有帮助。 第一次调用函数时,对所需数据范围进行所有中间计算,并将结果保存在静态variables中。 还要通过剪贴板保存input范围的string副本。 随着每个随后的函数调用,再次通过剪贴板将input范围转换为文本,并与保存的副本进行比较。 如果他们是相同的,你可能会绕过你的初步计算的分配。

VBA中使用的命名范围已经是数组。 因此,首先将范围转换为指定的范围,然后引用它并删除指定的范围。 例如:

 ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10") a = Sheet1.Range("test_array") ThisWorkbook.Names("test_array").Delete