我有一个函数用于返回从单列数据列表创建的数组。我一直在使用这个函数的返回值,本质上它是一个伪全局变量(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
也会。为什么不把它当作1x1数组而不是自由值呢?我已经开始通过在被调用的地方重写函数来减轻问题,检查它是否是数组,然后执行其他过程。事情是这样:
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
函数来处理。有没有办法返回1x1数组?或者其他解决方法?
Jeeped钉它。您只创建Variant,然后让VBA决定数据类型究竟是什么(因此Variant)。 VBA决定只有一个元素的值不是一个数组,并且可能将其转换为一个String。如果您专门创建了一个数组,那么将该函数的返回值设置为该数组,它将是一个数组,即使它只有一个元素。 – Tim
谢谢,这很好。如果没有循环,这也是不可能的?我宁愿只分配一个全范围来代替,除非速度差异很小。 – teepee
@teepee - 如果存在多个值,则可以将该函数重写为批量装入值,但也必须将该单个元素数组创建为1至1,而不是0至0.从多个装入数组工作表上的单元格总是创建一个二维数组,即使第二个等级只有1到1 var =范围(B2:B5)为1到4,1到1. var =范围(C3:F3)为1到1,1到4.目前正在构建的数组基于零和一个维度。你不必转置它。如果有几千条,这将是值得的,但我不认为这是事实。 – Jeeped