当范围只包含一个值时,函数不会返回数组
我有一个函数意味着返回一个数组,它是由单列数据列表创build的。 我一直在使用这个函数的返回值本质上是一个伪全局variables( LINENAMES_ARRAY
),我传递给许多函数。 那些函数比对它做检查,比如If Len(Join(LINENAMES_ARRAY)) = 0 Then
或者用For Each
语句去检查项目。 这里是代码:
Function LINENAMES_ARRAY() As Variant 'returns an array of all items in the main sheet linenames column LINENAMES_ARRAY = Application.Transpose(MAIN.Range( _ MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _ MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN))) End Function
我最近偶然发现了其中的一个,那就是,当你使用这个工作簿的时候,如果这个数组碰巧只有一个元素,那么一切都会失败。 显然在这种情况下,这将返回一个单一的值,所以Join()
将失败For Each __ in LINENAMES_ARRAY
将。 为什么不把它当作一个1×1数组而不是一个自由的值呢? 我已经开始通过在被调用的地方重写函数来缓解这个问题,检查它是否是一个数组,然后执行一些其他的过程。 像:
For j = 1 To LINENAMES_COUNT LINES_BOX.AddItem lineNames(j) Next j
更改为:
If Not IsArray(LINENAMES_ARRAY) Then myListBox.AddItem CStr(LINENAMES_ARRAY) Else For j = 1 To LINENAMES_COUNT LINES_BOX.AddItem LINENAMES_ARRAY(j) Next j End If
然而,这变得混乱,并添加了许多额外的检查,我宁愿在LINENAMES_ARRAY
函数中处理我的代码。 有没有办法返回1×1数组? 或者其他解决方法?
如果将数组创build为单个元素数组并将其以数组方式填充,则数组可以具有单个元素。
Option Explicit Dim MAIN_HEAD_COUNT As Long Dim LINENAMES_COUNT As Long Dim MAIN_LINENAMES_COLUMN As Long Dim MAIN As Worksheet Sub stuff() Dim arr As Variant Set MAIN = Worksheets("Sheet1") MAIN_LINENAMES_COLUMN = 2 MAIN_HEAD_COUNT = 2 LINENAMES_COUNT = 2 arr = LINENAMES_ARRAY() Debug.Print IsArray(arr) Debug.Print LBound(arr) & ":" & UBound(arr) End Sub Function LINENAMES_ARRAY() As Variant Dim a As Long, tmp() As Variant ReDim tmp(0 To LINENAMES_COUNT - MAIN_HEAD_COUNT) For a = 0 To LINENAMES_COUNT - MAIN_HEAD_COUNT tmp(a) = MAIN.Range(MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _ MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN)).Cells(a).Value2 Next a 'returns an array of all items in the main sheet linenames column LINENAMES_ARRAY = tmp End Function
VBE 立即窗口的结果 :
True 0:0